´

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

Schaltung 1-Wire BarometerPDF

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.

1-Wire Barometer auf PCB

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.

1-Wire Barometer Scratchpad

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.

1-Wire BMP085 Kontrollbyte

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  

#2 fuseTobias Müller 2014-09-14 18:57
Wie der Auslieferungszustand. Eventuell CKDIV8 auf so setzen, das er nicht durch 8 teilt. Das wird aber auch im Programm umgestellt. Der AVR lässt sich aber so schneller programmieren und startet etwas schneller.
#1 fuseOleg 2014-09-13 23:53
Welche Bits sollten in die Steuerung programmiert werden?

You have no rights to post comments

Zum Seitenanfang