Hi,

auch in den nächsten beiden Lektionen werden wir wieder ein kleines Projekt mit dem Arduino aufbauen.

Eine Weltzeituhr mit Alarmfunktion haben wir ja schon. Nun kommt eine kleine Wetterstation zur Sammlung hinzu.Watch movie online Logan (2017)

Das ist wieder ein typisches Einsatzgebiet für Mikrocontroller im Alltag. Du kennst sicher die kleinen Geräte, die in den Regalen der Elektronik-Abteilungen liegen. Manche liefern eine komplette Wettervorhersage und können die Daten von verschiedenen Außensensoren über Funk empfangen.

Aber fertig kaufen ist langweilig. Wir machen das natürlich selbst. 🙂

Hardware für die Wetterstation

Dabei kommt wieder das LCD-Display zum Einsatz. Du kennst es aus den letzten beiden Lektionen und weißt darüber Bescheid, wie es angesteuert wird. Anstatt die Uhrzeit anzuzeigen, wird es diesmal der Ausgabe von Temperatur und Luftfeuchtigkeit dienen. Außerdem lernst du heute ein wichtiges Tool kennen, um Daten vom Arduino an die Entwicklungsumgebung zu senden und dort anzuzeigen. Vor allem bei Schaltungen ohne LCD-Display ist das ein sehr nützliches Hilfsmittel.

Beim nächsten Mal kommt dann ein besonderer Leckerbissen: Statt die Messwerte als Zahlen auf dem LCD-Display anzuzeigen, werden wir einen Servomotor ansteuern und daraus eine analoge Anzeige mit Zeiger und Zifferblatt bauen. Mit der Servo-Ansteuerung lassen sich Bewegungen sehr kontrolliert steuern – das ist die Grundlage um später Roboter und Fahrzeuge zu entwickeln! Aber zunächst mal zurück zur Wetterstation.  Die im Handel erhältlichen Geräte basieren alle auf der Messung von drei verschiedenen Größen: Temperatur, Luftdruck und Luftfeuchtigkeit.

Die richtige Fühlung fürs Wetter mit dem DHT11

Wir haben Glück, denn für Temperatur und Luftfeuchtigkeit gibt es bereits ein praktisches Sensor-Bauteil, das sich bestens mit dem Arduino versteht. Der Temperatur- und Luftfeuchtesensor DHT11 ist deshalb so gut geeignet, weil er bereits über einen Baustein zur Datenübertragung mit dem Arduino verfügt.  Dazu verwendet er einen 1-bit Bus, das heißt, du musst nur einen einzigen  digitalen Pin am Arduino reservieren, und kannst darüber per Sketch auf alle Funktionen des DHT11 zugreifen.

Der DHT11 (links) in Aktion

Der DHT11 (links) in Aktion

Genau wie beim LCD-Display müssen wir uns um die technischen Einzelheiten der Datenübertragung nicht weiter kümmern, denn es gibt bereits eine fertige Bibliothek zur Ansteuerung des DHT11 und seiner größeren Brüder. Allerdings ist sie nicht standardmäßig in den Bibliotheken der Arduino-Entwicklungsumgebung enthalten, sondern du musst sie erst installieren. Dazu gibt es schon einen Beitrag, in dem das alles erklärt wird, schau dazu nach unter  Temperatur und Luftfeuchtigkeit messen – DHT11.

 

Wenn du dir den Sketch im Beitrag zum DHT11 angeschaut hast, dann ist dir sicher aufgefallen, dass dort kein LCD-Display verwendet wurde, sondern die Ausgabe über Befehle wie
Serial.print()  gemacht wird.

Serielle Info für die Fehlersuche

Dahinter steckt eine sehr nützliche Funktion, die dir beim Entwickeln und Testen mit dem Arduino noch unverzichtbar werden wird. Der Arduino verfügt über einen Baustein, der Daten über eine serielle Schnittstelle austauschen kann. In diesem Fall ist das der USB-Port,. Du hast diese Funktion schon oft genutzt ohne es zu wissen, denn natürlich wird auch der Code des Sketches auf diesem Weg an den Arduino übertragen. Es geht aber auch andersherum: Der Arduino kann Daten über die USB-Schnittstelle an den angeschlossenen Rechner senden. Um sie sichtbar zu machen,  gibt es in der Entwicklungsumgebung einen sogenannten Monitor.

Klar, dass wir uns diesen seriellen Monitor auch genauer anschauen werden. Wie wäre es, wenn wir die Ausgabe der Messdaten einfach doppelt machen, einmal übers LCD-Display und parallel dazu über den seriellen Monitor auf dem Bildschirm?

Mit dem
Serial -Objekt kannst du über die USB-Schnittstelle Daten an den angeschlossenen PC senden. Das Monitorfenster zeigt ankommende Zeichen in Echtzeit an. Probiere es aus, indem du folgenden Sketch an den Arduino schickst:

Im setup-Block wird zunächst mal die Serial-Funktion mit
Serial.begin(9600)  eingerichtet. Der Funktionswert gibt die Übertragungsrate an, hier im Beispiel sind es 9600 Bit pro Sekunde, man sagt auch 9600 baud dazu.

Du kannst hier Werte zwischen 300 und 115200 wählen, die meisten Sketches verwenden die 9600 als sichere Standardrate. Schau dazu auch in die Dokumentation auf der Arduino-Seite

Mit
Serial.print()  kannst du dann Variablen und Texte auf den seriellen Monitor schicken, genauso wie du es schon mit dem LCD-Display gemacht hast.

Wenn du den Sketch auf den Arduino überträgst, passiert erst mal nichts. Das liegt daran, dass der serielle Monitor standardmäßig nich angezeigt wird. Den Monitor öffnest du in der Arduino-Entwicklungsumgebung unter Werkzeuge, oder mit der Tastenkombination  Strg-Umschalt-M. Probiere es aus und du wirst sehen, wie im Sekundentakt die Ausgabe in das Fenster auf dem Bildschirm geschickt wird.

screen_serieller_Mon_Aufruf

Ein wichtiger Teil der Softwareentwicklung ist die Fehlersuche. Programme sind nie ganz frei von Fehlern und während der Entwicklung musst du meistens mehrere Testläufe machen, dir die Ergebnisse anschauen und dann an den Stellen, wo sich das Programm nicht wie gewünscht verhält, den Code verändern. Dazu will man oft wissen, welchen Wert eine Variable an einer bestimmten Stelle zur Laufzeit hat. Mit dem seriellen Monitor kannst du das leicht herausfinden: Du setzt einfach eine
Serial.print()  Anweisung an die entsprechende Stelle und schon wird der Wert der Variablen auf dem Bildschirm ausgegeben.

Diese  Fehlersuche nennt man auch Debugging und bei größeren Projekten mit viel Programmierarbeit ist der serielle Monitort dein wichtigstes Werkzeug dafür.

Der serielle Monitor

Der serielle Monitor

 Jetzt kann das Wetter kommen…

 

Der Aufbau der Wetterstation

Der Aufbau der Wetterstation

Kommen wir jetzt zum Aufbau der Wetterstation. Das LCD-Display mit seiner Verdrahtung ist bereits ein alter Bekannter. In den letzten beiden Lektionen findest du den Bauplan für die richtige Verdrahtung. Auf der Hardwareseite kommt heute gar nicht so viel dazu: Um mit dem Arduino zu funktioniert, benötigt der DHT11 nur 3 Anschlüsse. Zwei davon sind für die Spannungsversorgung reserviert und ein weiterer Pin dient als Datenkanal. Dieser wird mit einem Digitaleingang des Arduino verbunden. Damit ist der Aufbau bereits einsatzbereit. Wenn du die Spannunggsversorgung richtig am DHT11 angeschlossen hast, quittiert er das mit einer grünen LED. Den Datenkanal haben wir auf Pin 8 gelegt.

Wenn das LCD Display verdrahtet ist, schließe also den DHT11 so an:

  1. Verbinde VCC am DHT11 mit +5V am Arduino
  2. Verbinde den DATA Pin des DHT11  mit dem digitalen Pin 8 am Arduino
  3. Und natürlich GND mit GND 🙂

Nun müssen wir nur noch die Sensordaten auslesen und auf die beiden Ausgabekanäle schicken. Der folgende Sketch erledigt das:

 

 Status: DHT11 meldet alles OK

Im setup-Block nutzen wir aus, dass der DHT11-Sensor neben den reinen Messdaten auch Statusmeldungen über den Bus schicken kann. Wir können damit sofort sehen, ob alles in Ordnung ist und ob wir den Messergebnissen trauen können.

Das erledigt der Befehl

Um die Statusmeldung auszugeben bedienen wir uns der
switch -Anweisung. Das ist so etwas wie eine erweiterte If-Abfrage.

Immer wenn eine Abfrage mehr als zwei Ergebnisse haben kann, wird es mühsam und fehleranfällig, das Ganze über mehrere geschachtelte If-Anweisungen zu realisieren. Das wäre zwar im Prinzip möglich, aber C++ bietet uns eine bequemere Variante: Die
case  Abfrage.

Eine neue Abfragetechnik mit case

Das, was hinter 
switch  in Klammern steht wird bei jedem Block, der mit 
case  beginnt abgefragt. Nur wenn es übereinstimmt, dann wird der Anweisungsblock hinter 
case  ausgeführt. Wenn nicht, geht es einfach mit dem nächsten
case weiter. Aber auch nach einer Übereinstimmung geht es beim nächsten
case  weiter. Auf diese Weise kannst du auch mehrere Bedingungen gleichzeitig abfragen. Willst du also, dass nur ein
case -Block ausgeführt wird, dann musst du ihn mit der Anweisung
break;  beenden. Die sorgt nämlich dafür, dass der ganze switch-Block verlassen wird. Schließlich gibt es dann noch die Anweisung hinter 
default: , die nur ausgeführt wird, wenn keine der
case Abfragen geklappt hat.

Das klingt jetzt vielleicht etwas kompliziert, aber es ermöglicht sehr komplexe Abfragen übersichtlich aufzuschreiben und nach einer kleinen Eingewöhnung wirst du die Funktion nicht mehr missen wollen.

Weiter gehts:  Wir fragen zwischen den zeilen 37 und 48 in den
case -Blöcken die Fehlercodes des DHT11 ab (sie sind in der DHT.h-Bibliothek definiert) und geben diese auf dem LCD-Display aus. Nach einer fest eingestellten Zeit
Init_Delay  geht die Ausführung in den loop-Block über und damit schaltet das System auf den Anzeigemodus und gibt im Sekundenrythmus Temperatur und Luftfeuchtigkeit aus. Dazu dienen die Funktionen
DHT.temperature  und
DHT.humidity  aus der DHT-Bibliothek.

Ein Statustaster gratis

Dadurch, dass wir die Statusabfrage in den setup-Block packen, sparen wir uns einen zusätzlichen Taster einzubauen, denn ein Druck auf den eingebauten Resettaster des Arduino genügt, um das Ergebnis der Statusabfrage ins Display zu holen.

Probiere es aus: Zieh einfach mal den DHT11 aus dem Breadboard und die Anzeige wird sofort unsinnige Werte anzeigen. Drückst du nun am Arduino auf den Reset-Taster in der Ecke neben dem USB Port, dann startet der Sketch neu und die Statusabfrage wird auf dem Display angezeigt. Dann sollte anhand der Meldung zu sehen sein, dass vom DHT11 keine Daten mehr kommen. Die Zeit, wie lange die Statusmeldung angezeigt wird, kannst du in Zeile 8 über die Variable 
Init_Delay festlegen. Immer wenn im Betrieb Probleme oder seltsame Werte auftauchen, kannst du durch den Reset-Taster eine Fehlermeldung anzeigen lassen.

So, das war es schon – die Wetterstation ist nun einsatzbereit. Das LCD-Display zeigt Temperatur und Luftfeuchtigkeit an.

Zum Testen der Funktion eignet sich ein Fön sehr gut, da er beide Messgrößen gleichzeitig beeinflusst. Die Temperatur sollte steigen und die relative Luftfeuchtigkeitdurch die trockene heiße Luft sinken. Aber achte darauf, dass beim Fönen keine Widerstände oder andere Kleinteile in der Nähe herumliegen. 🙂

Und nächstes Mal erweitern wir dann die Wetterstation um eine analoge Temperaturanzeige. Bis dahin kannst du wieder ein wenig mit dem Aufbau experimentieren. Du kannst auch mal versuchen, die serielle Monitorfunktion in den Sketches aus den vorigen Lektionen einzubauen und dort verschiedene Daten auf dem Bildschirm anzuzeigen. Zum Beispiel bei der Weltzeituhr ein Taster-Log: Immer wenn jemand mit dem Taster die zeitzone umschaltet, erscheint im seriellen Monitor ein Eintrag mit der aktuellen Ortszeit. So entgeht dir niemals, wenn jemand am Taster war.

Bis zum nächsten Mal viel Spaß!

Eine Mini-Wetterstation mit Analoganzeige Teil 1 von 2

2 Gedanken zu „Eine Mini-Wetterstation mit Analoganzeige Teil 1 von 2

  • 12. Oktober 2015 um 13:46
    Permalink

    Hallo Robert,
    „Analog Anzeige“ ist ja ganz nett, aber koenntest Du auch mal ein Project mit Touch Screen LCD machen.
    Es gibt da mehrere preisguenstige Produkte von deversen Versandhaendleren. Allerdings happert es dann schon bei der
    Einbindung der libaries, die Pinbelegung ist unklar, oder es ist schon unklar welches Uebertragungsprotokoll anzuwenden ist.

    Auserdem muss man ja auch noch Daten dementspechend aufarbeiten.
    Wie kommt man den eigentlich mit dem Speicher aus wenn man alle pixel latchen muss?

    Waere schoen wenn Du mal ein Beispiel als Referenz vorstellen koenntest.

    Antworten
    • 14. Oktober 2015 um 18:41
      Permalink

      Hi Christian,

      ja stimmt. Touch LCDs sind auch super spannend. Ich habe auch schon eins von Adafruite hier liegen. Vielleicht schaffe ich es zum Ende des Monats darüber zuschreiben. Hoffentlich kannst du noch so lange warten. Solltest du schneller sein, interessieren wir uns für deine Erfahrungen.

      Herzliche Grüße,

      Robert

      Antworten

Schreibe einen Kommentar

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