首页 > 解决方案 > TypeError:不支持的格式字符串传递给 NoneType.__format__ 用于 python 中的树莓项目

问题描述

   hello,
    I have a DHT22 that turn on/off some GPIOs depending of my temperature.
    The problem is that when i reach 25 degrees, my script crashes and I receive this error:

TypeError: unsupported format string passed to NoneType.__format__ 

关于这一行:打印(“温度={0:0.1f}*C湿度={1:0.1f}%”.format(温度,湿度));

谁能帮我解决这个问题?我无法修复它。我已经尝试了这么久...非常感谢

import RPi.GPIO as GPIO
import time
import Adafruit_DHT

DHT_sensor = Adafruit_DHT.DHT22
DHT_PIN = 4

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(18,GPIO.OUT)
GPIO.setup(21,GPIO.OUT)
GPIO.setup(23,GPIO.OUT)

while True:
    time.sleep(3),
    humidity, temperature  = Adafruit_DHT.read_retry(DHT_sensor, DHT_PIN)
    print ("Temp={0:0.1f}*C humidity={1:0.1f}%".format(temperature, humidity));
    if temperature > 25:
       print ("vanne ouverte")
       print ("boiler en fonctionnement")
       print ("ventilateur désactivé")
       print ("circulateur en fonctionnement")
       GPIO.output(18,GPIO.HIGH)
       GPIO.output(21,GPIO.HIGH)
       GPIO.output(23,GPIO.HIGH)

    else:
       print ("vanne fermée")
       print ("boiler à l'arrêt")
       print ("ventilateur activé")
       print ("circulateur à l'arrêt")
       GPIO.output(18,GPIO.LOW)
       GPIO.output(21,GPIO.LOW)
       GPIO.output(23,GPIO.LOW)
GPIO.cleanup()

标签: python

解决方案


底层库并非一直都能成功读取。当它放弃时,它只返回 None。不过,这不是一个真正的问题,您每 3 秒阅读一次,另一个机会就在拐角处。

您应该只在它们有效后处理这些值。你可以这样做:

while True:
    time.sleep(3),
    humidity, temperature  = Adafruit_DHT.read_retry(DHT_sensor, DHT_PIN)
    if temperature is not None and humidity is not None:
        print("Temp={0:0.1f}*C humidity={1:0.1f}%".format(temperature, humidity));
        if temperature > 25:
           print ("vanne ouverte")
           print ("boiler en fonctionnement")
           print ("ventilateur désactivé")
           print ("circulateur en fonctionnement")
           GPIO.output(18,GPIO.HIGH)
           GPIO.output(21,GPIO.HIGH)
           GPIO.output(23,GPIO.HIGH)
    
        else:
           print ("vanne fermée")
           print ("boiler à l'arrêt")
           print ("ventilateur activé")
           print ("circulateur à l'arrêt")
           GPIO.output(18,GPIO.LOW)
           GPIO.output(21,GPIO.LOW)
           GPIO.output(23,GPIO.LOW)

然后你可以添加更多的错误处理,比如连续计算错误,如果它变得太大,做一些更激烈的事情。

如果您曾经在过程中使用湿度进行测试,您也应该这样做。我有一个读取湿度和温度的传感器,湿度读数总是失败(30% 的时间),但读数仍然每分钟多次出现。


推荐阅读