Raspberry Pi使用DHT22+LCD16x2采集温湿度报NoneType格式错误如何解决
树莓派DHT22温湿度采集报错解决方案
报错原因
你遇到的TypeError: unsupported format string passed to NoneType.__format__错误根因如下:
- DHT22为单总线协议传感器,易受线路干扰、接触不良、供电波动影响导致单次读取失败,
Adafruit_DHT.read_retry接口读取失败时会返回(None, None),空值无法直接用0.1f浮点数格式串做格式化处理 - 你的代码还存在两处基础语法问题:没有用
try块包裹主逻辑就直接写了except KeyboardInterrupt捕获,且全代码缩进混乱,不符合Python语法规范,即使解决格式问题也无法正常运行
修复方案
直接替换为修正后的代码即可,代码新增了读取失败的容错逻辑,修正了语法和缩进问题:
import drivers # 导入自定义LCD显示驱动 import socket import struct import fcntl import time import os import re from time import sleep import Adafruit_DHT DHT_PIN = 4 disp = drivers.Lcd() # 初始化LCD显示屏 def tempcpu(): for _ in range(5): # 读取CPU温度 cputemp = os.popen("vcgencmd measure_temp").readline() celsius = re.sub("[^0123456789\.]", "", cputemp) # 读取DHT22温湿度 h,t = Adafruit_DHT.read_retry(Adafruit_DHT.DHT22, DHT_PIN) # 显示内容容错处理 disp.lcd_display_string("CpuRpi: {}C".format(celsius), 1) if h is not None and t is not None: disp.lcd_display_string("T={0:0.1f}C H={1:0.1f}%".format(t,h), 2 ) else: disp.lcd_display_string("Sensor read failed!", 2) sleep(1) if __name__ == "__main__": try: while True: tempcpu() disp.lcd_clear() except KeyboardInterrupt: # 按下Ctrl+C时清理退出 disp.clear() sleep(1) disp.backlight(0) exit()
额外排查建议
如果频繁出现传感器读取失败提示,可按以下顺序排查硬件问题:
- 检查DHT22的VCC是否接3.3V(接5V有概率烧毁传感器或导致读取不稳定)
- 检查数据引脚是否接对GPIO4(物理引脚为7号),是否松动
- 可在数据引脚和VCC之间串联一个4.7K~10K的上拉电阻增强信号稳定性
- 避免传感器线路和强电线路并行走线减少干扰
内容的提问来源于stack exchange,提问作者degupukas
相关产品推荐
相关产品推荐

