Home > Hausautomatisierung > DIY Temperatur und Leuftfeuchte Sensoren mit RFM69CW Funksender

DIY Temperatur und Leuftfeuchte Sensoren mit RFM69CW Funksender

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

Wekzeug

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.

Wir benötigen noch eine angepasst Version von AVRDude um unsere Chips über die GPIOs des Pi Programmieren zu können

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.

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.

Als letztes holen wir uns das Sketch, also das eigentliche Programm, für den Sender

Wichtig! Wir setzen nun das root passwort um uns mit xRDP als root anmelden zu können.

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

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.

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.

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

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

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

Eure Datei sollte nach dem bearbeiten folgenden Inhalt haben

Nach einem Reboot mit sudo reboot muss noch die Firmware aktualisiert werden

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 Stern2 Sterne3 Sterne4 Sterne5 Sterne (3 votes, durchschnittlich: 5,00 von 5)
Loading...

Über raspberry.tips

10 Kommentare

  1. Wie ist denn die Reichweite ? würde das vom Keller bis zum Pi ggf. gehen ? oder sind 2 Betondecken und Zwischenmauern dann doch zu viel ? ;)

    Bin gerade am einlesen (und da kam dieser Artikel genau richtig), wie ich ggf. für alle Kellerräume Feuchtigkeitssensoren installiere. Weil wenn ich überall Hygrometer kaufe und manuell ablese, kommt mich auch nicht billiger, schätze ich mal….
    und zumindest ein Pi2 würde noch unbenutzt rumliegen….

  2. ups. beim editieren irgendwie vom Keller bis in den ersten Stock verloren gegangen ;)

  3. Hi. Erstmal danke für die Anleitung, ist echt super geschrieben.
    Ich habe nur ein Problem mit Arduino IDE:
    Ich kann den Pfad “/root/sketchbook” nicht eingeben… Die Software findet dann keine Ordner.
    Die Ordner sind aber vorhanden. Gibt es da eine Lösung?
    Im Moment kann ich unter “Tools > Board >” auch nicht “ATtiny84 (internal 8 MHz clock)” auswählen. Der ist schlichtweg nicht vorhanden… Ändert sich das sobald ich den richtigen Pfad eingegeben habe?

  4. Hallo, super Anleitung!
    Mich würde aber ebenfalls die Reichweite sehr intessieren, denn ich gedenke in jedem Zimmer so einen Sensor zu platzieren, dass ganze würde sich aber dann über 3 Stockwerke ziehen. Ist das mit der Kombination Sender/Empfänger möglich?

    Gruß Andui

  5. Hallo,

    leider werden bei mir keine Daten gesendet.
    Wenn ich in der loop Funktion eine LED blinken lasse, blinkt sie nur bis zur Funktion rfwrite();.
    Dannach blinkt die LED nicht mehr, die Blink aufrufe die ich vorher definiert habe funktionieren auch dann nicht mehr,
    alsob der Attiny abstürtzten würden. Wenn ich rfwrite(); weg lasse, blinkt die LED jede Minute auf.

    Ist die Pin Belegung so richtig vom Sender zum IC:

    VDD -> VDDges
    GND -> GND
    MOSI -> MISO
    SCK -> SCK
    NSS -> D1
    DI0 -> D2
    MISO -> MOSI

    Wenn die Pin Belegung richtig ist, kann ich davon ausgehen das mein Sender kaputt ist?

    Gruß
    Dennis

  6. Sehr spannend, Dankeschön!

    Sag mal, über einen GPIO verbundenen 433 MHz Empfänger á la CUL oder Aukru geht das nicht, oder?

  7. Hallo,

    Ich fand das Projekt super, also habe ich sogleich damit begonnen, es nachzubauen. Nun ist die Harware fertig und ich wollte den ATTiny84 flashen.

    Mein Problem: als ich die Libraries von github.com clonen wollte,

    # sudo su
    # git clone https://github.com/jcw/jeelib /root/sketchbook/libraries/JeeLib

    kam folgene Fehlermeldung:

    # fatal: unable to access ‘https://github.com/LowPowerLab/RFM12B/RFM12B.cpp/’: gnutls_handshake() failed: The TLS connection was non-properly terminated.

    Ich habe jetzt schon tagelang gegoogelt, was gnutls ist, was TLS connection… bin aber nicht weitergekommen.
    Ich weiss nun wirklich nicht mehr weiter. Wird wohl auch ein Problem sein, da ich noch nicht lange mit dem Raspberrypi herumspiele.

    Ich wäre sehr froh über eine Antwort & Hilfe!

    danke und Grüsse Micha

    • Hallo Micha,
      blöde Frage.
      Du hast schon die # am Anfang jeder Zeile entfernt?
      Grüsse Sebastian

      • MIcha Randegger

        Hallo Sebastian,

        Ja klar.
        Gruss

      • Hab jetzt die Libraries auf einem Windows-PC heruntergeladen und diese so auf den Raspi gebracht. Mein Browser wurde von Github nicht unterstützt…

        Jetzt habe ich aber schon den nächsten Fehler:
        Beim kompilieren kommt folgende Meldung:

        Using previously compiled: /tmp/build4731959315145957238.tmp/Send.cpp.o
        Using previously compiled: /tmp/build4731959315145957238.tmp/wiring_pulse.c.o
        Using previously compiled: /tmp/build4731959315145957238.tmp/WInterrupts.c.o
        Using previously compiled: /tmp/build4731959315145957238.tmp/wiring.c.o
        Using previously compiled: /tmp/build4731959315145957238.tmp/wiring_analog.c.o
        Using previously compiled: /tmp/build4731959315145957238.tmp/pins_arduino.c.o
        Using previously compiled: /tmp/build4731959315145957238.tmp/wiring_shift.c.o
        Using previously compiled: /tmp/build4731959315145957238.tmp/wiring_digital.c.o
        Using previously compiled: /tmp/build4731959315145957238.tmp/HardwareSerial.cpp.o
        Using previously compiled: /tmp/build4731959315145957238.tmp/Print.cpp.o
        Using previously compiled: /tmp/build4731959315145957238.tmp/WString.cpp.o
        Using previously compiled: /tmp/build4731959315145957238.tmp/TinyDebugSerialErrors.cpp.o
        Using previously compiled: /tmp/build4731959315145957238.tmp/WMath.cpp.o
        Using previously compiled: /tmp/build4731959315145957238.tmp/TinyDebugSerial.cpp.o
        Using previously compiled: /tmp/build4731959315145957238.tmp/main.cpp.o
        Using previously compiled: /tmp/build4731959315145957238.tmp/TinyDebugSerial9600.cpp.o
        Using previously compiled: /tmp/build4731959315145957238.tmp/TinyDebugSerial38400.cpp.o
        Using previously compiled: /tmp/build4731959315145957238.tmp/Tone.cpp.o
        Using previously compiled: /tmp/build4731959315145957238.tmp/TinyDebugSerial115200.cpp.o
        /usr/share/arduino/hardware/tools/avr/bin/avr-ar rcs /tmp/build4731959315145957238.tmp/core.a /tmp/build4731959315145957238.tmp/wiring_pulse.c.o
        /usr/share/arduino/hardware/tools/avr/bin/avr-ar rcs /tmp/build4731959315145957238.tmp/core.a /tmp/build4731959315145957238.tmp/WInterrupts.c.o
        /usr/share/arduino/hardware/tools/avr/bin/avr-ar rcs /tmp/build4731959315145957238.tmp/core.a /tmp/build4731959315145957238.tmp/wiring.c.o
        /usr/share/arduino/hardware/tools/avr/bin/avr-ar rcs /tmp/build4731959315145957238.tmp/core.a /tmp/build4731959315145957238.tmp/wiring_analog.c.o
        /usr/share/arduino/hardware/tools/avr/bin/avr-ar rcs /tmp/build4731959315145957238.tmp/core.a /tmp/build4731959315145957238.tmp/pins_arduino.c.o
        /usr/share/arduino/hardware/tools/avr/bin/avr-ar rcs /tmp/build4731959315145957238.tmp/core.a /tmp/build4731959315145957238.tmp/wiring_shift.c.o
        /usr/share/arduino/hardware/tools/avr/bin/avr-ar rcs /tmp/build4731959315145957238.tmp/core.a /tmp/build4731959315145957238.tmp/wiring_digital.c.o
        /usr/share/arduino/hardware/tools/avr/bin/avr-ar rcs /tmp/build4731959315145957238.tmp/core.a /tmp/build4731959315145957238.tmp/HardwareSerial.cpp.o
        /usr/share/arduino/hardware/tools/avr/bin/avr-ar rcs /tmp/build4731959315145957238.tmp/core.a /tmp/build4731959315145957238.tmp/Print.cpp.o
        /usr/share/arduino/hardware/tools/avr/bin/avr-ar rcs /tmp/build4731959315145957238.tmp/core.a /tmp/build4731959315145957238.tmp/WString.cpp.o
        /usr/share/arduino/hardware/tools/avr/bin/avr-ar rcs /tmp/build4731959315145957238.tmp/core.a /tmp/build4731959315145957238.tmp/TinyDebugSerialErrors.cpp.o
        /usr/share/arduino/hardware/tools/avr/bin/avr-ar rcs /tmp/build4731959315145957238.tmp/core.a /tmp/build4731959315145957238.tmp/WMath.cpp.o
        /usr/share/arduino/hardware/tools/avr/bin/avr-ar rcs /tmp/build4731959315145957238.tmp/core.a /tmp/build4731959315145957238.tmp/TinyDebugSerial.cpp.o
        /usr/share/arduino/hardware/tools/avr/bin/avr-ar rcs /tmp/build4731959315145957238.tmp/core.a /tmp/build4731959315145957238.tmp/main.cpp.o
        /usr/share/arduino/hardware/tools/avr/bin/avr-ar rcs /tmp/build4731959315145957238.tmp/core.a /tmp/build4731959315145957238.tmp/TinyDebugSerial9600.cpp.o
        /usr/share/arduino/hardware/tools/avr/bin/avr-ar rcs /tmp/build4731959315145957238.tmp/core.a /tmp/build4731959315145957238.tmp/TinyDebugSerial38400.cpp.o
        /usr/share/arduino/hardware/tools/avr/bin/avr-ar rcs /tmp/build4731959315145957238.tmp/core.a /tmp/build4731959315145957238.tmp/Tone.cpp.o
        /usr/share/arduino/hardware/tools/avr/bin/avr-ar rcs /tmp/build4731959315145957238.tmp/core.a /tmp/build4731959315145957238.tmp/TinyDebugSerial115200.cpp.o
        /usr/share/arduino/hardware/tools/avr/bin/avr-gcc -Os -Wl,–gc-sections -mmcu=attiny84 -o /tmp/build4731959315145957238.tmp/Send.cpp.elf /tmp/build4731959315145957238.tmp/Send.cpp.o /tmp/build4731959315145957238.tmp/core.a -L/tmp/build4731959315145957238.tmp -lm
        Send.cpp.o: In function `_GLOBAL__sub_I_radio’:
        /usr/share/arduino/Send.ino:53: undefined reference to `RFM12B::Initialize(unsigned char, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)’
        /usr/share/arduino/Send.ino:53: undefined reference to `RFM12B::Control(unsigned int)’
        /usr/share/arduino/Send.ino:53: undefined reference to `RFM12B::Sleep()’
        /usr/share/arduino/Send.ino:53: undefined reference to `DHT22::readData()’
        /usr/share/arduino/Send.ino:53: undefined reference to `RFM12B::Wakeup()’
        /usr/share/arduino/Send.ino:53: undefined reference to `RFM12B::Send(unsigned char, void const*, unsigned char, bool, unsigned char)’
        /usr/share/arduino/Send.ino:53: undefined reference to `RFM12B::SendWait(unsigned char)’
        /usr/share/arduino/Send.ino:53: undefined reference to `RFM12B::Sleep()’
        /usr/share/arduino/Send.ino:53: undefined reference to `rf12_buf’
        /usr/share/arduino/Send.ino:53: undefined reference to `rf12_buf’
        /usr/share/arduino/Send.ino:53: undefined reference to `rf12_buf’
        /usr/share/arduino/Send.ino:53: undefined reference to `rf12_buf’
        /usr/share/arduino/Send.ino:53: undefined reference to `DHT22::DHT22(unsigned char)’
        collect2: error: ld returned 1 exit status

        Habs auch schon gegoogelt, aber das hat nichts gebracht.

        Hätte jemand eine Idee?

        Danke und Gruss

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.