Min / Max – Thermometer mit LCD Display auf Arduino Basis

Nach meinen ersten Versuchen mit dem Arduinoboard, habe ich meinen Bauteile-Fuhrpark um ein LCD-Shield und den Sensor DHT11 (Temperatur und Feuchtigkeit) erweitert. Somit war es an der Zeit, das erste kleine, aber vollständige Projekt umzusetzen.
Ziel des Projektes ist ein Thermometer, das nicht nur die aktuellen Messwerte anzeigt, sondern auch auf Knopfdruck die maximalen und minimalen, bisher gemessenen Werte. Zusätzlich sollte sich die Helligkeit des Displays anpassen lassen.

Bauteile

  • Arduino-Board. In meinem Fall ein Arduino-Ethernet, es geht aber auch das „normale“ Arduino uno, bzw. jedes PIN-kompatible Board.
  • Das DFrobot LCD Shield
  • Der DHT11 One-Wire Sensor.

DFrobot LCD Shield

Das LCD-Shield ist eine sehr praktische Geschichte, da es direkt auf das Arduino-Board aufgesteckt werden kann. Da ich ein Arduini-Ethernet verwende, war allerdings noch Satz „Stackable Header“ notwendig, damit die Shield-Platine nicht auf den RJ45 Gehause aufsetzt. Bei einem „normalen“ Arduino Board sollte das nicht notwendig sein. Das Display auf dem LCD-Shield stellt 2×16 Zeichen zur Verfügung, die mit weißen Zeichen auf blauem Hintergrund dargestellt werden. Zusätzlich sind 5 Taster und einen Reset-Taster auf dem Board verbaut. Für die Steuerung des Displays werden die digitalen Pins 4 bis 10 und der analoge Eingang A0 verwendet.
Pin 4 bis 7 dienen als 4bit Datenbus, Pin 8 als Steuerleitung und Pin 9 als „Enable Pin“ zum aktivieren / deaktivieren des Displays. Über Pin 10 wird die Helligkeit der Hintergrundbeleuchtung geregelt, dazu später mehr.
Sehr clever ist die Schaltung der 5 Taster gelöst, diese sind alle über den analogen Eingang A0 angeschlossen. Jeder Schalter über einen anderen Widerstand. Somit lassen sich über die Funktion analogRead() unterschiedliche Werte, je nach gedrücktem Taster auslesen. Es wird also nur ein Pin für alle 5 Taster benötigt. Nachteil dieser Methode ist allerdings, das man immer nur einen gedrückten Taster erkennen kann. Für unser Projekt reicht das aber völlig aus.

DHT11 Sensor

Dieser Sensor liefert Werte für Temperatur und die relative Luftfeuchtigkeit im Bereich 0 – 50 °C und 20% – 90% RH, was für unseren Zweck ausreichend ist. Auch die +/- 2°C Messgenauigkeit sind für unser kleines Projekt akzeptabel. Mit knapp 4 bis 5 Euro ist er gegenüber anderen Sensoren recht preiswert. Der große Bruder (DHT22) für ca. 13 Euro kann dann von -40 bis 80 °C bei 0,5°C Genauigkeit und 0-100% Luftfeuchte schon deutlich mehr.
Für die Kommunikation mit dem Sensor wird lediglich ein digitaler Pin benötigt. Leider ist der DHT11 kein „echter“ One-Wire Sensor, da er ein eigenes, proprietäres Protokoll verwendet. Da wir nur einen Sensor anschliessen und es rechte gute Beispiele und Bibliotheken für diesen Sensor gibt, stört auch das nicht weiter.
Geliefert wird der Sensor mit einem dreipoligen Pfostenstecker, der perfekt auf die Anschlussleiste des LCD-Shields passt. Sogar die Pin-Zuordnung (5V, Masse, Datenleitung) stimmt. Wir brauchen also keine extra Verdrahtung vornehmen.

Aufbau

Der Aufbau ist super einfach. Das LCD-Shield wird auf das Arduino-Board gesteckt und der Sensor an die auf dem LCD-Shield herausgeführten Analog-Pins angeschlossen (Foto). Mehr brauch wir hardwareseitig nicht zu machen. Die meiste Arbeit steckt in der Software.

Das Programm

Nochmal zur Erinnerung, wir möchten die folgenden Funktionen umsetzen:

  • Anzeige von Temperatur und Luftfeuchtigkeit
  • Speichern von minmal und maximal Werten für Temperatur und Luftfeuchtigkeit
  • Anzeige der min- und max-Werte auf Knopfdruck
  • Ändern der Display-Helligkeit auf Knopfdruck

Programm Download: display_dht11

Da Programmierer meistens recht faul sind, besorge ich mir die einzelnen Teile unseres Programms zunächst aus den einzelnen Beispielprogrammen. Das Vorgehen ist einfach.

  1. Beispielprogramm laden
  2. Programm auf das Board überspielen
  3. Testen und anpassen, bis die gewünschte Funktion umgesetzt ist
  4. Erstellen einer C-Funktion mit der gewünschten Funktionalität (copy / paste) im eigenen Programm

Der Vorteil dieser schrittweisen Vorgehensweise ist, dass man sein Hauptprogramm schrittweise entwickelt und erst neue Funktionalitäten einbaut, wenn alles andere funktioniert.
Das erleichtert ungemein die Fehlersuche, wenn etwas nicht wie erwartet klappt, und das ist relativ häufig der Fall.

Abfragen des Sensors

Eine gute Einführung und die auch in unserem Beispiel verwendete Lib gibt es auf der Arduino-Seite. Dort findet sich auch die Anleitung, wie man die Lib in seine Entwicklungsumgebung bekommt. Meine Abfrage-Funktion basiert im wesentlichen auf dem Beispielprogramm. Beim Testen ist mir aufgefallen, das der Sensor viele Fehler bei der Datenübertragung produziert, wenn man ihn zu häufig abfragt. Damit aber nicht das ganze Programm ausgebremst wird, sorgen wir dafür, das wir den Sensor nur einmal pro Sekunde nach neuen Werten fragen. Dieser Wert ist ausreichend und scheint auch für unseren gemütlichen Sensor OK zu sein. Die Funktion „read_dht11()“ erledigt das Abfragen in unserem Programm. Dabei werden gleich die aktuelle Temperatur und Luftfeuchtigkeit gespeichert. In jedem Durchlauf vergleicht unser Programm ausserdem ob die maximal oder minimal Werte aktualisiert werden müssen.
Wichtig für unser Programm ist die Zeile „#define DHT11PIN A5″ ziemlich am Anfang. Damit sagen wir der Lib, das der Sensor am Analog-Pin 5 angeschlossen ist.

Helligkeit des Displays

Das oben schon erwähnte digital Pin 10 wird zum Steuern des Helligkeit des Displays verwendet. Pin 10 ist eines der Pins, die in einem „PWM“ (Pulse-Width-Modulation) Modus betrieben werden können. In diesem Modus wechselt der Zustand des Pins ca 500 Mal pro Sekunde zwischen HIGH (5V) und LOW (0V) hin und her. Dabei legt ein Wert zwischen 0 und 255 fest, wie lang der jeweilige HIGH Impuls gegenüber dem LOW Impuls ist. Damit kann man sehr einfach z.B. eine LED dimmen, oder eben das Backlight des LCD Displays. Eine einfache Funktion „set_backlight()“ ist dafür in unserem Programm zuständig. Dieser Funktion kann man entweder einen absoluten Wert für die Helligkeit mitgeben (direktes Setzen) oder einen relativen Wert, der auch negativ sein kann. Damit kann man den aktuellen Wert der Helligkeit um den übergebenen Wert ändern.

Abfragen der Tasten

Dieser Teil ist recht einfach gehalten. Ich habe die „read_LCD_buttons()“ Funktion aus dem Beispielprogramm übernommen, da hier bereits die korrekten Werte zum Erkennen der einzelnen Tasten hinterlegt sind. Für unser Projekt sollen die „UP / DOWN“ Tasten zum steuern der Displayhelligkeit und die „LEFT / RIGHT“ Tasten zum Anzeigen der min / max Werte verwendet werden. Das verzweigen in die einzelnen Funktionalitäten geschieht dabei über ein einfaches switch-Statement. Die Anpassung der Helligkeit wird direkt über die Funktion „set_backlight()“ erledigt. Wird die Taste „UP“ erkannt, erhöht sich die Helligkeit um den Wert 30, bei der Taste „DOWN“ wird die Helligkeit um 30 verringert (set_backlight(-30)).
Die Steuerung der Anzeige erfolgt mit Hilfe der Variablen „show“. Diese hat normalerweise den Wert „showNORM“ (wird vor dem switch-Statement gesetzt), nur wenn die Tasten „LEFT“ oder „RIGHT“ erkannt werden, wird „show“ auf „showMIN“ bzw. „showMAX“ gesetzt.
Die Taste „SELECT“ verwenden wir in unserem Programm nicht.

Display Anzeige

Das Erzeugen der Displayausgabe wurde auch in eine eigene Funktion ausgelagert. Somit bleibt das eigentliche Programm (loop()) übersichtlicher. Der Funktion „show_values()“ wird die Variable „show“ übergeben, anhand derer die Funktion entscheiden kann ob die aktuellen, die minimalen oder die maximalen Werte dargestellt werden müssen.

Fazit

Der größte Aufwand bei diesem Projekt steckt in der Programmierung. Das Programm ist sicher noch an vielen Stellen optimierbar. Außerdem könnten noch 4 weitere Sensoren angeschlossen werden (A1 – A4) die man z.B. mittels der „SELECT“ Taste umschalten könnte.
Da wir ein Arduino-Ethernet verwenden, bietet sich an, das wir die gemessenen Daten regelmäßig an ein externes Programm oder einen Webserver übertragen der dann Temperatur-Kurven o.ä. daraus erstellen könnte.
Das hebe ich mir aber für ein weiteres Projekt auf.

3 Kommentare zu “Min / Max – Thermometer mit LCD Display auf Arduino Basis

  1. Pingback: Digital Led Thermometer | Möbel Tester

Hinterlasse eine Antwort

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

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>