如何解决从 DHT-11 温度/湿度传感器到 CSV 文件的传感器数据python/树莓派 3
我的编码经验很少,对 python 比较陌生,但我正在尝试为 raspberry pi (3B+) 编写一个 python 程序,该程序将从 DHT-11 传感器获取温度和湿度数据并将其保存到 .csv 文件带有 3 个标题:收集数据的时间戳、温度值、湿度值。
我已经完成了测试,我知道我从传感器获取读数就好了。我想将这些读数和时间戳一起放入一个 csv 文件中,每个文件都在适当的标题下。我收到 TypeError: 'NoneType' object is not subscriptable
错误。由于我是该语言的新手(以及一般的编码),因此我对如何修复错误有点迷茫。这是我运行程序时在终端中看到的:
pi@rgbpi: ~ Documents $ sudo python3 temp_humidity_csv.py
Beginning cycle 1
Traceback (most recent call last):
File "temp_humidity_csv.py",line 66,in <module> main()
File "temp_humidity_csv.py",line 33,in main add_to_file(data)
File "temp_humidity_csv.py",line 55,in add_to_file data_writer.writerow({'Time': data['timestamp'],'Temperature': data['temperature'],'Humidity': data['humidity']})
TypeError: 'NoneType' object is not subscriptable
以下是我的代码:
import RPi.GPIO as GPIO
import csv
import time,datetime
from time import sleep
import Adafruit_DHT
import os.path
#initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.cleanup()
#set up DHT sensor
dht_sensor = Adafruit_DHT.DHT11
dht_pin = 7
#global variables
datafile = "/home/pi/Desktop/Temp_Humid.csv"
#main function - will take temp,humidity and timestamp and write to csv every 10s
def main():
i = 1
while(1):
print("Beginning cycle " + str(i))
data = get_data()
add_to_file(data)
sleep(10)
print("End of cycle " + str(i))
i = i+1
#get temp and humidity and add to 'data' dictionary
def get_data():
now = datetime.datetime.now()
humidity,temp = Adafruit_DHT.read(dht_sensor,dht_pin)
if humidity is not None and temp is not None:
data = {'timestamp':str(now.strftime("%Y%m%d_%H-%M-%S")),'temperature':temp,'humidity':humidity}
print(data)
return(data)
#write temp,humidity and time stamps to csv file
def add_to_file(data):
if os.path.isfile(datafile): #checks if file exists. if yes,appends values for dictionary under corresponding header in a new line
with open(datafile,'a',newline='') as csvfile:
fieldnames = ['Time','Temperature','Humidity']
data_writer = csv.DictWriter(csvfile,fieldnames=fieldnames,delimiter=' ',quotechar='|',quoting=csv.QUOTE_MINIMAL)
data_writer.writerow({'Time': data['timestamp'],'Humidity': data['humidity']})
else: #creates file (that has been checked and does not yet exist) and adds headers and values for all 3 keys in dict
with open(datafile,'w',quoting=csv.QUOTE_MINIMAL)
data_writer.writeheader()
data_writer.writerow({'Time': data['timestamp'],'Humidity': data['humidity']})
if __name__ == "__main__":
main()
解决方法
如果 get_data()
和 humidity
都不是 temp
,函数 None
返回带有数据的字典。否则返回 None
。然后你将返回的任何 get_data()
传递给 add_to_file(data)
,在那里你使用它,就好像它可能是一本字典,但它也可能是 None
。您可以修改 main
以仅在 add_to_file(data)
返回实际有用的东西时调用 get_data()
- data
不是 None。例如像这样:
def main():
i = 1
while(1):
print("Beginning cycle " + str(i))
data = get_data()
if data is not None:
add_to_file(data)
sleep(10)
print("End of cycle " + str(i))
i = i+1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。