Wetterdaten mit Linux aufzeichnen und verarbeiten
Aus BraLUG-Wiki
(→Helligkeit mit Fotowiderstand und Solarzelle) |
(→Visualisierung) |
||
(11 dazwischenliegende Versionen von einem Benutzer werden nicht angezeigt) | |||
Zeile 2: | Zeile 2: | ||
[[Category:Programmieren]] | [[Category:Programmieren]] | ||
[[Category:Tcl/Tk]] | [[Category:Tcl/Tk]] | ||
− | |||
− | |||
− | |||
− | |||
=Was soll das hier?= | =Was soll das hier?= | ||
Zeile 11: | Zeile 7: | ||
Angefangen hat die Geschichte eigentlich nur mit ein paar Experimenten mit Temperatursensoren an diversen Mikrocontroller-Boards (z.B. [[BLIT2008-Board mit 1-Wire]] und [[BLIT2008-Board-Thermo]]). Irgendwann kam der Wunsch auf, diese Temperaturmessdaten dauerhaft mitzuschreiben, zu archivieren (z.B. [[BLIT-Board-SD-Card|auf einer, an einem Mikrocontroller angeschlossenen SD-Karte]]) und die Verläufe in geeigneter Form anzuzeigen. Die Ergebnisse waren aber nicht allzu befriedigend, was an den beschränkten Ressourcen und Möglichkeiten der eingesetzten Mikrokontroller lag. | Angefangen hat die Geschichte eigentlich nur mit ein paar Experimenten mit Temperatursensoren an diversen Mikrocontroller-Boards (z.B. [[BLIT2008-Board mit 1-Wire]] und [[BLIT2008-Board-Thermo]]). Irgendwann kam der Wunsch auf, diese Temperaturmessdaten dauerhaft mitzuschreiben, zu archivieren (z.B. [[BLIT-Board-SD-Card|auf einer, an einem Mikrocontroller angeschlossenen SD-Karte]]) und die Verläufe in geeigneter Form anzuzeigen. Die Ergebnisse waren aber nicht allzu befriedigend, was an den beschränkten Ressourcen und Möglichkeiten der eingesetzten Mikrokontroller lag. | ||
− | Also begann ich sukzessive die Temperaturmessungen mit einem "richtigen" Linux-Rechner aufzubauen. Nachdem dies gelungen war, reifte der Wunsch nochmehr Daten zu erfassen und zu visualisieren. Es kam also schrittweise die Aufzeichnung der Helligkeit, der Luftfeuchtigkeit und des Luftdrucks hinzu. Der derzeitige Stand ist auf einer kleinen Webseite einsehbar: [http://bergeruw. | + | Also begann ich sukzessive die Temperaturmessungen mit einem "richtigen" Linux-Rechner aufzubauen. Nachdem dies gelungen war, reifte der Wunsch nochmehr Daten zu erfassen und zu visualisieren. Es kam also schrittweise die Aufzeichnung der Helligkeit, der Luftfeuchtigkeit und des Luftdrucks hinzu. Der derzeitige Stand ist auf einer kleinen Webseite einsehbar: [http://bergeruw.spdns.org/~pi/temp/ Das Klima bei Uwe]. |
Dieser Wiki-Artikel soll ein wenig von den Techniken berichten, die hinter diesem System stecken. Vielleicht kann der eine oder andere Interessierte ein paar Anregungen für eigene Experimente finden. | Dieser Wiki-Artikel soll ein wenig von den Techniken berichten, die hinter diesem System stecken. Vielleicht kann der eine oder andere Interessierte ein paar Anregungen für eigene Experimente finden. | ||
Zeile 61: | Zeile 57: | ||
* Halbduplex-Betrieb | * Halbduplex-Betrieb | ||
* Multimaster möglich | * Multimaster möglich | ||
− | * Slaveadressen 7 Bit lang und vom Hersteller festgelegt | + | * Slaveadressen 7 Bit lang und vom jeweiligen Hersteller festgelegt |
− | Um I²C-Slaves (in unserem Fall die Sensoren) an einem | + | Um I²C-Slaves (in unserem Fall die Sensoren) an einem Linux-PC anschließen und abfragen zu können, benötigt man einen I²C-Master. Das hier beschriebene System verwendet einen [http://www.harbaum.org/till/i2c_tiny_usb/index.shtml i2c-tiny-usb-Adapter von Till Harbaum], für den es das Kernel-Modul i2c-tiny-usb gibt. Auf der Wiki-Seite [[BLIT2008-Board mit i2c-tiny-usb-Firmware]] sind ein paar detailliertere Grundlagen und Experimente mit diesem Adapter zu finden. |
Zeile 112: | Zeile 108: | ||
Eigentlich werden derzeit die Innen- und Außentemperaturen mit zwei 1-wire-Sensoren (siehe weiter unten) erfasst. Allerdings benötigt man zur Berechnung der korrekten Luftfeuchtigkeit mit einem [[Wetterdaten mit Linux aufzeichnen und verarbeiten#realtive Luftfeuchtigkeit mit einem HIH-4030|HIH-4030]] die unmittelbare Umgebungstemperatur dieses Sensors. Aus diesem Grund habe ich in der Nähe des Luftfeuchtigkeitssensors ein Temperatursensor vom Typ LM75 angeordnet. Dessen Messwert wird gleichzeitig mit Abfrage der Luftfeuchtigkeit ermittelt und in der entsprechenden Datenbanktabelle abgelegt. | Eigentlich werden derzeit die Innen- und Außentemperaturen mit zwei 1-wire-Sensoren (siehe weiter unten) erfasst. Allerdings benötigt man zur Berechnung der korrekten Luftfeuchtigkeit mit einem [[Wetterdaten mit Linux aufzeichnen und verarbeiten#realtive Luftfeuchtigkeit mit einem HIH-4030|HIH-4030]] die unmittelbare Umgebungstemperatur dieses Sensors. Aus diesem Grund habe ich in der Nähe des Luftfeuchtigkeitssensors ein Temperatursensor vom Typ LM75 angeordnet. Dessen Messwert wird gleichzeitig mit Abfrage der Luftfeuchtigkeit ermittelt und in der entsprechenden Datenbanktabelle abgelegt. | ||
− | Glücklicherweise hatte ich noch ein paar [[BLIT2008-Board-Thermo|LM75-Module]] zum [[BLIT2008-Board|BLIT2008-Board]] | + | Glücklicherweise hatte ich noch ein paar [[BLIT2008-Board-Thermo|LM75-Module]] zum [[BLIT2008-Board|BLIT2008-Board]] herumzuliegen. Auf ersterer Wiki-Seite findet man auch die Beschaltung und das Datenblatt des verwendeten Temperatursensor-Moduls. |
===Helligkeit mit Fotowiderstand und Solarzelle=== | ===Helligkeit mit Fotowiderstand und Solarzelle=== | ||
Zeile 141: | Zeile 137: | ||
[[Bild:Bmp085.jpg|thumb|200px|Luftdrucksensor BMP085 an einem I²C-Level-Shifter]] | [[Bild:Bmp085.jpg|thumb|200px|Luftdrucksensor BMP085 an einem I²C-Level-Shifter]] | ||
[[Bild:I2c level shifter.jpg|thumb|200px|I²C-Level-Shifter (Rückseite)]] | [[Bild:I2c level shifter.jpg|thumb|200px|I²C-Level-Shifter (Rückseite)]] | ||
− | + | Zur Bestimmung des Luftdruckes wird ein Sensor vom Typ [http://www.bosch-sensortec.com/content/language3/downloads/BST-BMP085-DS000-05.pdf BMP085] der Firma Bosch verwendet. Dieser Sensor verfügt über ein I²C-Interface und kann Druckwerte zwischen 300 und 1100hPa ermitteln. | |
Der Sensor ist "ab Werk" kalibriert. Die divesen Korrekturwerte zur Berechnung des realen Druckwertes sind im EEPROM des Schaltkreises abgelegt und können ebenfalls über den I²C-Bus ausgelesen werden. Weiterhin wird zur Berechnung des genauen Druckwertes die Umgebungstemperatur des Sensors benötigt. Glücklicherweise hat der Hersteller gleich einen Temperatursensor in den Schaltkreis integriert, dessen Messwert ebenfalls über den I²C-Bus ermittelbar ist. Das genaue Verfahren zur Berechnung des realen Druckwertes aus den diversen Parametern ist im [http://www.bosch-sensortec.com/content/language3/downloads/BST-BMP085-DS000-05.pdf Datenblatt] ausführlich beschrieben. | Der Sensor ist "ab Werk" kalibriert. Die divesen Korrekturwerte zur Berechnung des realen Druckwertes sind im EEPROM des Schaltkreises abgelegt und können ebenfalls über den I²C-Bus ausgelesen werden. Weiterhin wird zur Berechnung des genauen Druckwertes die Umgebungstemperatur des Sensors benötigt. Glücklicherweise hat der Hersteller gleich einen Temperatursensor in den Schaltkreis integriert, dessen Messwert ebenfalls über den I²C-Bus ermittelbar ist. Das genaue Verfahren zur Berechnung des realen Druckwertes aus den diversen Parametern ist im [http://www.bosch-sensortec.com/content/language3/downloads/BST-BMP085-DS000-05.pdf Datenblatt] ausführlich beschrieben. | ||
− | Ein kleines Problemchen bei der Integration des Sensors in das Gesamtsystem gab es dann doch: die maximale Versorgungsspannung des | + | Ein kleines Problemchen bei der Integration des Sensors in das Gesamtsystem gab es dann doch: die maximale Versorgungsspannung des Schaltkreises beträgt 3,6V. Mein I²C-Bus arbeitet aber mit 5V! Bei der Bestellung des Sensors habe ich diese Geschichte wohl "überlesen", sonst hätte ich gleich einen entsprechenden bidirektionalen Pegelwandler mitgeordert.... Aber man besitzt ja einen Lötkolben und kann sich solch ein Ding selbst bauen! Die Firma Philips beschreibt die Vorgehensweise dazu in einer [http://ics.nxp.com/support/documents/interface/pdf/an97055.pdf Application-Note]. In verschiedenen Quellen findet man, dass der FET-Transistor [http://www.datasheetcatalog.org/datasheet/diodes/ds30144.pdf BSS138] die idealsten Eigenschaften für diesen Einsatzzweck hat (man sollte sich nicht von der SMD-Bauform abschrecken lassen; mit einer vernünftigen Lötkolbenspitze, einer ruhigen Hand und einer Lupe ist das auch auf Lochraster machbar). Die 3,3V zur Spannungsversorgung des BMP085 werden mit einem Spannungsregler [http://www.datasheetcatalog.org/datasheet/nationalsemiconductor/DS009063.PDF LM317] aus den vorhanden 5V des I²C-Bus generiert. |
Der mit dem Sensor gemessene Luftdruck ist der absolute Luftdruck. In den üblichen Wetterberichten ist, um eine Vergleichbarkeit zwischen den unterschiedlichen Standorten gewährleisten zu können, vom relativen Luftdruck die Rede, also der Luftdruck, der in Meereshöhe herrscht. D.h., dass man eine [http://de.wikipedia.org/wiki/Barometrische_H%C3%B6henformel#Reduktion_auf_Meeresh.C3.B6he Reduktion auf Meereshöhe] vornehmen muss. Für meine Belange reicht die Näherung, dass der [http://de.wikipedia.org/wiki/Luftdruck#Abnahme_mit_der_H.C3.B6he Luftdruck um 1hPa pro 8 Meter Höhenunterschied abnimmt].... | Der mit dem Sensor gemessene Luftdruck ist der absolute Luftdruck. In den üblichen Wetterberichten ist, um eine Vergleichbarkeit zwischen den unterschiedlichen Standorten gewährleisten zu können, vom relativen Luftdruck die Rede, also der Luftdruck, der in Meereshöhe herrscht. D.h., dass man eine [http://de.wikipedia.org/wiki/Barometrische_H%C3%B6henformel#Reduktion_auf_Meeresh.C3.B6he Reduktion auf Meereshöhe] vornehmen muss. Für meine Belange reicht die Näherung, dass der [http://de.wikipedia.org/wiki/Luftdruck#Abnahme_mit_der_H.C3.B6he Luftdruck um 1hPa pro 8 Meter Höhenunterschied abnimmt].... | ||
Zeile 167: | Zeile 163: | ||
* Datenübertragung erfolgt in 64-Bit-Blöcken | * Datenübertragung erfolgt in 64-Bit-Blöcken | ||
* Stromversorgung der Slaves erfolgt parasitär über einen internen Speicherkondensator | * Stromversorgung der Slaves erfolgt parasitär über einen internen Speicherkondensator | ||
− | ** bei inaktiver Kommunikation wird Kondensator aufgeladen | + | ** bei inaktiver Kommunikation wird der Kondensator aufgeladen |
− | ** bei aktiver Kommunikation versorgt Kondensator IC mit Strom | + | ** bei aktiver Kommunikation versorgt der Kondensator den IC mit Strom |
** reicht dies nicht → zusätzliche Stromversorgungsleitung möglich | ** reicht dies nicht → zusätzliche Stromversorgungsleitung möglich | ||
Zeile 244: | Zeile 240: | ||
=Software= | =Software= | ||
==Scripte== | ==Scripte== | ||
− | Zum Auslesen der Sensoren am 1-wire- und I²C-Bus, zum Generieren der Diagramme für die kleine [http://bergeruw. | + | Zum Auslesen der Sensoren am 1-wire- und I²C-Bus, zum Generieren der Diagramme für die kleine [http://bergeruw.spdns.org/~bergeruw/temp/ Webseite] und der Ansteuerung des angeschlossenen LC-Displays werden eine Reihe von [http://de.wikipedia.org/wiki/Tcl TCL]-Scripte verwendet. Jedes dieser Scripte läuft in einer eigenen [http://de.wikipedia.org/wiki/GNU_Screen Screen-Session], da jeweils ein paar Kontrollausgaben zu den gerade ablaufenden Aktionen getätigt werden. |
Folgende Tcl-Scripte laufen derzeit im System: | Folgende Tcl-Scripte laufen derzeit im System: | ||
− | * i2c_adc_db_neu.tcl → Zyklisches Auslesen der Sensoren am I²C-Bus (jede Minute), Abspeichern der Werte in eine Datenbanktabelle und Generierung des entsprechenden Diagramms für die [http://bergeruw. | + | * i2c_adc_db_neu.tcl → Zyklisches Auslesen der Sensoren am I²C-Bus (jede Minute), Abspeichern der Werte in eine Datenbanktabelle und Generierung des entsprechenden Diagramms für die [http://bergeruw.spdns.org/~bergeruw/temp/ Webseite] (jede zwei Minuten) |
− | * owfs2sqlite.tcl → Auslesen der Sensoren am 1-wire-Bus (jede Minute), Abspeichern der Werte in Datenbanktabellen und Generierung der entsprechenden Diagramme für die [http://bergeruw. | + | * owfs2sqlite.tcl → Auslesen der Sensoren am 1-wire-Bus (jede Minute), Abspeichern der Werte in Datenbanktabellen und Generierung der entsprechenden Diagramme für die [http://bergeruw.spdns.org/~bergeruw/temp/ Webseite] (jede zwei Minuten) |
− | * heatmap_generator.tcl → Generierung der Heatmap-Diagramme für die [http://bergeruw. | + | * heatmap_generator.tcl → Generierung der Heatmap-Diagramme für die [http://bergeruw.spdns.org/~bergeruw/temp/heatmaps.php Webseite] (jede zwei Stunden); die Werte werden dazu aus den entsprechenden Datenbanktabellen gelesen |
* display_weather.tcl → Auslesen der aktuellen Werte aus den entsprechenden Datenbanktabellen und deren Anzeige auf dem [[Wetterdaten mit Linux aufzeichnen und verarbeiten#Ansteuerung_eines_LC-Display|LC-Display]] (Uhrzeit jede Sekunde; alle anderen Werte jede Minute) | * display_weather.tcl → Auslesen der aktuellen Werte aus den entsprechenden Datenbanktabellen und deren Anzeige auf dem [[Wetterdaten mit Linux aufzeichnen und verarbeiten#Ansteuerung_eines_LC-Display|LC-Display]] (Uhrzeit jede Sekunde; alle anderen Werte jede Minute) | ||
Zeile 266: | Zeile 262: | ||
* eine Tabelle für den Luftdruck-Wert und dem dazugehörigen Temperaturwert | * eine Tabelle für den Luftdruck-Wert und dem dazugehörigen Temperaturwert | ||
− | Es werden jeweils die Messwerte ansich und der dazugehörige Timestamp abgelegt. Für jede Tabelle wurde ein Index auf dem Timestamp angelegt, um diverse | + | Es werden jeweils die Messwerte ansich und der dazugehörige Timestamp abgelegt. Für jede Tabelle wurde ein Index auf dem Timestamp angelegt, um diverse Lesezugriffe zu beschleunigen. |
==Visualisierung== | ==Visualisierung== | ||
Zeile 272: | Zeile 268: | ||
[[Bild:Temp plot.png|thumb|200px|Temperaturverlauf über 48h]] | [[Bild:Temp plot.png|thumb|200px|Temperaturverlauf über 48h]] | ||
[[Bild:Heatmap temperature.png|thumb|200px|Temperaturverlauf über 360 Tage als Heatmap]] | [[Bild:Heatmap temperature.png|thumb|200px|Temperaturverlauf über 360 Tage als Heatmap]] | ||
− | Zur Erzeugung der Diagramm-Bilder für die [http://bergeruw. | + | Zur Erzeugung der Diagramm-Bilder für die [http://bergeruw.spdns.org/~pi/temp/index.php Webseite] wird das Kommandozeilen-Tool [http://www.gnuplot.info/ gnuplot] verwendet. Innerhalb verschiedener [[Wetterdaten mit Linux aufzeichnen und verarbeiten#Scripte|Tcl-Scripte]] werden dazu die jeweiligen Messwerte aus den entsprechenden Datenbanktabellen gelesen und angepasst sowie gnuplot über eine [http://de.wikipedia.org/wiki/Pipe_(Informatik) Pipe] aufgerufen, parametrisiert und die Erzeugung der Diagramm-Bilder gestartet. |
Als Darstellungformen wurden zwei Diagramm-Arten gewählt: | Als Darstellungformen wurden zwei Diagramm-Arten gewählt: | ||
− | * [http://bergeruw.dyndns.org/~ | + | * [http://bergeruw.dyndns.org/~pi/temp/ Messwertverlauf über die Uhrzeit] → einfaches xy-Diagramm |
− | * [http://bergeruw.dyndns.org/~ | + | * [http://bergeruw.dyndns.org/~pi/temp/heatmaps.php Messwertverlauf über Datum '''und''' Uhrzeit] (also dreidimensional) → [http://de.wikipedia.org/wiki/Heatmap Heatmap-Diagramm] |
− | + | ||
− | + | ||
− | + | ||
===Ansteuerung eines LC-Display=== | ===Ansteuerung eines LC-Display=== |
Aktuelle Version vom 24. Januar 2017, 07:33 Uhr
Inhaltsverzeichnis |
[Bearbeiten] Was soll das hier?
Angefangen hat die Geschichte eigentlich nur mit ein paar Experimenten mit Temperatursensoren an diversen Mikrocontroller-Boards (z.B. BLIT2008-Board mit 1-Wire und BLIT2008-Board-Thermo). Irgendwann kam der Wunsch auf, diese Temperaturmessdaten dauerhaft mitzuschreiben, zu archivieren (z.B. auf einer, an einem Mikrocontroller angeschlossenen SD-Karte) und die Verläufe in geeigneter Form anzuzeigen. Die Ergebnisse waren aber nicht allzu befriedigend, was an den beschränkten Ressourcen und Möglichkeiten der eingesetzten Mikrokontroller lag.
Also begann ich sukzessive die Temperaturmessungen mit einem "richtigen" Linux-Rechner aufzubauen. Nachdem dies gelungen war, reifte der Wunsch nochmehr Daten zu erfassen und zu visualisieren. Es kam also schrittweise die Aufzeichnung der Helligkeit, der Luftfeuchtigkeit und des Luftdrucks hinzu. Der derzeitige Stand ist auf einer kleinen Webseite einsehbar: Das Klima bei Uwe.
Dieser Wiki-Artikel soll ein wenig von den Techniken berichten, die hinter diesem System stecken. Vielleicht kann der eine oder andere Interessierte ein paar Anregungen für eigene Experimente finden.
Einige der technischen Grundlagen habe ich bereits in einem Vortrag "Busverkehr unter Linux" zusammengefasst, welchen ich 2012 auf dem Chemnitzer Linuxtag und der FrOSCon präsentiert habe.
Viel Spaß!
[Bearbeiten] Hardware
[Bearbeiten] Rechner-Hardware
Da das System ständig laufen muss, um die Messdaten lückenlos aufnehmen zu können, wurde eine Rechnerhardware gesucht, deren Stromaufnahme sich im tolerierbaren Rahmen bewegt. Als ich mit den Experimenten anfing, beschäftigeten sich gerade ein paar Leute damit, das NAS-System "Dockstar" von Seagate von der Hersteller-Firmware zu befreien, was meinen Wunschvorstelleungen sehr entgegen kam.
Diese NAS-Einheit verfügt über einen Ethernetanschluß, drei USB-Ports, einen weiteren USB-Anschluß für eine externe USB-Festplatte sowie über eine Status-LED. Die Original-Firmware ist bereits ein Linux, welches aber relativ restriktiv beim ersten Verbinden mit dem Internet mit Seagate kommuniziert und dann nicht mehr ohne weiteres austauschbar ist. Intern werkelt ein ARM-Prozessor, es sind 128MB RAM und 256MB FLASH-Speicher vorhanden. Ich habe dem System eine passende externe USB-Festplatte (320GB) von Seagate spendiert.
Im Internet kursieren diverse Beschreibungen über die interne Hardware und das Aufspielen eigener Firmware. Z.B.:
Für die Wetterdatenaufzeichnung wurden noch diverse weitere Softwarepakete installiert, u.a.:
- TCL-Interpreter (diverse Scripte zur Steuerung)
- SQLite (als Datenbank)
- gnuplot (zur Generierung von Diagrammen)
- screen und screenie (zum Verwalten diverser Terminal-Sessions)
- ein WEB-Server (zur Auslieferung von HTML-Seiten)
An den vorhandenen USB-Ports ist folgende relevante Hardware angeschlossen:
Neben dem Aufzeichnen der Wetterdaten verwende ich das NAS auch noch als zweites Backup-System in meinem Heimnetz (einfaches rsync von diversen Verzeichnisse meines Servers).
[Bearbeiten] I2C-Bus
[Bearbeiten] Allgemeines
Ein Teil der eingesetzten Sensoren sind für den I²C-Bus der Firma Philips ausgelegt. Folgende Merkmale kennzeichnen ein solchen Bus:
- ursprünglich für die interne Datenübertragung zwischen Gerätebaugruppen konzipiert
- I²C (Inter Intergrated Circuit); TWI (Two-Wire-Interface); „Zweidraht-Bus“:
- eine Datenleitung (SDA)
- eine Taktleitung (SCL)
- eine Masse- und eine Stromversorgungsleitung
- serieller, synchroner und bidirektionaler Datenbus
- Halbduplex-Betrieb
- Multimaster möglich
- Slaveadressen 7 Bit lang und vom jeweiligen Hersteller festgelegt
Um I²C-Slaves (in unserem Fall die Sensoren) an einem Linux-PC anschließen und abfragen zu können, benötigt man einen I²C-Master. Das hier beschriebene System verwendet einen i2c-tiny-usb-Adapter von Till Harbaum, für den es das Kernel-Modul i2c-tiny-usb gibt. Auf der Wiki-Seite BLIT2008-Board mit i2c-tiny-usb-Firmware sind ein paar detailliertere Grundlagen und Experimente mit diesem Adapter zu finden.
Hier ein paar I²C-relevante Ausgaben auf meinem Zielsystem:
> dmesg ... [20905241.303601] usb 1-1.2: new low speed USB device using orion-ehci and address 89 [20905241.419330] usb 1-1.2: New USB device found, idVendor=0403, idProduct=c631 [20905241.426528] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [20905241.434174] usb 1-1.2: Product: i2c-tiny-usb [20905241.438726] usb 1-1.2: Manufacturer: Till Harbaum [20905241.446154] usb 1-1.2: configuration #1 chosen from 1 choice [20905241.452875] i2c-tiny-usb 1-1.2:1.0: version 1.05 found at bus 001 address 089 [20905241.461475] i2c i2c-0: connected i2c-tiny-usb device ... > lsmod Module Size Used by ... i2c_tiny_usb 2589 0 ... > i2cdetect -l i2c-0 i2c i2c-tiny-usb at bus 001 device 089 I2C adapter > i2cdetect -y 0 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- 12 13 -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- 49 -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- 77
In der letzte Ausgabe des i2cdetect-Kommandos werden 4 I²C-Slaves aufgelistet:
- Adresse 0x12 und 0x13: zwei selbstgebaute I²C-ADC-Module
- Adresse 0x49: Temperatursensor LM75
- Adresse 0x77: Luftdrucksensor BMP085
Diese Slaves werden in der Folge kurz beschrieben.
[Bearbeiten] Temperatur mit einem LM75
Eigentlich werden derzeit die Innen- und Außentemperaturen mit zwei 1-wire-Sensoren (siehe weiter unten) erfasst. Allerdings benötigt man zur Berechnung der korrekten Luftfeuchtigkeit mit einem HIH-4030 die unmittelbare Umgebungstemperatur dieses Sensors. Aus diesem Grund habe ich in der Nähe des Luftfeuchtigkeitssensors ein Temperatursensor vom Typ LM75 angeordnet. Dessen Messwert wird gleichzeitig mit Abfrage der Luftfeuchtigkeit ermittelt und in der entsprechenden Datenbanktabelle abgelegt.
Glücklicherweise hatte ich noch ein paar LM75-Module zum BLIT2008-Board herumzuliegen. Auf ersterer Wiki-Seite findet man auch die Beschaltung und das Datenblatt des verwendeten Temperatursensor-Moduls.
[Bearbeiten] Helligkeit mit Fotowiderstand und Solarzelle
Irgendwann stellt man sich die Frage, welchen Einfluss die Helligkeit (bzw. Sonneneinstrahlung) auf Temperaturen, Luftfeuchtigkeit und Luftdruck hat. Um dies herauszufinden und entsprechend zu visualisieren, mussten entsprechende Sensoren her. Eine kurze Recherche ergab, dass es dafür sogar diverse spezielle Licht-Sensoren gibt, aber für meine Experimente reicht es aus zu wissen, ob es Tag oder Nacht und ob es bewölkt oder nicht bewölkt ist. Ein Fotowiderstand und/oder eine Solarzelle (z.B. aus einer dieser Gartenleuchten) würden dazu brauchbare Werte ermitteln....
Problem ist dabei ist, dass die entsprechenden Messwerte in analoger Form (hier eine Spannung) vorliegen. Es wird also ein Analog-Digital-Wandler benötigt, der im Idealfall an einen der vorhandenen Busse angeschlossen werden kann. In Sachen I²C-Bus hatte ich vor einiger Zeit ein entsprechendes ADC-Modul gebaut. Es verfügt über zwei Analog-Eingänge, also Fotowiderstand und Solarzelle können gleichzeitig angeschlossen und via I²C-Bus abgefragt werden. Der Fotowiderstand wurde über einen entsprechend dimensionierten einfachen Spannungsteiler angeschlossen. Die verwendete Solarzelle brachte die erforderliche Spannung ohne irgendwelche Zusatzbeschaltung.
Zwei Diagramm-Beispiele über den Helligkeitsverlauf:
[Bearbeiten] Relative Luftfeuchtigkeit mit einem HIH-4030
Zur Ermittlung der Luftfeuchtigkeit wird ein Sensor vom Typ HIH-4030 der Firma Honeywell verwendet. Dieser Sensor gibt proportional zur Luftfeuchtigkeit eine Spannung im Bereich von ca. 0,9V bis 3,8V aus. Dabei ist die Kennlinie halbwegs linear. Allerdings hängt der ermittelte Wert von der Umgebungstemperatur und der Versorgungsspannung des Sensors ab, welche bei der Berechnung mit einbezogen werden müssen (Einzelheiten dazu sind im Datenblatt zu finden).
Um den Feuchtigkeitssensor an den I²C-Bus anzuschalten, wird ein selbstgebautes ADC-Modul verwendet. Zur Ermittlung der Umgebungstemperatur wird ein LM75-Modul verwendet.
Feuchtigkeit und Temperatur werden zusammen mit dem Timestamp in einer Datenbanktabelle abgespeichert. Die Temperaturkorrektur des Feuchtigkeitswertes erfolgt erst zum Zeitpunkt der Weiterverabeitung der Messdaten. Dabei wird die Versorgungsspannung des Sensors als konstant 5V angenommen.
Ein paar entsprechende Diagramm-Beispiele zum Luftfeuchtigkeitsverlauf:
[Bearbeiten] Luftdruck mit einem BMP085
Zur Bestimmung des Luftdruckes wird ein Sensor vom Typ BMP085 der Firma Bosch verwendet. Dieser Sensor verfügt über ein I²C-Interface und kann Druckwerte zwischen 300 und 1100hPa ermitteln.
Der Sensor ist "ab Werk" kalibriert. Die divesen Korrekturwerte zur Berechnung des realen Druckwertes sind im EEPROM des Schaltkreises abgelegt und können ebenfalls über den I²C-Bus ausgelesen werden. Weiterhin wird zur Berechnung des genauen Druckwertes die Umgebungstemperatur des Sensors benötigt. Glücklicherweise hat der Hersteller gleich einen Temperatursensor in den Schaltkreis integriert, dessen Messwert ebenfalls über den I²C-Bus ermittelbar ist. Das genaue Verfahren zur Berechnung des realen Druckwertes aus den diversen Parametern ist im Datenblatt ausführlich beschrieben.
Ein kleines Problemchen bei der Integration des Sensors in das Gesamtsystem gab es dann doch: die maximale Versorgungsspannung des Schaltkreises beträgt 3,6V. Mein I²C-Bus arbeitet aber mit 5V! Bei der Bestellung des Sensors habe ich diese Geschichte wohl "überlesen", sonst hätte ich gleich einen entsprechenden bidirektionalen Pegelwandler mitgeordert.... Aber man besitzt ja einen Lötkolben und kann sich solch ein Ding selbst bauen! Die Firma Philips beschreibt die Vorgehensweise dazu in einer Application-Note. In verschiedenen Quellen findet man, dass der FET-Transistor BSS138 die idealsten Eigenschaften für diesen Einsatzzweck hat (man sollte sich nicht von der SMD-Bauform abschrecken lassen; mit einer vernünftigen Lötkolbenspitze, einer ruhigen Hand und einer Lupe ist das auch auf Lochraster machbar). Die 3,3V zur Spannungsversorgung des BMP085 werden mit einem Spannungsregler LM317 aus den vorhanden 5V des I²C-Bus generiert.
Der mit dem Sensor gemessene Luftdruck ist der absolute Luftdruck. In den üblichen Wetterberichten ist, um eine Vergleichbarkeit zwischen den unterschiedlichen Standorten gewährleisten zu können, vom relativen Luftdruck die Rede, also der Luftdruck, der in Meereshöhe herrscht. D.h., dass man eine Reduktion auf Meereshöhe vornehmen muss. Für meine Belange reicht die Näherung, dass der Luftdruck um 1hPa pro 8 Meter Höhenunterschied abnimmt....
Hier ein Diagramm-Beispiel für den Luftdruckverlauf:
[Bearbeiten] 1-wire-Bus
[Bearbeiten] Allgemeines
Als Temperatursensoren kommen Schaltkreise mit einer 1-wire-Schnittstelle zum Einsatz. Deshalb sollten wir uns etwas mit dem Bus der Firma Maxim beschäftigen. Folgende Merkmale kennzeichnen einen 1-wire-Bus:
- 1-Wire-, One-Wire-, Eindraht-Bus:
- eine Datenleitung
- zusätzlich eine Masseleitung
- optional eine Stromversorgungsleitung
- serieller, asynchroner und bidirektionaler Datenbus
- Halbduplex-Betrieb
- Singlemaster
- eineindeutige Slaveadressen (64Bit; davon 8Bit Checksumme)
- Datenübertragung erfolgt in 64-Bit-Blöcken
- Stromversorgung der Slaves erfolgt parasitär über einen internen Speicherkondensator
- bei inaktiver Kommunikation wird der Kondensator aufgeladen
- bei aktiver Kommunikation versorgt der Kondensator den IC mit Strom
- reicht dies nicht → zusätzliche Stromversorgungsleitung möglich
Zum Anschluss von 1-wire-Slaves benötigt man einen 1-wire-Bus-Master. Im hier beschriebenen System habe ich einen handelsüblichen USB-Dongle vom Typ DS9490R verwendet, welcher durch das Kernel-Modul ds2490 verwaltet wird.
Darauf aufbauend verwende ich owfs (1-wire Filesystem) zum Auslesen der 1-wire-Slaves. Mit owfs ist es u.a. möglich alle "Register" sämtlicher im 1-wire-Bus befindlichen Slaves als Verzeichnis-Baum ins Filesystem zu mounten. Zum Auslesen oder Beschreiben der Register reichen dann ganz normale Lese- oder Schreib-Kommandos (z.B. cat, echo). Die genauen Einzelheiten kann man der ausführlichen Dokumentation zu owfs entnehmen.
Hier ein paar 1-wire-relevante Ausgaben des Zielsystems:
> dmesg ... [11855239.635745] usb 1-1.4: new full speed USB device using orion-ehci and address 79 [11855239.846726] usb 1-1.4: New USB device found, idVendor=04fa, idProduct=2490 [11855239.853895] usb 1-1.4: New USB device strings: Mfr=0, Product=0, SerialNumber=0 [11855239.863705] usb 1-1.4: configuration #1 chosen from 1 choice [11855241.413969] w1_master_driver w1 bus master: Family 10 for 10.000801b55f40.b9 is not registered. [11855242.965969] w1_master_driver w1 bus master: Family 10 for 10.000801b56e7d.57 is not registered. [11855244.517965] w1_master_driver w1 bus master: Family 81 for 81.0000002e831d.5b is not registered. ... > lsmod Module Size Used by ... ds2490 6430 0 ... > /opt/owfs/bin/owfs -u -m /home/bergeruw/mnt/ow -s 3000 > mount ... OWFS on /home/bergeruw/mnt/ow type fuse.OWFS (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000) ... > ls -al /home/bergeruw/mnt/ow total 4 drwxr-xr-x 1 root root 8 Apr 1 2012 . drwxr-xr-x 4 bergeruw bergeruw 4096 Jul 28 2011 .. drwxrwxrwx 1 root root 8 Nov 29 10:10 10.405FB5010800 drwxrwxrwx 1 root root 8 Nov 29 10:10 10.7D6EB5010800 drwxrwxrwx 1 root root 8 Nov 29 10:10 81.1D832E000000 drwxr-xr-x 1 root root 8 Apr 1 2012 alarm drwxr-xr-x 1 root root 8 Apr 1 2012 bus.0 drwxr-xr-x 1 root root 8 Apr 1 2012 bus.1 drwxr-xr-x 1 root root 8 Apr 1 2012 settings drwxrwxrwx 1 root root 8 Nov 29 10:10 simultaneous drwxr-xr-x 1 root root 8 Apr 1 2012 statistics drwxr-xr-x 1 root root 30 Apr 1 2012 structure drwxr-xr-x 1 root root 8 Apr 1 2012 system drwxr-xr-x 1 root root 8 Apr 1 2012 uncached
[Bearbeiten] Temperatur mit einem DS1820
Zum Ermitteln der Innen- und Außentemperatur werden zwei 1-wire-Temperatursensoren vom Typ DS18S20 verwendet. Beide Schaltkreise sind mit parasitärer Stromversorgung an den 1-wire-Bus angeschlossen, so dass nur zwei Bus-Leitungen notwendig sind. Besonders vorteilhaft ist, dass die Temperatursensoren bereits "ab Werk" kalibriert sind. Die angegebene Genauigkeit von ±0,5°C reicht für den vorgesehenen Einsatzzweck vollkommen aus.
Hier die entsprechenden Diagramm-Bespiele für Innen-/Auẞentemperatur:
[Bearbeiten] RFM12-Funkbrücke
Alle bisher beschriebenen Sensoren sind direkt am Auswertungsrechner via Kabel (I²C, 1-wire) angeschlossen. Durch die begrenzten Leitungslängen (bzw. man will ja auch nicht überall hin Kabel verlegen) sind die Messorte nicht sonderlich optimal. So befindet sich der Feuchtigkeitssensor nicht draussen, der Außentemperatursensor ist an der Südseite meines Hauses platziert und die Lichtsensoren "fangen" auch das Licht meiner Schreibtischlampe auf.
Deshalb kam irgendwann die Idee auf, einen idealen Platz (regengeschützt und keine direkte Sonneneinstrahlung) im Garten zu suchen. Die Verbindung zu diesem Messort sollte über Funk realisiert werden. Entstanden ist eine Funkbrücke, die auf RFM12-Funkmodule basiert:
- Sender: fragt im Minutentakt die angeschlossenen Sensoren ab und sendet die Ergebnisse via Funk an den Empfänger. Angeschlossen sind (derzeit) folgende Sensoren:
- TSL35315 → Helligkeit
- SHT15 → realtive Luftfeuchtigkeit und Temperatur
- TMP36 → ...noch ein Temperatursensor
- Empfänger: ausgelegt als I²C-Slave, welcher am I²C-Bus des Auswerterechners angeschlossen werden kann. Die, über Funk, empfangenen Messwerte werden in einem Array abgelegt und können über den Bus vom Rechner einzeln abgefragt werden.
Detaillierte Informationen zur Funkbrücke und den angeschlossen Sensoren sind auf folgender Wiki-Seite zu finden.
[Bearbeiten] Software
[Bearbeiten] Scripte
Zum Auslesen der Sensoren am 1-wire- und I²C-Bus, zum Generieren der Diagramme für die kleine Webseite und der Ansteuerung des angeschlossenen LC-Displays werden eine Reihe von TCL-Scripte verwendet. Jedes dieser Scripte läuft in einer eigenen Screen-Session, da jeweils ein paar Kontrollausgaben zu den gerade ablaufenden Aktionen getätigt werden.
Folgende Tcl-Scripte laufen derzeit im System:
- i2c_adc_db_neu.tcl → Zyklisches Auslesen der Sensoren am I²C-Bus (jede Minute), Abspeichern der Werte in eine Datenbanktabelle und Generierung des entsprechenden Diagramms für die Webseite (jede zwei Minuten)
- owfs2sqlite.tcl → Auslesen der Sensoren am 1-wire-Bus (jede Minute), Abspeichern der Werte in Datenbanktabellen und Generierung der entsprechenden Diagramme für die Webseite (jede zwei Minuten)
- heatmap_generator.tcl → Generierung der Heatmap-Diagramme für die Webseite (jede zwei Stunden); die Werte werden dazu aus den entsprechenden Datenbanktabellen gelesen
- display_weather.tcl → Auslesen der aktuellen Werte aus den entsprechenden Datenbanktabellen und deren Anzeige auf dem LC-Display (Uhrzeit jede Sekunde; alle anderen Werte jede Minute)
Die Scripte sind hier zu finden. Diverse Parameter innerhalb der Scripte sind den jeweiligen Gegebenheiten anzupassen....
An der Anzahl und Struktur der Scripte merkt man, dass das System "historisch" gewachsen ist. Mit Sicherheit lässt sich einiges zusammenfassen und verbessern....
[Bearbeiten] Datenbank
Zur Aufzeichnung/Archivierung der Messdaten bietet es sich an, eine Datenbank zu verwenden. Da eine serverbasierte Datenbank (wie z.B. MySQL) etwas überdimensioniert ist, habe ich mich für SQLite entschieden, zumal dafür auch ein sehr komfortables TCL-Interface existiert.
Es wurden mehrere Tabellen angelegt:
- eine Tabelle für die 1-wire-Temperatursensoren
- eine Tabelle für die ADC-Werte (Fotowiderstand, Solarzelle) aus der Helligkeitsmessung
- eine Tabelle für den ADC-Wert des Feuchtigkeitssensors und dem Messwert des daneben plazierten Temperatursensor (LM75)
- eine Tabelle für den Luftdruck-Wert und dem dazugehörigen Temperaturwert
Es werden jeweils die Messwerte ansich und der dazugehörige Timestamp abgelegt. Für jede Tabelle wurde ein Index auf dem Timestamp angelegt, um diverse Lesezugriffe zu beschleunigen.
[Bearbeiten] Visualisierung
[Bearbeiten] Diagramme mit gnuplot
Zur Erzeugung der Diagramm-Bilder für die Webseite wird das Kommandozeilen-Tool gnuplot verwendet. Innerhalb verschiedener Tcl-Scripte werden dazu die jeweiligen Messwerte aus den entsprechenden Datenbanktabellen gelesen und angepasst sowie gnuplot über eine Pipe aufgerufen, parametrisiert und die Erzeugung der Diagramm-Bilder gestartet.
Als Darstellungformen wurden zwei Diagramm-Arten gewählt:
- Messwertverlauf über die Uhrzeit → einfaches xy-Diagramm
- Messwertverlauf über Datum und Uhrzeit (also dreidimensional) → Heatmap-Diagramm
[Bearbeiten] Ansteuerung eines LC-Display
Diagramme über die Messwertverläufe auf einer Webseite sind ja sinnvoll und schick, aber was, wenn man gerade keinen Rechner mit einem Browser an hat? Irgendwann erinnerte ich mich an meine Experimente mit einem LC-Display als Statusanzeige unter Linux. Ein USB-Anschluß war am Dockstar noch frei... Nach einigem Suchen fand ich dann auch dieses Teil, modifizierte/erweiterte die damals geschrieben TCL-Scripte etwas und habe jetzt eine Anzeige, welche die aktuellen Werte von:
- Datum/Uhrzeit
- Innen- und Außentemperatur
- Luftfeuchtigkeit
- Luftdruck
ständig anzeigt. Die Daten werden nicht direkt von den Sensoren ermittelt, sondern aus der SQLite-Datenbank gelesen.
Theoretisch könnte man an das Anzeige-Modul noch 6 Tasten anschließen, aber vorerst besteht keine Notwendigkeit dazu.
Die Verwendung jeder anderen geeigneten Lösung einer Anzeige an einem USB-Port ist ebenfalls denkbar (z.B. LCD4Linux oder LCDproc).
[Bearbeiten] ToDo
- ein außentaugliches Gehäuse für den Außentemperatur-, Feuchtigkeitssensor, Fotowiderstand und die Solarzelle; vor allem muss für den Feuchtigkeitssensor eine Lösung gefunden werden, die gewährleistet, dass sich kein Tauwasser auf dem Sensor absetzt (wie machen es die "richtigen" Wetterstationen?) → siehe auch RFM12-Funkbrücke
- eigentlich fehlt jetzt noch die Messung der Windstärke und -richtung; am liebsten wäre mir eine nicht-mechanische Lösung
- naja, die Regenmenge fehlt dann auch noch...
- Bestimmung der Wolkenhöhe: es könnte dazu z.B. ein IR-Thermometer verwendet werden
- Höhe der UV-Strahlung (meine Frau möchte gern wissen, wann sie Sonnencreme benutzen sollte...)