In diesem Beitrag beschreibe ich, wie man mit recht einfachen Mitteln und wenigen Bauteilen selbst eine kleine Funk-Wetterstation mit Temperatur und Luftfeuchtigkeit bauen kann.

Als Grundlage verwenden wir:

  • Einen Temperatur- und Luftfeuchtigkeitssensor vom Typ DHT22
  • Einen Mikrocontroller vom Typ ATtiny85
  • Ein 433 MHz Funkmodul (Sender)
  • Einen 5V DC-Boost-Konverter
  • Ein bis vier Mignon-Batterien (AA, LR6)

Der ATtiny85 Mikrocontroller befindet sich die meiste Zeit im Tiefschlaf-Modus und wacht in regelmäßigen Zeitabständen durch den integrierten Watchdog kurz auf, um den DHT22 Sensor auszulesen und die Daten per Funk zu übermitteln.

Der DC-Boost-Konverter dient als Step-Up Wandler und macht aus 0,6 bis 4,7V von den Batterien eine stabile 5V Versorgungsspannung für die anderen Bauteile.

Softwareseitig verwenden wir zur Programmierung des ATtiny85 die ArduinoIDE und zur Funkübertragung die Open Source paketbasierte Funkmodul-Bibliothek RadioHead.

Aufbau der Hardware

Der Aufbau der Hardware erfolgt nach folgendem Schema:

Wichtig sind hier der 4,7 kOhm Widerstand vom Data-Pin des DHT22 gegen +5V, sowie der 10 kOhm Widerstand vom Reset-Pin des ATtiny85 gegen ebenfalls +5V.

Die beiden Leuchtdioden sind optional und dienen lediglich der Anzeige einer Aktivität des Mikrocontrollers. Es sollten am besten Low-Current LEDs (2mA) mit 1,5 kOhm Vorwiderständen verwendet werden, um möglichst stromsparend zu arbeiten.
Die grüne LED blinkt bei jeder Funkübertragung kurz auf und die rote LED zeigt, vom Mikrocontroller gesteuert, den Status an (einmal blinken = Ok, mehrfach blinken = Fehler).

Die direkte Verbindung vom Pluspol der Batterien zum Pin 7 (ADC1) des ATtiny85 dient der Spannungsüberwachung der Batterien.

Je nach Qualität des DC-Boost-Konverters kann es erforderlich sein, zwischen GND und +5V einen zusätzlichen kleinen Kondensator (~20µF) zu schalten.

Das Ganze platzsparend auf eine kleine Leiterplatte gebracht und in ein Gehäuse gesteckt könnte dann so aussehen:

 

Software

Die Software wird mit der ArduinoIDE auf den ATtiny85 Mikrocontroller geflasht. Wie dies grundlegend funktioniert, habe ich bereits im Beitrag ATtiny Mikrocontroller mit Arduino IDE programmieren beschrieben.

Die gesamte Software ist im GitHub Repository verfügbar.

Es wird bewusst nicht die aktuelle DHT22-Library von Adafruit eingesetzt, da diese für den ATtiny85 Mikrocontroller zu viel Speicher benötigt. Stattdessen wird die Fast DHT22 Library von Sergey Denisov benutzt.

Mit dieser Software schläft der ATtiny85 die meiste Zeit im Power Down Modus und benötigt dadurch extrem wenig Strom (< 10 µA für die gesamte Schaltung).

Der Watchdog weckt den Mikrocontroller alle 8 Sekunden auf, woraufhin dieser einen Zähler hoch zählt und sich wieder schlafen legt.

Bei jedem siebenten Aufwachen, also alle 56 Sekunden, werden die Temperatur und die Luftfeuchtigkeit vom Sensor abgerufen und per Funk übertragen.

Möchte man genau alle 60 Sekunden einen Messwert haben, so kann im Arduino Sketch im oberen Config-Bereich #define WATCHDOG_TIME 1 und #define WATCHDOG_WAKEUPS_TARGET 60 gesetzt werden. Dies führt jedoch zu einem etwas höheren Energieverbrauch, da der Mikrocontroller dann 8 mal häufiger aufwacht.

Bei jedem 30. Messvorgang wird zudem der Batteriestatus über den Analog-Digial-Konverter (ADC) abgerufen und per Funk übertragen. Dies ist über #define BAT_CHECK_INTERVAL 30 einstellbar.

Der Batteriestatus wird in zwei Formaten übertragen. Dies ist zum Einen der reine ADC-Messwert im Bereich von 0 bis 255, was 0V bis 5V entspricht und zum Anderen eine berechnete Prozentangabe. Diese Prozentangabe wird mit Hilfe der beiden Optionen #define BAT_ADC_MIN 40 (~0,78V) und #define BAT_ADC_MAX 225 (~4,41V) ermittelt.

Board-Auswahl in der ArduinoIDE

Die folgenden Board-Einstellungen müssen vor dem Kompilieren in der ArduinoIDE vorgenommen werden:

Board: ATtiny25/45/85

Prozessor: ATtiny85

Clock: Internal 8 MHz

Mögliche Probleme und Lösungen

Fehler beim Kompilieren

Abhängig von den verwendeten Versionen der ArduinoIDE und der RadioHead Bibliothek kann es beim Kompilieren zu Fehlermeldung wie beispielsweise ‘Serial’ was not declared in this scope kommen. Grund hierfür ist, dass beim kompilieren einzelne Module von RadioHead mit kompiliert werden, die jedoch gar nicht benötigt werden.

Die einfachste Lösung ist hier das Löschen oder Umbenennen der folgenden .cpp und .h Dateien der RadioHead Bibliothek: RH_CC110, RH_E32, RH_MRF89, RH_NRF24, RH_NRF905, RH_RF22, RH_RF24, RH_RF69, RH_RF95, RHHardwareSPI, RHNRFSPIDriver, RHSPIDriver

Daten werden nicht empfangen

Anhand der blinkenden LEDs ist erkennbar, dass der Sensor arbeitet, aber ein Empfänger bekommt keine Daten. Die häufigste Ursache dafür ist, dass die Fuse-Bits des ATtiny85 falsch gesetzt sind und er dadurch mit einem Takt von 1 MHz anstatt den erwarteten 8 MHz arbeitet.

Für den richtigen Takt sollte das Byte lfuse auf 0xE2 gesetzt sein. Dies wird am einfachsten erreicht, indem man über die ArduinoIDE über das Menü Werkzeuge -> Bootloader berennen den Bootloader sowie die passenden Fuse-Bits in den ATtiny85 schreibt. Anschließend muss der Sketch des Wettersensors nochmals neu auf den Controller hochgeladen werden.

Übertragene RadioHead Datenpakete

Es werden vier verschiedene Arten von Datenpaketen übertragen. Das jeweils erste Byte eines Datenpakets kennzeichnet dabei die Art.

0x00 Startmeldung

Dieses Datenpaket wird einmalig beim Start des Mikrocontrollers übertragen.

Es besteht aus nur einem Byte mit dem Wert 0x00.

0x01 Temperatur und Luftfeuchtigkeit

Dieses Datenpaket wird nach jeder Messung der Temperatur und Luftfeuchtigkeit übertragen.

Es besteht aus 9 Byte: 0x01, gefolgt von 4 Byte Temperatur und 4 Byte Luftfeuchtigkeit, jeweils als Float Zahl im Little-Endian Format.

0x01 t t t t h h h h

z.B. 0x01 0xcd 0xcc 0xd0 0x41 0xcd 0xcc 0x4e 0x42, was 26,1°C und 51,7% Luftfeuchtigkeit entspricht

0x02 Batteriestatus

Dieses Datenpaket besteht aus 3 Byte, beginnend mit dem Code 0x02, gefolgt vom Batteriestatus in Prozent (0 bis 100) und dem reinen ADC-Wert (0 bis 255).

z.B. 0x02 0x64 0xe7, was 100% und einem ADC-Wert von 231 entspricht

0xEE Fehlermeldung

Dieses Datenpaket mit einem Byte 0xEE wird gesendet, wenn es bei der Messung der Temperatur/Luftfeuchtigkeit einen Fehler gab.

Batterielebensdauer

Mit dieser Hard- und Software zeigt sich nun schon über mehrere Monate, dass circa 1% pro Monat von den Batterien verbraucht wird.

Damit sollte die Funk-Wetterstation also mehrere Jahre problemlos mit den drei Mignon-Batterien arbeiten können.

Beispiel-Sketch für einen Empfänger

Hier ist ein Beispiel-Sketch für einen Empfänger zu finden, welcher unter anderem auf einem Arduino Nano oder Uno verwendet werden kann.

Die empfangenen Nachrichten werden anhand des Typs der Nachricht unterschiedlich verarbeitet. Die empfangenen Daten werden über die serielle Schnittstelle (USB-Anschluss eines Arduinos) ausgegeben.

Das Beispiel geht davon aus, dass alle empfangenen Nachrichten von einem Wettersensor stammen. Im produktiven Einsatz sollte beispielsweise anhand der Absenderadresse geprüft werden, ob die Nachricht von einem Wettersensor stammt.

Anwendungsbeispiele

Ein Beispiel für die Anwendung dieser Mini-Wetterstation ist Überwachung und Protokollierung der Temperatur und Luftfeuchtigkeit im Gewächshaus unseres Gartens.

Die Wetterstation sendet im Minutentakt die aktuellen Daten an die Heimautomatisierung ioBroker. Hier nimmt der ebenfalls von mir entwickelte Adapter ioBroker.radiohead die Daten entgegen. Als Hardware wird auf der Empfängerseite (ioBroker) lediglich ein Arduino Nano mit 433 MHz Funkempfänger benötigt, der als Funk-Seriell-Gateway dient.

Zweites Beispiel wäre ein Arduino mit 433 MHz Funkempfänger und einem LCD-Display, welcher die gemessenen Daten entgegen nimmt und auf dem Display darstellt.

Weiterhin kann über das Node.js Modul radiohead-serial ein solcher Wettersensor in jedes Node.js Programm eingebunden werden. Damit sind die Möglichkeiten nahezu unendlich 😉

Lizenz

Lizenziert unter GPL Version 2

Copyright (c) 2017-2023 Peter Müller