下面的代码应该从连接到 Raspberry Pi Pico WH 的电容式传感器连接遥测土壤湿度数据并将其发送到 ThingsBoard 云,但当我运行它时,它显示“‘NoneType’类型的对象没有 len()” Thonny IDE 的 shell 中出现错误。
main.py
from machine import ADC, Pin
import umqtt.robust as mqtt
import json
import utime
import urequests
import network, time
import os
# Soil moisture sensor reading setup
soil = ADC(Pin(26))
min_moisture = 29799
max_moisture = 46059
# Data sending interval in seconds
delay_seconds = 5
# Configure WiFi connection details
ssid = "WIFI_NAME"
password = "WIFI_PASS"
# Function to read sensor data
def read_moisture():
while True:
moisture = (max_moisture-soil.read_u16())*100/(max_moisture-min_moisture)
print("moisture: " + "%.2f" % moisture +"% (adc: "+str(soil.read_u16())+")")
return moisture
# Function to connect to WiFi
def connect_wlan():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
while not wlan.isconnected():
print("Connecting to WiFi...")
wlan.connect(ssid, password)
utime.sleep(2)
print("Connected to WiFi")
return wlan
def send_data_to_thingsboard(moisture_value):
try:
client = mqtt.MQTTClient(client_id='CLIENT_ID', server='thingsboard.cloud', port=1883, user='ACCESS_TOKEN')
client.connect()
data = {"moisture": moisture_value}
client.publish("v1/devices/me/telemetry", json.dumps(data))
client.disconnect()
print(f"Data sent to ThingsBoard: {moisture_value}")
except Exception as e:
print(f"Error sending data: {e}")
def main():
wlan = connect_wlan()
data_queue = []
while True:
try:
moisture = read_moisture()
data_queue.append(moisture)
if wlan.isconnected() and data_queue:
while data_queue:
moisture_value = data_queue.pop(0)
send_data_to_thingsboard(moisture_value)
except OSError as e:
print(f"WiFi connection lost: {e}")
wlan = connect_wlan() # Attempt to reconnect
time.sleep(1)
if __name__ == "__main__":
main()
`` `
Thonny 中的 Shell 显示:
Connected to WiFi moisture: -1.97% (adc: 46411) Error sending data: object of type 'NoneType' has no len()
似乎无法弄清楚出了什么问题。有什么建议欢迎提出,谢谢!
错误信息“‘NoneType’ 类型的对象没有 len()”意味着你正在尝试获取 NoneType 对象的长度,但 NoneType 对象没有长度。这通常发生在你期望一个字符串或列表之类的东西但实际上得到了 None 时。
在你的代码中,错误发生在
client.publish("v1/devices/me/telemetry", json.dumps(data))
这一行。看来根本原因在于
json.dumps(data)
返回 None,导致错误。这可能是由于
data
变量包含无法序列化为 JSON 的数据类型导致的。
为了解决此问题,你应该检查
data
变量的内容。
-
检查数据类型:
确认
moisture_value
确实是数字或浮点数。你可以通过在send_data_to_thingsboard
函数中添加以下行来打印其类型和值进行检查:
print(f"Moisture value type: {type(moisture_value)}")
print(f"Moisture value: {moisture_value}")
-
处理潜在的 None 值:
read_moisture()
函数可能返回 None,导致在尝试创建 JSON 负载时出现问题。你可以通过在将数据追加到队列之前检查返回值来解决此问题:
moisture = read_moisture()
if moisture is not None:
data_queue.append(moisture)
-
检查
json.dumps()
的结果: 确认json.dumps(data)
返回有效的 JSON 字符串。你可以通过在send_data_to_thingsboard
函数中添加以下行来打印其结果进行检查:
json_data = json.dumps(data)
print(f"JSON data: {json_data}")
client.publish("v1/devices/me/telemetry", json_data)
通过仔细检查这些点,你应该能够识别出问题的根源并有效地解决“‘NoneType’ 类型的对象没有 len()”错误。
标签:python,mqtt,raspberry-pi-pico,thingsboard From: 78796397