You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:29:02