我正在编写一个循环,连续读出两个传感器的读数。但是,我每次在第二次重复时都会收到此错误。我正在使用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窗口,因此不能使用True作为循环。
任何帮助都将不胜感激。
答案 0 :(得分:2)
您过早地处置了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上需要,以确保在读取温度和湿度之前触发完成。