SensorLogger
von Rolf Bulla
Motivation
Die Idee zu der folgenden Schaltung ist eigentlich aus der Überlegung entstanden, dass es neben der Verbrauchsaufzeichnung der heimischen Heizung (hier Gas) ganz interessant wäre, auch die Außen und Innentemperatur mit aufzuzeichnen. Schließlich gilt ja, je kälter desto mehr heizen. Eine Temperaturmessung hat man vielleicht ja schon zu Hause im Einsatz in Form einer Wetterstation. Warum also nicht die drahtlose Übertragung der Sensoren zur Wetterstation 'anzapfen'...
Übrigens wird die oben erwähnte Energieerfassung (inkl. Strom und Wasser) über den freien Smart Meter Ansatz von http://www.volkszaehler.org erledigt. Aber dazu nachher noch mehr.
Features
Das Gerät soll also das IT+ Sensorprotokoll empfangen und verstehen und die so erfassten Messwerte an das Smart Meter über Ethernet ins Intra- oder Internet liefern. Um auch Netzwerkunabhängig aufzeichnen zu können wäre ein MicroSD Interface zur Datenspeicherung eine nette Spielerei. Noch mal zusammengefasst:
- Empfang und Dekodierung der IT+ Protokolldaten
- Speichern der Daten auf MicroSD-Karte
- Senden der Messdaten über Ethernet
- kleines Standardgehäuse
- externes Standardnetzteil
- und wie immer Standardbauteile und preiswert
Protokoll
Wenn sich an das IT+ Protokoll wagt, so findet man einige Quellen (siehe Links). Vom Sensor werden so alle 4.5 Sekunden immer 5 Bytes gesendet. Die Frequenz ist af 868MHz festgelegt. Falls der Sensor auch die Luftfeuchtigkeit messen kann, so kommt der Wert mit, wenn nicht dann gibt es einen Fantasiewert (=106). Jeder Sensor verfügt über eine Adresskodierung. Vorsicht es gibt Sensoren, die nach dem Batteriewechsel eine neue Adresse verwenden.. Über die Adresse lassen sich auch mehrere Sensoren parallel auswerten. Zu Beachten ist auch, das keine negativen Werte übertragen werden, da die Temperatur vor der Übertragung immer einen Offset von 40 erhält.
// ##### IT+ Frame #####
// Frame example (5 byte):
// 92h 03h 94h 59h 3Ch --> Addr:32, Temp:-0.6, Hygro:89.0
// 92h 86h 24h 28h DEh --> Addr:40, Temp:22.4, Hygro:40.0
// | || | || || ||
// 9 28 624 28 DE
// | | | | +--> CRC-8 (x8 + x5 + x4 +1)
// | | | +------> Hygro in %
// | | | bit6..0 = hygro value (0..127, 106 = no hygro)
// | | | bit7 = weak battery indicator (0=okay, 1=weak)
// | | | example: 28 --> hygro 40%, battery okay
// | | +-----------> Temp (T+40)*10 in °C
// | | nibble 1 = T10
// | | nibble 2 = T1
// | | nibble 3 = T0.1
// | | example1: 624 --> 62.4 - 40 = 22.4°C
// | | example2: 394 --> 39.4 - 40 = -0.6°C
// | +----------------> SensorID
// | bit7..2 SensorID (0..63)
// | bit1 = Restart flag (0=no restart, 1=restart-->new batt)
// | bit0 = unused (always 0)
// +------------------> Message length (number of nibbles that follow)
// example: 9 --> 9 nibbles follow
Hardware
Als Hardware kommen folgende Komponenten zum Einsatz:
- 868MHz Empfangsmodul mit PCB Antenne
- ATMEL ATmega1284P + ENC28J60 für 100base-T
- microSD Adapter
Empfangsmodul
Für dem Empfang (und wenn mal will auch für das Senden) gibt es ein preiswertes 868MHz Modul RFM12. Es ist ein Universal ISM Band FSK Transceiver und an anderer Stelle schon ausgiebig beschrieben RFM12. Die Kommunikation erfolgt über eine gewöhnliche SPI Schnittstelle im 16-bit Transfer. Die Einstellmöglichkeiten sind so vielseitig, sodass man am Anfang schier verzweifelt, bis der Empfang dann endlich gelingen will. Daher hier mal die bei mir erfolgreiche Init-Sequenz:
// Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
// ← 1 0 0 0 0 0 0 0 el ef b1 b0 x3 x2 x1 x0 0x8008
// 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0x80E7
rf12_trans(0x80E7); // ena TX latch, ena RX FIFO, 868MHz, 12.0pF
// 1 0 0 0 0 0 1 0 er ebb et es ex eb ew dc 0x8208
// 1 0 0 0 0 0 1 0 -------- do on the fly ---------
// ← 1 1 0 0 1 1 0 0 0 ob1 ob0 lpx dly dit bw1 bw0 0xCC77
// 1 1 0 0 1 1 0 0 0 1 1 1 0 1 1 1 0xCC77
rf12_trans(0xCC77); // drv 5/10MHz, low-power OSC, no dith., band width 256kB
// ← 1 1 0 0 0 0 0 0 d2 d1 d0 v4 v3 v2 v1 v0 0xC000
// 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0xC049
rf12_trans(0xC049); // 1.66MHz, 3.1V
// ← 1 0 1 0 f11 f10 f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 0xA680
// 1 0 1 0 0 1 1 0 0 1 1 1 1 1 0 0 0xA67C
rf12_trans(0xA67C); // FREQUENCY 868.300MHz
// ← 1 1 0 0 0 1 1 0 cs r6 r5 r4 r3 r2 r1 r0 0xC623
// 1 1 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0xC613
rf12_trans(0xC613); // DATA RATE 17.241 kbps
// ← 1 0 0 1 0 pi d1 d0 i2 i1 i0 g1 g0 r2 r1 r0 0x9080
// 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0x94A0
rf12_trans(0x94A0); // VDI, fast, 134khz, LNA 0dB, DRRSI -103 dB
// ← 1 1 0 0 1 1 1 0 b7 b6 b5 b4 b3 b2 b1 b0 0xCED4
// 1 1 0 0 1 1 1 0 1 1 0 1 0 1 0 0 0xCED4
rf12_trans(0xCED4); // SYNC=2DD4
// ← 1 1 0 0 0 0 1 0 al ml 1 s 1 q2 q1 q0 0xC22C
// 1 1 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0xC2AC
rf12_trans(0xC2AC); // autolock, dig. filter, mid level
// ← 1 1 0 0 1 0 1 0 f3 f2 f1 f0 sp al ff dr 0xCA80
// 1 1 0 0 1 0 1 0 1 0 0 0 0 0 1 1 0xCA83
rf12_trans(0xCA83); // FIFO level = 8, 2-SYNC, sync fill, FIFO ena, reset off
// ← 1 1 0 0 0 1 0 0 a1 a0 rl1 rl0 st fi oe en 0xC4F7
// 1 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0xC483
rf12_trans(0xC483); // AFC if VDI=0, unlimited range, AFC OE+EN
// ← 1 0 0 1 1 0 0 mp m3 m2 m1 m0 0 p2 p1 p0 0x9800
// 1 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0x9850
rf12_trans(0x9850); // no inv, deviation 90kHz, MAX OUT
// ← 1 1 1 r4 r3 r2 r1 r0 m7 m6 m5 m4 m3 m2 m1 m0 0xE196
// 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0xE000
rf12_trans(0xE000); // NOT USE
// ← 1 1 0 0 1 0 0 0 d6 d5 d4 d3 d2 d1 d0 en 0xC80E
// 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0xC800
rf12_trans(0xC800); // NOT USE
Platine
Das PCB wurde auf das Gehäuse SP 2000 SW von STRAPUBOX abgestimmt. Damit alles einfach reinpasst in SMD wo sinnvoll. Bei Buchsen (Power/Ethernet) bin ich aber immer noch ein Fan von Thru-Hole - wegen der Stabilität. Das Löten fand wieder in der Pizzapfanne statt wie in der c't Hacks beschrieben.
Antenne
An das RFM12-Modul muss noch eine Antenne angeschlossen werden. Üblicherweise 1/4 Lamba also ca. 8,3cm . Da aber noch Patz auf dem PCB war, habe ich mich mal an eine PCB Variante in meanderförmigem Aufbau gewagt. Dazu gibt es eine hübsche Design Note von Texas Instruments (DN024). Das Ergebnis lag aber etwas daneben, da u.a. das [math]\displaystyle{ \epsilon_r }[/math] meines Lieblings-PCB-Machers wohl doch in Wirklichkeit etwas anders ausfiel. Der maximale Gain lag bei ca. 790MHz und ließ sich dann durch Verkürzung nach 868MHz schieben bei endgültigen -6dB gain. Damit ist auch ein Empfang durch Betondecken oder -wände machbar.
Software
Die Software ist mit AVR STudio 6 erstellt und als Debugger steht AVR-Dragon auf dem Basteltisch. Zur Unterstützung ist ein UART I/F mit an Board, das dann über einen Pegelwandler und den RS232/USB Adapter selbst auf meinem MAC die printf-Anweisungen klaglos ausgibt. Ein Command I/F erlaubt auch die direkte Steuerung über die gleiche Schnittstelle. Für den Normalbetrieb ist allerdings auch ein kleiner Web-Server integriert. Das gesamte Paket inkl. Ethernet und SD Unterstützung benötigt ca. 85K FLASH und 12.5K RAM Speicher.
Ausblick
Wer mal die Aufzeichnung live auf meinem WebServer ausprobieren will: http://vz.rbulla.de. Die UUID für die Außentemperatur (in Langenfeld-Rheinland) lautet: e62976c0-7109-11e1-a585-8762f86249c1.
Links
- http://hackaday.com/2011/06/13/reverse-engineering-wireless-weather-stations/ IT+ Protokoll Beschreibung
- http://fredboboss.free.fr/tx29/ IT+ Protokoll Beschreibung
- http://gcrnet.net/node/32 IT+ Protokoll Beschreibung
- http://www.ti.com/lit/an/swra227e/swra227e.pdf Antenna Design Note DN024
- RFM12 Empfangsmodul Beschreibung
- http://www.volkszaehler.org Smart Meter Anwendung
- http://www.heise.de/hardware-hacks/artikel/SMD-Loeten-in-der-Pizzapfanne-1276166.html SMD Löten mit einfachen Mittel
- http://www.reichelt.de Dort gibt es fast alle Bauteile
- http://www.fischer-leiterplatten.de Der PCB Macher