Vor einiger Zeit habe ich bereits Low-Cost Selbstbau Temperatur- und Luftfeuchte-Messer auf Basis des Atmel ATTiny84 und des RFM12B 433MHz Funkmodul gebaut. Da ich etwas Zeit hatte wollte ich weitere Sender bauen und musste feststellen das der RFM12B Sender nur noch schwer zu bekommen war. Auf der Suche nach einer Alternative bin ich auf den RF69CW gestoßen, dieser hat die gleiche PIN Belegung wie das RFM12B Funkmodul und soll was die Reichweite angeht besser funktionieren. In diesem Tutorial beschreibe ich den Aufbau des 433MHz Senders auf Basis des TinyTX PCB Layout mit RFM69CW 433MHz Modul und DHT22 Temperatur- / Luftfeuchtemesser.
Inhaltsverzeichnis
Material
Sender
Ich habe direkt wieder 10 Stück der Sensoren gebaut, für ein einzelnen Sender / Sensor lohnt die Bestellung nicht:
- Atemle ATTINY84A-PU Chip – 3€
- Sensorgehäuse mit Schlitzen in weiss 3,90€
- TinyTX v3 PCB von SeeedStudio 1€
- RFM69CW 433MHz Funksender 4,60€
- DHT22 Feuchte-und Temperatur-Sensor 3,50€
- Batteriehalter für 3xAAA (Nr: HALTER 3XAAAK bei Reichelt) 0,74€
- 2x Keramikkondensator 100N (Nr: X7R-5 100N bei Reichelt) 0,04€
- IC Sockel 14 Polig (Nr: GS 14 bei Reichelt) 0,05€
- Kohleschichtwiderstand 10 K-Ohm (Nr: 1/4W 10K) 0,10€
- Klingeldraht als Antenne (Nr: KLINGELDRAHT bei Reichelt)
- 3 x AAA Batterien 1€
Empfänger
- RFM69PI als Empfänger mit Emonhub 20€, oder im Selbstbau für etwas weniger, ich empfehle und verwende das fertige Modul.
Raspberry Pi
- Raspberry Pi 3 mit Zubehör z.b. als Starter Kit
- GPIO Breakout 40Pin für Pi 2 / 3
- Breadboard und Jumperkabel (male/female) zum Programmieren der ICs
- Alternativ ein GPIO Breakout und male / male Kabel
Wekzeug
- Lötkolben mit einer dünnen Spitze und Lötzinn
- Eine Dritte-Hand
- Einen Seitenschneider ggf. andere Zängchen
- Kleine Schraubenzieher
Platinen Bestellung
Die Bestellung der Platinen habe ich dieses mal via Seeedstudio erledigt, der Versand dauert zwar einige Tage, der Preis und die Qualität überzeugten mich aber. PS: bestellt niemals via UPS Express, die wollen im Nachhinein noch 20€ Pauschale für das Handling durch den Zoll obwohl ich unter dem zu verzollenden Warenwert lag, absolute Abzocke!
Wir bestellen das Produkt Fusion PCB von Seeedstudio. Ladet euch das Sender-Gerber File herunter und ladet es bei seeedstudio im Bestell-Formular hoch, wählen hierbei nichts besonderes aus, die Platine ist absolut Standard
Bis eure Platinen ankommen könnt ihr mit der IC Programmierung weiter machen :) das ist eine aus meiner absolut einwandfreien Bestellung
Breadboard verkabeln zum Programmieren des Chips
Nun benötigen wir die Atmel ICs, ein Breadboard und Male / Female Jumperkabel um unsere ICs Programmieren zu können. Steckt euren ersten Attiny ganz vorsichtig auf das Breadboard, evtl. müsst ihr die PINs etwas zurecht biegen. Wichtig! die PINs der beiden seiten müssen so auf dem Breadboard stecken das diese nicht untereinander kurzgeschlossen werden.
Dann verkabeln wir wie folgt. Achtet darauf das ihr die Kerbe im Chip als Orientierungspunkt für die richtige Verkabelung verwendet.
Bei mir sieht der fertig verkabelte Chip so aus:
IC Programmieren
Als erstes programmieren wir den Atmel ATTiny 84 IC mit dem passenden Programm, das besteht aus dem Bootloader welcher uns den C-Code ausführen lässt und dem Sende-Code. Dieser liest Daten vom DHT22-Sensor und sender über den RFM69CW via 433MHz.
Um überhaupt Programmieren zu können müssen wir unseren Raspberry Pi mit der passenden Software einrichten. Nach der Grundeinrichtung des Pi (Teil 2 & 3) verbinde ich mich via SSH mit dem Pi und installiere die notwendige Software.
1 2 |
sudo apt-get install -y arduino git-core gcc-avr lxde xrdp avrdude |
Wir benötigen noch eine angepasst Version von AVRDude um unsere Chips über die GPIOs des Pi Programmieren zu können
1 2 3 4 5 6 |
sudo su wget http://raspberry.tips/wp-content/uploads/2014/11/avrdude_5.10-4_armhf.deb wget http://raspberry.tips/wp-content/uploads/2014/11/avrdude-doc_5.10-4_all.deb dpkg -i avrdude_5.10-4_armhf.deb dpkg -i avrdude-doc_5.10-4_all.deb |
Dann legen wir uns einige Arbeitsverzeichnisse an, und clonen uns dort via git die Libraries für das RFM69Pi Modul, und die JeeLib (Treiber für Wireless Module) und die DHT22 Sensoren Library. Die Libraries verwenden wir später in unserem Programm zum versenden der Daten, das Programm wird auf den ATtiny Chip geschrieben.
1 2 3 4 5 6 7 8 9 10 |
sudo su mkdir -p /root/sketchbook/hardware/tiny/variants/tiny8 mkdir -p /root/sketchbook/hardware/tiny/variants/tiny14 mkdir -p /usr/share/arduino/hardware/arduino/ mkdir -p /root/sketchbook/libraries/DHT22 git clone https://github.com/jcw/jeelib /root/sketchbook/libraries/JeeLib git clone https://github.com/nethoncho/Arduino-DHT22 /root/sketchbook/libraries/DHT22 wget -O/usr/share/arduino/hardware/arduino/programmers.txt http://raspberry.tips/wp-content/uploads/2014/11/programmers.txt |
Zusätzlich benötigen wir noch Code für den ATtiny Chip, diese werden benötigt um unser Programm (Sketch) auf dem Chip laufen zu lassen. Darin enthalten ist der Bootloader des Chips und die PIN Definitionen.
1 2 3 4 5 6 7 8 9 |
sudo su cd /root/sketchbook/hardware/ wget http://raspberry.tips/wp-content/uploads/2014/11/arduino-tiny-0150-00181.zip unzip arduino-tiny-0150-00181.zip && rm arduino-tiny-0150-00181.zip cd tiny && [ -d avr ] && cd avr; mv -f * ../; cd ..; rm -rf avr wget -O/root/sketchbook/hardware/tiny/boards.txt http://raspberry.tips/wp-content/uploads/2014/11/boards.txt wget -O/root/sketchbook/hardware/tiny/variants/tiny8/pins_arduino.h http://raspberry.tips/wp-content/uploads/2014/11/pins_arduino1.h wget -O/root/sketchbook/hardware/tiny/variants/tiny14/pins_arduino.h http://raspberry.tips/wp-content/uploads/2014/11/pins_arduino-21.h |
Als letztes holen wir uns das Sketch, also das eigentliche Programm, für den Sender
1 2 |
sudo mkdir -p /usr/share/arduino/Send/ sudo wget -O/usr/share/arduino/Send/Send.ino http://raspberry.tips/wp-content/uploads/2014/12/DHT22-PCB-Version.txt |
Wichtig! Wir setzen nun das root passwort um uns mit xRDP als root anmelden zu können.
1 2 |
sudo su passwd |
Ihr müsst dann ein neues Passwort für den Benutzer root angeben.
1 2 3 |
Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully |
Dann stellen wir eine Remotedesktopverbindung von unserem Windows Rechner auf den Raspberry Pi her.
- Öffnet euer Startmenu
- In der Suchleiste tippt ihr Remote Desktop Verbindung in den Ergebnissen wählen wir dann Remote Desktop Verbindung
- Alternativ: Startmenu > Ausführen und dann mstsc eingeben
- In der Computer box wird die IP-Adresse oder der Name eures Raspberry Pi eingegeben, klickt dann Verbinden
- Entweder die IP-Adresse eingeben, könnt ihr auf dem Pi z.B. via Terminal mit dem Befehl ifconfig herausfinden
- Oder ihr gebt den Computernamen ein, das ist im Standard raspberrypi
Gebt im Anmeldefenster als Benutzer root und euer vorher vergebenes Passwort ein
Auf dem Desktop des RasPi starten wir über das Start Menu dann die Arduino IDE
Wählt, falls eine Rückfrage kommt, unbedingt „/root/sketchbook“ als Ordner für eure Sketches
Dann öffnen wir unseren fertigen Code für den Sender über das Menu File > Open klickt im Dialog auf Arduino > Send > Send.ino (oder navigiert im Dateisystem nach /usr/share/arduino/send/ und öffnet die Datei von Dort).
WICHTIG! Wir müssen nun folgende Einstellungen in der Arduino IDE vornehmen:
- Tools > Board > ATtiny84 (internal 8 MHz clock)
- Tools > Programmer > Raspberry Pi GPIO (on-board)
Da jeder Sender eine eigene ID besitzen muss müsst ihr unbedingt im Code die „myNodeID“ für jeden Chip eindeutig anpassen. Also der erste Chip 16, der zweite 17 usw. schreibt am Besten nach dem Programmieren mit einem Bleistift auf jeden Chip dessen ID.
Dann klicken wir unter Tools auf Burn Bootloader die IDE meldet unten Done burning bootloader wenn alles geklappt hat, falls nicht überprüft die Verkabelung und auf korrekte installation von AVRDude und der Files wie oben beschrieben.
Dann schreiben wir das Sketch auf den Chip, das erledigen wir über „File“ > „Upload Using Programmer“. Auch hier meldet die IDE nach kurzer Zeit mit Done Uploading wenn alles geklappt hat.
Wiederholt diese Schritte für all eure Chips, vergesst nicht die ID anzupassen.
Sensor zusammenbauen
Ich löte als erstes den RFM69CW Chip auf die Platine, achtet darauf das ANT auf ANT liegt! Zum löten klemmt ihr am besten von einer Seite mit der dritten Hand fest und setzt die ersten Lötpunkte
Danach kommt der 14 Polige IC Sockel auf die Platine, hier gibt es nichts spezielles zu beachten. Wer es ganz richtig machen will achtet darauf das die Kerbe des Sockels zum C2 zeigt.
Nun können wir die beiden Kondensatoren C1 & C2 auflöten, die Einbaurichtung ist hierbei egal.
Der wichtige Teil kommt nun, wir müssen unseren DHT22 Messer auflöten. Achtet darauf das PIN3 des DHT22 nicht verwedet wird
- PIN4 kommt auf GND
- PIN3 biegt ihr nach hinten oder schneidet ihn ab!
- PIN2 kommt auf 10
- PIN1 kommt auf 9
Wir brauchen nun noch den 10K Widerstand zwischen PIN 1 & 2 des DHT22, also in der zweiten Reihe zwischen 9 & 10. Ich habe ihn extra etwas unschön aufgelötet um bessere Photos zu bekommen, ihr könnt das besser ;)
Als letztes löten wir noch den Batteriehalter und die Antenne auf.
- Die Antenne besteht aus 165mm Klingeldraht
- Achtet bei Batteriehalter auf die richtige Polung
Steckt nun noch den ATTiny auf den IC Sockel mit der Kerbe zum Kondensator. Euere fertige Platine sollte dann so aussehen
Die Platine baue ich dann in das Sensorgehäuse ein, das kann ein bisschen fummelig sein, achtet darauf das der Sensor und die Antenne oben durch die Schlitze des Gehäuses kommen bzw. platziert werden. Falls der DHT22 nicht richtig passt könnt ihr am oberen Teil des Gehäuses die Halterung abschneiden.
Das war auch schon der Zusammenbau der Sender. Schaltet diese einfach an und beginnt mit der Einrichtung des Empfängers.
Empfänger einrichten
Als Empfänger kommt mein Raspberry Pi mit RFM69Pi Empfangsmodul zum Einsatz den ich vorher zum Programmieren der Atmel ICs verwendet habe. Als erstes müssen wir die Serial Konsole anpassen und beim Pi 3 das Bluetooth deaktivieren.
1 2 3 |
sudo sh -c "echo 'dtoverlay=pi3-disable-bt' >> /boot/config.txt" sudo systemctl disable hciuart sudo shutdown now |
Wichtig! Steckt euren RasPi nun vom Strom ab und verbindet erst dann dann das RFM69PI Modul. Das Modul kommt ganz links auf die GPIO Leiste mit der Platine über den RasPi.
Startet dann euren Pi durch einstecken des Stromkabels. Zum Auslesen der Daten haben benötigen wir nun zwei Komponenten:
- EmonHUB – das ist die Software welches das Bindeglied zwischen Empfänger und EmonCMS ist
- EmonCMS – das ist das System zum Aufzeichnen und Visualisieren der Daten, ihr müsst emoncms nicht auf dem Pi installieren sonder könnt den Dienst von https://emoncms.org/ verwenden
Die Installation von EmonHUB und EmonCMS ist sehr gut im OpenEnergyMonitor Projekt beschrieben. Das Prinzip von EmonCMS ist recht simpel, alles was Daten zuliefert hat einen Input, über den Input bringen wir die Daten in das richtige Format und speichern sie in einem Feed. Sobald EmonHUB Daten abliefert taucht automatisch für jeden Sensor ein Input mit 3 Werten auf, Temperatur, Batterie Spannung und Luftfeuchte.
Die Werte des Inutps müssen dann mit 0,01 Multipliziert und jeweils in einem Feed gespeichert werden. Hier einer Meiner Inputs:
Pro Key / wert habe ich erst mit 0.01 multipliziert und dann den Wert in den Feed gespeichert (dieser wird dann automatisch erstellt).
Sobald ihr alle Feeds beisammen habt könnt ihr über die Dashboards beginnen die Ausgabe grafisch aufzubereiten. bei mir sieht das ganze dann so aus:
Viel Spaß!
Daten aus EmonCMS in FHEM übertragen
Wer die Daten aus EmonCMS dann z.B. in FHEM oder in anderen Systemen verwenden will kann diese via JSON abfragen, hier ist meine FHEM Configuration zum Abfragen eines Sensors. Die IP, den API Key und die ID (34) müsst ihr an euer EmonCMS anpassen.
1 2 3 4 5 6 7 8 9 10 11 12 |
define Schlafen_Temperatur HTTPMOD http:// attr Schlafen_Temperatur userattr reading01Name reading01Regex reading02Name reading02Regex attr Schlafen_Temperatur group Temperatur attr Schlafen_Temperatur icon temp_temperature attr Schlafen_Temperatur reading01Name Zeit attr Schlafen_Temperatur reading01Regex localtime("time":"([\d]+)) attr Schlafen_Temperatur reading02Name Temperatur attr Schlafen_Temperatur reading02Regex "value":"([\d\.]+) attr Schlafen_Temperatur room Temperatur attr Schlafen_Temperatur stateFormat {sprintf("Temperatur %.1f C", ReadingsVal($name,"Temperatur",0))} attr Schlafen_Temperatur timeout 5 attr Schlafen_Temperatur verbose 2 |
Troubleshooting RFM69PI
Ich hatte mit dem neuem RFM69PI und dem aktuellen Jessie Image etwas Probleme, als erstes muss der Serial Port freigegeben werden (das die Serial Konsole diesen nicht mehr verwendet).
1 |
sudo raspbian-config |
Dann auf Advanced > A7 Serial > No einstellen und neustarten. Danach folgende Datei anpassen
1 |
sudo nano /boot/config.txt |
Dort enable_uart=1 am Ende der Datei in eine neue Zeil einfügen da raspi config den Port komplett deaktiviert.
Dann muss noch die cmdline.txt angepasst werden
1 |
sudo nano nano /boot/cmdline.txt |
Eure Datei sollte nach dem bearbeiten folgenden Inhalt haben
1 |
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait |
Nach einem Reboot mit sudo reboot muss noch die Firmware aktualisiert werden
1 2 |
git clone https://github.com/openenergymonitor/RFM2Pi.git sudo /home/pi/RFM2Pi/update-RFM69.sh |
Meine emonbug.conf
Das ist meine Emonhub.conf ihr müsst die URL und den API-Key (aus EmonCMS unter Setup > My Account) anpassen. Falls ihr EmonCMS.org benutzt oder EmonCMS selbst irgendwo hostet müsst ihr unbedingt die Zeile url zeile auskommentieren (entfernen der Raute #) und die passende IP / URL eintragen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
####################################################################### ####################### emonHub settings ####################### ####################################################################### [hub] # loglevel must be one of DEBUG, INFO, WARNING, ERROR, and CRITICAL # see here : http://docs.python.org/2/library/logging.html loglevel = ERROR ####################################################################### ####################### Reporters ####################### ####################################################################### [reporters] # This reporter sends data to emonCMS [[emonCMS]] Type = EmonHubEmoncmsReporter [[[init_settings]]] [[[runtimesettings]]] url = http://192.168.178.123 apikey = xxxxxxxxx ####################################################################### ####################### Interfacers ####################### ####################################################################### [interfacers] # This interfacer manages the RFM2Pi module [[RFM2Pi]] Type = EmonHubJeeInterfacer [[[init_settings]]] com_port = /dev/ttyAMA0 [[[runtimesettings]]] group = 210 frequency = 433 baseid = 22 ####################################################################### ####################### Nodes ####################### ####################################################################### [nodes] # List of nodes by node ID # 'datacode' is default for node and 'datacodes' are per value data codes. # if both are present 'datacode' is ignored in favour of 'datacodes' [[99]] datacode = h datacodes = l, h, h, h, |