Wetterdaten mit Linux aufzeichnen und verarbeiten
Aus BraLUG-Wiki
(→I2C-Bus) |
|||
Zeile 52: | Zeile 52: | ||
===Allgemeines=== | ===Allgemeines=== | ||
+ | Ein Teil der eingesetzten Sensoren sind für den [http://www.i2c-bus.org 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 | ||
+ | * I2C (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 Hersteller festgelegt | ||
+ | Um I²C-Slaves (in unserem Fall die Sensoren) an einem Linx-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 detailiertere Grundlagen und Experimente mit diesem Adapter zu finden. | ||
+ | |||
+ | |||
+ | Hier ein paar I²C-relevante Ausgaben auf meinem Zielsystem: | ||
<pre> | <pre> | ||
> dmesg | > dmesg | ||
Zeile 87: | Zeile 101: | ||
70: -- -- -- -- -- -- -- 77 | 70: -- -- -- -- -- -- -- 77 | ||
</pre> | </pre> | ||
+ | |||
+ | 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. | ||
===Temperatur mit einem LM75=== | ===Temperatur mit einem LM75=== |
Version vom 29. November 2012, 12:11 Uhr
...der Artikel befindet sich noch im Aufbau!
Inhaltsverzeichnis |
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ß!
Hardware
Überblick
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.:
Neben dem eigentliche Basis-Betriebssystem wurden für die Wetterdatenaufzeichnung noch diverse 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)
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).
I2C-Bus
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
- I2C (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 Hersteller festgelegt
Um I²C-Slaves (in unserem Fall die Sensoren) an einem Linx-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 detailiertere 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.
Temperatur mit einem LM75
Helligkeit mit Fotowiderstand und Solarzelle
realtive Luftfeuchtigkeit mit einem HIH-4030
Luftdruck mit einem BMP085
1-wire-Bus
Allgemeines
> 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. ... > /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
Temperatur mit einem DS1820
Software
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 Zugriffe zu beschleunigen.
Visualisierung
Diagramme mit gnuplot
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).
ToDo
- ...diese Wiki-Seite :-)
- 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?)
- 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...