1-Wire Barometer
Einführung
Da ich meine WS300 durch eine CUNO ersetzt habe, fehlt mir der Luftdrucksensor bei der Wetterdatenerfassung. Seit einiger Zeit habe ich schon den I2C Drucksensor BMP085 von Bosch ein meiner Schatzkiste. Diesen hatte ich mal als Breakout Variante bei watterott.com mit bestellt. Viele meiner Sensoren werden über den 1-Wire-Bus ausgelesen, so liegt der Versuch nahe mit Hilfe der AVR-1-Wire Emulation einen 1-Wire-Drucksensor zu bauen. Die Kosten für den gesamten Sensor betragen etwa 22 €. Wer sich den BMP085 in China besorgt und die winzigen Anschlüsse selbst Löten will, kann durchaus unter 10 € kommen. Der genauere Drucksensor BMP180 wird mit genau den gleichn Befehlen gesteuert und kann ohne Softwareänderung verwendet werden. Der Preis ist etws höher und die Anschlüsse sind anders.
Schaltung
Auf dem Breakout Board von watterott.com sind schon zwei Pullup-Widerstände und ein 100nF Kondensator enthalten. Der Chip selbst kann mit maximal 3,6 V betrieben werden. Deshalb ist ein Festspannungsregler und zwei MOSFET-Transistoren zur Pegelwandlung notwendig. Als Mikrocontroller kommt ein ATMega48 zum Einsatz. Alternativ, aber nicht unbedingt billiger, könnte auch ein ATTiny mit USI (Universal Serial Interface) zum Einsatz kommen.
Ein paar kleine Fotos vom Board. Die MOSFET-Transistoren sind als SMD-Transistoren zwischen die Ringe gelötet und deshalb schlecht zu sehen.
Controller Firmware und 1-Wire Ansteuerung
Die Firmware steht hier (1_Wire_bmp085_1.1.zip) zum download bereit. Erstellt ist sie für den ATMega48, müsste aber ohne Änderungen auf einen ATMega88 oder ATMega168 laufen. Der Code zum Abfragen des BMP085 und der recht komplexen Berechnung der realen Druckwerte gibt es für diesen Controller bereits bei watterott.com zum herunterladen. Allerdings waren darin ein paar kleine Fehler enthalten und die Oversampling Funktion war nicht integriert. Diesen Code habe ich noch eingefügt. Zum Testen des 1-Wire Barometers habe ich ein kleines Programm (test_1_Wire_bmp085.zip) geschrieben. Es basiert auf den 1-Wire SDK von Maxim-Dallas und sollte ohne Probleme unter Windows laufen. Alle wichtigen Funktionen mit Erklärungen (englisch) sind in dieser kleinen "Bibliothek" zusammengefasst. Auf die 1-Wire Technologie und die Standard-Befehle gehe ich hier nicht näher ein. Diese sind in jedem Datenblatt eines 1-Wire-Chips zu finden.
Aufbau des Scratchpads
Das Scratchpad ist der zentrale Speicher des 1-Wire Gerätes. Je nach dem welcher Befehl an das 1-Wire Barometer gesendet wird kann der Inhalt des Scratchpads verschieden interpretiert werden.
Wird Druck und Temperatur gemessen (CONVERT), dann stehen die Werte jeweils als 32-bit-Integer Scratchpad. Die Temperatur muss durch 10 geteilt werden um die Werte in °C zu erhalten. Der Druck ist in Pa angegeben (also durch 100 für hPa). Für die Abfrage der im BMP085/BMP180 gespeicherten Werte zur Kalibrierung ist das Scratchpad in 4 16-bit-Integer eingeteilt. Diese Abfrage ist nur zum Testen notwendig. Die Berechnung der realen Werte mit Hilfe dieser Kalibrierwerte übernimmt der ATMega48. Die Berechnung des CRC-Wertes ist zum Beispiel im Datenblatt des DS18B20 beschrieben.
Mit dem Configuration Regeister können folgende verschiedene Einstellungen vorgenommen werden.
OSS | 1 -> Oversampling eingeschaltet (oss mode 3) |
MULTI | 1 -> 16 Messungen werden durchgeführt und der Mittelwert ausgegeben |
CONT | 1 -> Es werden kontinuierlich Messungen durchgeführt (Weitere Beschreibung beachten!) |
BUSY | 1 -> eine Messung wird gerade durchgeführt, die gesendeten Werte sind ungültig |
Im CONT-Modus wird mit Bit 4 bis Bit 7 die Zeit zwischen zwei Messungen eingestellt:
0x0x bedeutet eine Minute
0xFx bedeutet 16 Minuten
allgemein 1+(Configuration Regeister>>4) Minuten
Des Weitern werden im CONT-Modus die Befehle 0x44 (CONVERT) und die GET_CALIBRATION Befehle (0x47, 0x48 und 0x49) ignoriert. Beim Auslesen sollte immer auf das BUSY-Flag geachtet werden. Bei gesetzen Flag kann das Auslesen nach einer kurzen Pause (z.B. 1 s) nochmals erflolgen.
Übersicht über die 1-Wire Befehle des Gerätes
Befehl | Beschreibung | Code | Busaktivität nach dem Befehl |
MATCH_ROM | Vergleicht die übertragene ID mit der Geräte ID und aktiviert bei gleichheit das Gerät |
0x55 | Empfängt die 8 Byte der ID |
SEARCH_ROM | Aktiviert den Search-Rom-Algorithmus | 0xF0 | Search-Rom-Algorithmus |
CONVERT | Messen von Temperatur und Druck sowie Umrechnen und Schreiben der Ergebnisse ins Scratchpad |
0x44 | - |
GET_CALIBRATION1 | Schreibt die Kalibrierwerte ac1, ac2, ac3 und ac4 in das Scratchpad |
0x47 | - |
GET_CALIBRATION2 | Schreibt die Kalibrierwerte ac5, ac6, b1 und b2 in das Scratchpad |
0x48 | - |
GET_CALIBRATION3 | Schreibt die Kalibrierwerte mb, mc und md in das Scratchpad. Der vierte Wert ist 0. |
0x49 | - |
WRITE_SCRATCHPAD | Schreibt das Configurations Register | 0x4E | Gerät empfängt 1 Byte |
READ_SCRATCHPAD | Liest das Scratchpad mit Configurations Register und CRC8 |
0xBE | Gerät sendet 10 Byte |
Die Befehle READ_ROM und SKIP_ROM funktionieren nur, wenn das Gerät allein an einem 1-Wire-Master angeschlossen ist. Da dieser Fall für das 1-Wire Barometer wahrscheinlich nie eintritt, sind sie nicht mit implementiert. Wer sie dennoch benötigt kann sie aus dem Code im Menüpunkt "1-Wire Device mit AVR" entnehmen.
Ein typischer Zugriff auf das Gerät sieht folgendermaßen aus:
Master Aktivität | Daten (LSB First) | Bemerkung |
Tx | Reset | Master zieht den Bus auf Low |
Rx | Presence | Gerät antwortet (mit Low auf Bus) |
Tx | 0x55 | Match-Rom Prozess |
Tx | 1-Wire ID | Master sendet die ID, Slave vergleicht mit interner ID |
Tx | 0x4E | Befehl Write-Scratchpad |
Tx | Configuration | 1 Byte für die Konfiguration |
Tx | Reset | Master zieht den Bus auf Low |
Rx | Presence | Gerät antwortet (mit Low auf Bus) |
Tx | 0x55 | Match-Rom Prozess |
Tx |
1-Wire ID | Master sendet die ID, Slave vergleicht mit interner ID |
Tx | 0x44 | Messvorgang starten |
Wait | - | Warten bis Messung und Konvertierung abgeschlossen sind |
Tx | Reset | Master zieht den Bus auf Low |
Rx | Presence | Gerät antwortet (mit Low auf Bus) |
Tx | 0x55 | Match-Rom Prozess |
Tx | 1-Wire ID | Master sendet die ID, Slave vergleicht mit interner ID |
Tx | 0xBE | Master gibt den Befehl zum Senden des Scratchpad |
Rx | 10 Bytes |
Master empfängt den Inhalt des Scratchpad |
Die Konfiguration muss nur nach dem Anschalten des Gerätes geschrieben werden. Alle Bits sind zunächst 0. Im Continuous-Modus (CONT=1) kann der Befehl CONVERT entfallen. Der Sensor muss nur ausgelesen werden.
Einsatz
Wenn alles funktionier gibt das 1-Wire-Barometer den Luftruck recht genau zurück. Kein Vergleich mit der WS300 die nur in Werte in 1 hPa Schritten liefert. Der Luftdruck vom 09.08.2012 sieht z.B. so aus:
Ab etwa 9 Uhr ist Oversampling und Multimess ausgeschaltet. Es ist ein deutlicher Unterschied zu erkennen.
Kommentare