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 auch im cryHost GitLab 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.

 

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

 

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 Pimatic. Hier nimmt das ebenfalls von mir entwickelte Plugin pimatic-radiohead mittels RadioHeadWeatherStation die Daten entgegen. Als Hardware wird auf der Empfängerseite (Pimatic) 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 Peter Müller