Python报错‘int’ object is not iterable:树莓派向Ubidots传传感器值遇问题
解决向Ubidots发送传感器数据时的
'int' object is not iterable错误 嘿,我一眼就看出问题出在哪了!你遇到的这个报错,是因为**requests.post()方法无法直接接收单个整数作为请求体**——它期望的是可迭代的类型(比如字典、列表或者JSON字符串),而你直接把从ADC读取到的整数m传了进去,自然就触发了TypeError。
错误根源分析
看你的代码里这一行:
r = requests.post('http://things.ubidots.com/api/v1.6/devices/raspberry/?token={A1E-6l4DwwC86SDR6QRTJWXGDwshTGPHFl}', m)
这里的第二个参数m是adc.read_adc()返回的整数,而requests.post会把这个参数当作data来处理,尝试遍历它的内容,整数显然不能被遍历,所以报错了。
Ubidots的API要求我们把传感器数据包装成键值对的字典,键就是你在平台上要创建的变量名(比如"soil-moisture"),值就是传感器读取到的数值。
修正后的代码
我帮你调整了代码,把数据格式改成Ubidots要求的样子,同时优化了异常处理:
import time import sys import traceback from time import sleep import requests import Adafruit_ADS1x15 # Create an ADS1115 ADC (16-bit) instance. adc = Adafruit_ADS1x15.ADS1115() GAIN = 1 # 替换成你的Ubidots Token UBIDOTS_TOKEN = "A1E-6l4DwwC86SDR6QRTJWXGDwshTGPHFl" # Ubidots API 端点 UBIDOTS_URL = f"http://things.ubidots.com/api/v1.6/devices/raspberry/?token={UBIDOTS_TOKEN}" print('Reading ADS1x15 values, press Ctrl-C to quit...') try: while True: # 读取传感器数值 m = adc.read_adc(0, gain=GAIN) # 把数值包装成符合Ubidots要求的字典 payload = {"soil-moisture": m} # 使用json参数传递数据,requests会自动处理格式 r = requests.post(UBIDOTS_URL, json=payload) # 打印响应状态码,方便排查问题 print(f'Moisture Level:{0:>6} | Ubidots Response: {r.status_code}'.format(m)) time.sleep(1) except KeyboardInterrupt: print("\n程序被用户中断") except Exception as e: traceback.print_exc()
关键修改点
- 将传感器数值
m放入字典payload中,键名"soil-moisture"可以根据你的需求修改,这个名字会同步到Ubidots平台的变量列表里 - 使用
requests.post()的json参数传递数据,这样requests会自动把字典序列化成JSON格式,并设置正确的Content-Type请求头,符合Ubidots的API要求 - 把Token和URL单独提取出来,方便后续维护
- 添加了响应状态码的打印,方便你排查API请求是否成功(状态码200表示成功)
这样修改后,你的代码就能正确把传感器数据发送到Ubidots平台啦!
内容的提问来源于stack exchange,提问作者Tia
相关产品推荐
相关产品推荐

