DIY Temperatur und Leuftfeuchte Sensoren mit RFM69CW Funksender

raspberry.tips
raspberry.tips - Raspberry Pi Projekte und Tutorials

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.

Material

Sender

Ich habe direkt wieder 10 Stück der Sensoren gebaut, für ein einzelnen Sender / Sensor lohnt die Bestellung nicht:

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

Bestellung pcb

Bis eure Platinen ankommen könnt ihr mit der IC Programmierung weiter machen :) das ist eine aus meiner absolut einwandfreien Bestellung

sender platine

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.

breadboard-atmel-attiny

Dann verkabeln wir wie folgt. Achtet darauf das ihr die Kerbe im Chip als Orientierungspunkt für die richtige Verkabelung verwendet.

verkabelung-attiny

Bei mir sieht der fertig verkabelte Chip so aus:

verkabelung-attiny

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.

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

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.

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.

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

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.

sudo su
passwd

Ihr müsst dann ein neues Passwort für den Benutzer root angeben.

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.

  1. Öffnet euer Startmenu
  2. In der Suchleiste tippt ihr Remote Desktop Verbindung in den Ergebnissen wählen wir dann Remote Desktop Verbindung
    1. Alternativ: Startmenu > Ausführen und dann mstsc eingeben
  3. In der Computer box wird die IP-Adresse oder der Name eures Raspberry Pi eingegeben, klickt dann Verbinden
    1. Entweder die IP-Adresse eingeben, könnt ihr auf dem Pi z.B. via Terminal mit dem Befehl ifconfig herausfinden
    2. Oder ihr gebt den Computernamen ein, das ist im Standard raspberrypi

rdp-verbindung

Gebt im Anmeldefenster als Benutzer root und euer vorher vergebenes Passwort ein

rdp-verbindung-anmelden

Auf dem Desktop des RasPi starten wir über das Start Menu dann die Arduino IDE

arduino-ide

Wählt, falls eine Rückfrage kommt, unbedingt “/root/sketchbook” als Ordner für eure Sketches

sketchbook

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).

open-sketch

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.

node-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.

bootloader-burn

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.

done-uploading

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

RFM69CW-Platzierung      RFM69CW-Platzierung 2

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.

IC-Sockel       IC-Sockel

Nun können wir die beiden Kondensatoren C1 & C2 auflöten, die Einbaurichtung ist hierbei egal.

Kondensatoren

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

DHT22-mit-Widerstand     DHT22-PINS

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 ;)

Widerstand-DHT22     Widerstand-10k

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

Antenne und Stromanschluss  Antenne und Stromanschluss 2

Steckt nun noch den ATTiny auf den IC Sockel mit der Kerbe zum Kondensator. Euere fertige Platine sollte dann so aussehen

Fertige Platine

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.

Im gehäuse

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.

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.

rfm69pi-installation

Startet dann euren Pi durch einstecken des Stromkabels. Zum Auslesen der Daten haben benötigen wir nun zwei Komponenten:

  1. EmonHUB – das ist die Software welches das Bindeglied zwischen Empfänger und EmonCMS ist
  2. 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:

emoncms-1

Pro Key / wert habe ich erst mit 0.01 multipliziert und dann den Wert in den Feed gespeichert (dieser wird dann automatisch erstellt).

emoncms-2

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:

emoncms-3

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.

define Schlafen_Temperatur HTTPMOD http://<IP-Adresse>/feed/timevalue.json?apikey=XXXXXXX&id=34 300
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).

sudo raspbian-config

Dann auf Advanced > A7 Serial > No einstellen und neustarten. Danach folgende Datei anpassen

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

sudo nano nano /boot/cmdline.txt

Eure Datei sollte nach dem bearbeiten folgenden Inhalt haben

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

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.

#######################################################################
#######################    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,

DIY Temperatur und Leuftfeuchte Sensoren mit RFM69CW Funksender
raspberry.tips


wallpaper-1019588
Classic Cantabile Ukulele Walnuss Set im Test
wallpaper-1019588
peppermint anime startet neuen “Black Friday”-Sale
wallpaper-1019588
[Comic] Star Wars – Darth Vader [Deluxe 2]
wallpaper-1019588
Disney+ gibt drei neue Simulcast-Titel bekannt