为什么我在循环的第二次重复中得到NoneType错误?

时间:2018-01-03 04:55:13

标签: python loops sensor

我正在编写一个循环,连续读出两个传感器的读数。但是,我每次在第二次重复时都会收到此错误。我正在使用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作为循环。

任何帮助都将不胜感激。

1 个答案:

答案 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上需要,以确保在读取温度和湿度之前触发完成。