SensorLogger

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

von Rolf Bulla

Motivation

Der fertige Sensorlogger
und hier die Rückseite mit microSD Karte

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

Schaltplan Seite 1
Schaltplan Seite 2

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

Platine mit PCB Antenne

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

S11 Messung am Original
S11 Messung nach der Verkürzung

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

Aussentemperaturverlauf einer Woche

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