【问题标题】:Why am I getting a NoneType error in the second repetition of a loop?为什么在循环的第二次重复中出现 NoneType 错误?
【发布时间】:2018-01-03 04:55:12
【问题描述】:

我正在编写一个循环来连续读取两个传感器的读数。但是,每次第二次重复时我都会收到此错误。我正在使用 DHT22 传感器,并使用 pigpio 库。

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.2/tkinter/__init__.py", line 1426, in __call__
    return self.func(*args)
  File "/usr/lib/python3.2/tkinter/__init__.py", line 490, in callit
    func(*args)
  File "/home/pi/pigpio_dht22/TempHumSensorDisplayWindow3.py", line 42, in loop
    humidity, tempb = readDHT22()
  File "/home/pi/pigpio_dht22/TempHumSensorDisplayWindow3.py", line 34, in readDHT22
    s.trigger()
  File "/home/pi/pigpio_dht22/DHT22.py", line 230, in trigger
    self.pi.write(self.gpio, pigpio.LOW)
  File "/usr/local/lib/python3.2/dist-packages/pigpio.py", line 1381, in write
    return _u2i(_pigpio_command(self.sl, _PI_CMD_WRITE, gpio, level))
  File "/usr/local/lib/python3.2/dist-packages/pigpio.py", line 983, in _pigpio_command
    sl.s.send(struct.pack('IIII', cmd, p1, p2, 0))
AttributeError: 'NoneType' object has no attribute 'send'

这是我的代码:

from tkinter import *
import time
import Adafruit_GPIO.SPI as SPI
import Adafruit_MAX31855.MAX31855 as MAX31855
import datetime
import pigpio
from time import sleep
pi = pigpio.pi()
import DHT22

CLK = 25
CS  = 24
DO  = 18
sensor = MAX31855.MAX31855(CLK, CS, DO)
s = DHT22.sensor(pi, 4)



master = Tk()
master.wm_title('Ethane Pot Temp')
lab = Label(master, width=25)
labb = Label(master, width=25)
Label(master, width=25, text='Ethane Pot Temperature').grid(row=1, column=1)
Label(master, width=25, text='Chamber Humidity').grid(row=2, column=1)
lab.grid(row=1, column=2)
labb.grid(row=2, column=2)
temp = sensor.readTempC()
tempa = StringVar()
s.trigger()


def readDHT22():
    #Get a new reading
    s.trigger()
    #Save our value
    humidity = '%.2f' % (s.humidity())
    tempb = '%.2f' % (s.temperature())
    return (humidity, tempb)

def loop():
    sleep(.03)
    humidity, tempb = readDHT22()
    print(tempb)
    print(humidity)
    temp = sensor.readTempC()
    tempa.set(str(temp))
    lab.config(text=tempa.get())
    master.after(2000, loop)

loop()
s.cancel()
pi.stop()
master.mainloop()    

我使用的是 tkinter 窗口,因此不能使用 while True 作为循环。

任何帮助将不胜感激。

【问题讨论】:

  • 我对任何事情都不知道,但有没有可能在第一次阅读后关闭?您只调用此temp = sensor.readTempC() 一次的事实看起来可疑...好像您必须在循环的每次迭代中都这样做?再说一遍:我不知道 TkInter 或你的传感器或者......什么都没有,但这是我以前见过的一种行为,比如套接字之类的东西。
  • 感谢您的回复。我尝试将它添加到循环中,但它不起作用。
  • 您有正在使用的传感器对象的文档吗?传感器是否能够连续读取两个读数,或者您是否需要在两者之间做一些特别的事情?
  • @JohnGordon 我正在使用 DHT22 和 MAX31855。 MAX31855 工作良好,但 DHT22 不工作。 DHT22 的每次读数之间必须有两秒的延迟。

标签: python loops sensors


【解决方案1】:

您过早地处理了 DHT22 传感器变量和 PiGPIO 守护程序。 在程序退出之前,您不应该清理资源。将程序的结尾更改如下:

def on_closing():
    print('Cleaning up resources.')
    s.cancel()
    pi.stop()
    master.destroy()

master.protocol("WM_DELETE_WINDOW", on_closing)
loop()
master.mainloop() 

此外,sleep(.03) 方法应直接移至 s.trigger() 方法之后的行。我指的是 readDHT22() 函数中的触发器。代码顶部的触发器是多余的,应该删除。触发后的延迟仅在更快的 Pi 上是必需的,以确保触发在读取温度和湿度之前完成。

【讨论】:

    猜你喜欢
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 2012-04-01
    相关资源
    最近更新 更多