首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从DHT-11温度/湿度传感器到CSV文件的传感器数据(python/ raspberry pi 3)

从DHT-11温度/湿度传感器到CSV文件的传感器数据(python/ raspberry pi 3)
EN

Stack Overflow用户
提问于 2021-03-12 01:36:28
回答 2查看 202关注 0票数 1

我有最少的编码经验和相对新手的python,但我正在尝试写一个树莓派(3B+)的python程序,将从DHT-11传感器获得温度和湿度数据,并将其保存到一个.csv文件有3个头:时间戳收集数据,温度值,湿度值。

我已经做了测试,知道我从传感器上得到的读数是正常的。我希望将这些读数以及时间戳放到csv文件中,每个文件都在适当的标题下。我收到一个TypeError: 'NoneType' object is not subscriptable错误。我对如何修复这个错误有点迷茫,因为我对这门语言(和一般的编码)都是新手。这是我在运行程序时在终端中看到的:

代码语言:javascript
复制
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

以下是我的代码:

代码语言:javascript
复制
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'], 'Temperature': data['temperature'], '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', newline='') as csvfile: 
            fieldnames = ['Time', 'Temperature', 'Humidity']
            data_writer = csv.DictWriter(csvfile, fieldnames=fieldnames, delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL)

            data_writer.writeheader()
            data_writer.writerow({'Time': data['timestamp'], 'Temperature': data['temperature'], 'Humidity': data['humidity']})

if __name__ == "__main__":
    main()
EN

回答 2

Stack Overflow用户

发布于 2021-03-12 02:20:24

如果humiditytemp都不是None,则函数get_data()返回包含数据的字典。否则,它返回None。然后,将get_data()返回的任何内容传递给add_to_file(data),并将其作为字典使用,虽然它可能是字典,但也可能是None。您可以将main修改为仅当get_data()返回一些实际有用的东西时才调用add_to_file(data) - data不是None。例如:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2021-11-04 10:51:12

正如kukabadl所说,你的问题是,当你的DHT_11传感器由于线路脆弱而失败时,get_data不会输出任何信息。get_data()函数仅在数据不为None的情况下记录数据。通过在if:语句下面添加else:语句,可以说明数据为空的情况:

代码语言:javascript
复制
else:
    data = {'timestamp':None, 'temperature':None, 'humidity':None}
    print(data)
    return(data)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66587656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档