Hallo zusammen,
als Grundlage zu diesem Tutorial empfehle ich diesen Artikel.
Aufgabenstellung:
- Temperatursensor DS18B20 an den Raspberry anschließen
- Die Daten via GNUPLOT visualisieren
- Werte per Python Script erfassen und in eine Datei schreiben
1) Schaltung aufbauen
Der Temperatursensor wird wie im o.g. Artikel an den Raspberry angeschlossen
Ihr benötigt dazu einen DS18B20 Sensor sowie einen Wiederstand 4K7 Ohm und
am besten ein Steckboard (Breadboard), sowie ein paar Kabelbrücken, die aber
schnell selbst hergestellt sind.
In der angehängten Grafik könnt Ihr den genauen Schaltplan ersehen.
2) Sensor ansprechen und Daten auslesen
Wenn Ihr den Sensor erfolgreich an euren Raspberry Pi angeschlossen habt,
müsst Ihr den Sensor "nur" noch dem RasPi bekannt machen.
Dazu gebt Ihr in der Konsole folgende Befehle ein:
Die beiden Befehle müssen nach einem Neustart immer wieder neu eingegeben werden.
Ihr könnt aber natürlich auch ein Bash Script in "/etc/init.d" erstellen.
Eurer Sensor ist dem RasPi nun bekannt und und wurde als "Device" im Verzeichnis "/sys/bus/w1/" erstellt.
Im Ordner "/sys/bus/w1/devices" findet Ihr nun einen Ordner der ungefähr so "28-00000483f711" heisst.
(Wenn Ihr mehrere Sensoren anschließt, habt Ihr auch mehrere entsprechende Unterverzeichnisse)
In diesem Ordner befindet sich nun die Datei "w1_slave" mit den aktuellen Temperaturwerten des Sensors.
Öffnet die Datei mit einem Editor: "sudo nano w1_slave"
Der Inhalt dieser Datei müsste ungefähr so aussehen:
Der erste Bereich ist der Binäre Code des Sensors.
Der Wert "crc=b0 YES" in der ersten Zeile hinter dem Binär-Code sagt Euch, das der Sensor erfolgreich erkannt worden ist.
In der zweiten Zeile könnt Ihr nun die Temperatur auslesen: "t=17500"
Bei diesem Sensor müsst Ihr diesen Wert durch 1000 teilen um auf die korrekte Temperatur zu kommen.
Also "17500 / 1000 = 17.500 Grad Celsius"
Solltet Ihr andere Sensoren nutzen, müsst Ihr die Umnrechnung des Wertes aus der tech. Dokumentation des Sensors entnehmen.
3) GNUPLOT installieren
Ich habe mich für die grafische Aufbereitung der Daten für GNUPLOT entschieden.
Es gibt im Netz zahlreiche Informationen zu GNUPLOT.
Am besten Google nutzen, oder aber direkt im Projekt nachschauen.
Um die Übersicht zu wahren, habe ich GNUPLOT lediglich rudimentär eingesetzt.
Ihr installiert GNUPLOT einfach über:
Das später besprochene Python Script (Punkt 4) erzeugt eine Datei namens "temp-daten.txt"
Diese Daten werden mittels GNUPLOT Script ausgelesen und in eine jpg-Grafik umgewandelt.
Nachfolgend der Inhalt meiner Datei "temp-daten.txt", damit Ihr schon mal etwas "Testen" könnt.
13.02.2013 22:19:08 17.125 °C
13.02.2013 22:20:01 17.125 °C
14.02.2013 08:23:11 16.937 °C
14.02.2013 08:23:57 16.937 °C
14.02.2013 08:24:30 16.875 °C
14.02.2013 08:24:34 17.000 °C
14.02.2013 08:25:01 16.875 °C
14.02.2013 08:27:00 12.652 °C
14.02.2013 08:29:00 10.652 °C
14.02.2013 08:31:00 8.652 °C
14.02.2013 08:34:00 -2.852 °C
14.02.2013 08:36:00 5.324 °C
14.02.2013 08:38:00 11.324 °C
Alles anzeigen
Damit Ihr nicht jedes mal alle Befehle in GNUPLOT neu schreiben müsst, geht Ihr am besten folgendermaßen vor:
Ihr erstellt eine Datei mit "nano temp.plt"
In diese Datei schreibt Ihr bitte folgenden Code:
set title 'Temperaturverlauf'
set xlabel 'Messwert'
set ylabel 'Grad Celsius'
set yrange [-5:40]
plot 'temp-daten.txt' using 3 with line
set output "temperatur.jpg"
set terminal jpeg
replot
Speichert die Datei ab und startet GNUPLOT mit dem Befehl:
Die Befehle in der Datei "temp.plt" werden nun von GNUPLOT verarbeitet und
im aktuellen Verzeichnis wird eine Grafik mit dem Namen "temperatur.jpg" erstellt.
Kurze Beschreibung des Codes:
1. Zeile: Der Titel der Grafik wird erstellt
2. Zeile: Die x-Achse wird Beschriftet
3. Zeile: Die y-Achse wird beschriftet
4. Zeile: Die y-Achse erhält einen Wertebereich von -5 bis +40 Grad
5. Zeile: Die Datei "temp-daten.txt" wird ausgelesen und die Werte der 3. Spalte verarbeitet
6. Zeile: Die Ausgabedatei "temperatur.jpg" wird definiert
7. Zeile: Das Ausgabeformat "jpeg" wird definiert.
8. Zeile: Ausgabe der Daten in die Datei "Temperatur.jpg"
Den "Plot" könnt Ihr im Anhang ersehen.
Die so erstellte Grafik könnt Ihr z.B. jederzeit in einer Webseite einbinden.
Ihr könnt das GNUPLOT Script natürlich individuell anpassen.
Dazu ist der o.g. Link als Einstieg zu empfehlen.
4) Das Python Script
So, nun sind wir schon fast fertig.
Jetzt müssen wir lediglich die Daten per Python Script abfragen, aufbereiten und in die Datei "temp-daten.txt" schreiben.
Wer Lust und Zeit hat, kann anstatt der Datei, seine Werte natürlich in eine Datenbank abspeichern.
Dazu ist am Script nicht viel zu ändern.
Am besten packt Ihr alle Scripte in ein Verzeichnis,
dann werden die Ergebnisse ebenfalls alle zentral dort abgespeichert.
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Die Sensoren müssen mit "modprobe w1-gpio" und "modprobe w1-therm" aktiviert werden!
# Import der Module
import sys
import os
from time import *
# Zeitvariable definieren
lt = localtime()
# 1-Wire Slave-Liste oeffnen
file = open('/sys/devices/w1_bus_master1/w1_master_slaves') #Verzeichniss evtl. anpassen
# 1-Wire Slaves auslesen
w1_slaves = file.readlines()
# 1-Wire Slave-Liste schliessen
file.close()
# Header fuer Bildschirmausgabe
print('Sensor ID | Temperatur')
print('----------------------------')
# Fuer jeden 1-Wire Slave eine Ausgabe
for line in w1_slaves:
# 1-wire Slave extrahieren
w1_slave = line.split("\n")[0]
# 1-wire Slave Datei oeffnen
file = open('/sys/bus/w1/devices/' + str(w1_slave) + '/w1_slave')
# Inhalt des 1-wire Slave File auslesen
filecontent = file.read()
# 1-wire Slave File schliessen
file.close()
# Temperatur Daten auslesen
stringvalue = filecontent.split("\n")[1].split(" ")[9]
# Temperatur konvertieren
temperature = float(stringvalue[2:]) / 1000
# Temperatur ausgeben
print(str(w1_slave) + ' | %5.3f °C' % temperature)
# Werte in Datei schreiben
# Zeit und Datum erfassen
Datum = strftime("%d.%m.%Y")
Uhrzeit = strftime("%H:%M:%S")
# Textdatei oeffnen
fobj_out = open("temp-daten.txt","a")
# Daten in Textdatei schreiben
fobj_out.write(Datum + ", " + Uhrzeit +", " + '%5.3f °C' % temperature + "\n")
# Textdatei schliessen
fobj_out.close()
# Python script beenden und GNUPLOT Grafik erstellen
os.system("gnuplot /Verzeichnis_zum GNUPLOT-Script/temp.plt")
sys.exit(0)
Alles anzeigen
Das Python Script ist durch die Bemerkungen einigermaßen Selbsterklärend.
In Zeile 30 dient die for-Schleife dazu, evtl. mehrere Sensoren auszulesen.
Die vorletzte Zeile dient dazu GNUPLOT aufzurufen und das jpg-Bild zu erstellen.
Feddisch!
Grüße
Blaster