Im Artikel Temperatur und Luftfeuchtigkeit mit dem DHT 11 erfassen beschreibe ich ausführlich, wie man den Sensor anschließt und die Messwerte ausliest. Das kleine Programm erweitern wir einfach. Die Messwerte schreiben wir in eine kleine JSON Datei, die wir anschließend in der Visualisierung zyklisch auslesen. Zusätzlich werden die Werte auch in eine Datenbank geschrieben, aus der dann eine Grafik der Messwerte erstellt wird. Das Programm zum Erfassen der Messwerte lasse ich ebenfalls zyklisch per Cronjob laufen.
Vorab müssen wir noch eine Datenbank einrichten, die die Werte für Datum, Uhrzeit, Temperatur und Feuchte aufnimmt. Infos, wie das geht, findet Ihr hier:
Apache, PHP und PhpMyAdmin installieren
Das Programm im Detail erklärt:
Zuerst müssen alle notwendigen Module importiert werden.
#Adafruit Library to communicate with the sensor
import Adafruit_DHT
#PyMySQL library to estabilsh connection with database
import pymysql.cursors
#import library for time functions (for the sleep timer)
import time
#import the json library to dump the values to a json file where other programs can get the infos from
import json
#import time library to store the date of the data
import time
Ist das erledigt legen wir die Grenzen für unsere Messwerte für unseren Sensor fest. Laut Datenblatt kann der DHT 11 die Luftfeuchtigkeit nur zwischen 20-90%rH, sowie die Temperatur zwischen 0-50°C messen. Damit führe ich eine kleine Plausibilitätsprüfung durch.
#define plausibility limits for humidity and temperature (from datasheet)
humidity_min = 20
humidity_max = 90
temperature_min = 0
temperature_max = 50
Nachdem ich festgestellt habe, dass der Sensor ab und an keine wirklich sinnvollen Messwerte liefert und das wohl auch anderen so geht, glätte ich die Messwerte noch etwas nachdem sie eingelesen wurden. Dazu lesen wir jetzt den Sensor 10 Mal nacheinander aus und speichere die Werte in jeweils eine Liste für die Temperatur und die Feuchtigkeit. Man muss beachten, dass der Sensor laut Datenblatt nur maximal alle zwei Sekunden abgefragt werden darf. Deshalb warte ich nach jedem Auslesen 5 Sekunden.
#Start time for the timer is the current time
starttime = time.time()
#set-up the sensor and acquire values for temperature and humidity
sensor = Adafruit_DHT.DHT11
pin = 10 #enter your pin here
humidity_buffer = []
temperature_buffer = []
#Collect ten measurements
for x in range(9):
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
humidity_buffer.append(humidity)
temperature_buffer.append(temperature)
time.sleep(5)
Um den Zeitpunkt der Messung in die Datenbank schreiben zu können, wird die Uhrzeit und das Datum erfasst und gespeichert
#acquire and format date and time of measurement
sampling_time = time.localtime()
sampling_time_date = time.strftime('%Y-%m-%d', sampling_time)
sampling_time_time = time.strftime('%H:%M:%S', sampling_time)
Die Glättung der Daten oder die Bereinigung von Fehlmessungen ist relativ einfach. Zunächst sortiere ich die Listen für Temperatur und Feuchtigkeit von klein nach Groß. Anschließend schneide ich die oberen und untern Messwerte (vermutete Ausreißer) ab. Die verbleibenden Daten werden gemittelt und dieser Wert dann als Messwert gespeichert.
#sort the temperature and humidity lists from low to high
humidity_buffer.sort()
temperature_buffer.sort()
#calculate the average without the upper and lower 20% of the values
count = 0
humidity_sum = 0
temperature_sum = 0
for x in range(2,7):
count = count + 1
humidity_sum = humidity_sum + humidity_buffer[x]
temperature_sum = temperature_sum + temperature_buffer[x]
humidity_average = humidity_sum / count
temperature_average = temperature_sum / count
humidity = humidity_average
temperature = temperature_average
zu guter Letzt bleibt nur noch, die Daten in die Datenbank und das JSON File zu schreiben.
# Connect to the database
# enter your password under password
connection = pymysql.connect(host='localhost',
user='root',
password='your_password',
db='Home Data Viewer',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
#Write temperature and humidity to database
try:
with connection.cursor() as cursor:
# Create a new record
sql = "INSERT INTO Wohnzimmer (Datum, Uhrzeit, Temperatur, Feuchte) VALUES (%s, %s, %s, %s)"
cursor.execute(sql, (sampling_time_date, sampling_time_time, temperature, humidity))
print('{} {} Done'.format(sampling_time_date, sampling_time_time))
connection.commit()
#write values to JSON file
with open('/home/pi/Meine_Programme/data.json','w') as write_file:
data={'temperature':temperature,'humidity':humidity,'time_code': str(time.asctime(sampling_time))}
json.dump(data,write_file)
print('abgelegt')
finally:
connection.close()