LCDs (Liquid Crystal Displays) sind eine weit verbreitete Technologie zur Darstellung von Text und einfachen Grafiken auf elektronischen Geräten. Die 2-zeiligen, 16 Zeichen umfassenden Displays mit dem Hitachi HD44780-Chipsatz sind besonders populär im Bereich der Mikrocontroller-Projekte, wie z.B. mit Arduino oder ESP. Diese Displays sind kostengünstig, einfach zu bedienen und bieten eine gute Sichtbarkeit.
Hauptmerkmale:
- Zeilen und Zeichen: 2 Zeilen mit je 16 Zeichen.
- Chipsatz: Hitachi HD44780, der de facto Standard für solche Displays.
- Ansteuerung: Einfache Ansteuerung über 4-Bit- oder 8-Bit-Datenbus.
- Spannungsversorgung: Betriebsspannung typischerweise 5V.
- Beleuchtung: Meist mit Hintergrundbeleuchtung für bessere Sichtbarkeit auch bei schlechten Lichtverhältnissen.
- I2C Bus: Zusätzlich besteht die Möglichkeit das Display mit dem Modul HW-061über den I2C Bus zu betreiben.
Diese Displays sind ideal für DIY-Projekte und Anwendungen, bei denen eine einfache, aber effektive Textdarstellung erforderlich ist.
Aufbau der Schaltung mit dem ESP32
Benötigte Teile:
Wir nutzen hier den bereits bestehenden Aufbau der Messschaltung mit dem SHT3x und erweitern um ein Display zur Anzeige der Temperatur und Luftfeuchtigkeit.
Hier handelt es sich um ein I2C Bus fähiges Display, was uns den Aufbau relativ einfach macht.
Im Prinzip müssen wir nur die 4 Leitungen parallel auf die Anschlüsse des Sensors bringen. Im Prinzip heißt, die Versorgungsspannung des Displays liegt bei 5 Volt.
Deshalb habe ich VCC auf den PIN 19 5V gelegt.
Wir hatten für den I2C Bus am Sensor STH3x die 0x44 festgelegt. Das Display läuft auf der Adresse 0x27. Damit gibt es keine Kollisionen und jedes Modul kann einwandfrei adressiert werden. Sollte es dennoch im eigenen Aufbau dazu kommen, hilft die Seite der Hochschule Hamm/Lippstadt weiter. Hier ist die Adressierung sehr gut beschrieben.
Programmierung mit VS Studio Code
Wir benötigen für das Display eine Library, die wir schnell gefunden haben.
Und das war auch schon alles an Voraussetzungen.
Die platform.ini sieht jetzt folgendermaßen aus.
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
lib_deps =
adafruit/Adafruit SHT31 Library@^2.2.2
marcoschwartz/LiquidCrystal_I2C@^1.1.4
monitor_speed = 9600
Wenden wir uns einmal dem Code zu.
//Programm Eckhard Gerwien - teilweise Prüfung durch ChatGPT #include <Arduino.h> #include <Wire.h> #include <SPI.h> #include <LiquidCrystal_I2C.h> #include <Adafruit_SHT31.h> #define I2C_SDA 21 #define I2C_SCL 22 // Erstellen eines Objekts für den SHT31 Sensor Adafruit_SHT31 sht31 = Adafruit_SHT31(); // set the LCD address to 0x27 for a 16 chars and 2 line display LiquidCrystal_I2C lcd(0x27,20,4); void printlcd(byte, byte, String); void setup() { // Initialisierung des I2C-Bus Wire.begin(I2C_SDA, I2C_SCL); // Initialisierung der seriellen Kommunikation für Debugging Serial.begin(9600); //LCD Display initialisieren und Anzeige löschen lcd.init(); lcd.backlight(); lcd.clear(); //in die erste Zeile des Displays schreiben printlcd(0,0,"DIYTechAdventure"); // Initialisierung des SHT31 Sensors if (!sht31.begin(0x44)) { Serial.println("SHT31 nicht gefunden!"); while (1); } Serial.println("SHT31 Sensor gefunden!"); } void loop() { // Auslesen der Temperatur float temperature = sht31.readTemperature(); // Auslesen der Luftfeuchtigkeit float humidity = sht31.readHumidity(); // Überprüfen, ob die Messwerte gültig sind if (!isnan(temperature)) { // isnan überprüft, ob der Wert 'NaN' (Not a Number) ist Serial.print("Temperatur: "); Serial.print(temperature); Serial.println(" °C"); // Puffer für die Temperaturanzeige char tempStr[6]; // Temperatur in String konvertieren, 4 Gesamtstellen, 1 Nachkommastelle dtostrf(temperature, 4, 1, tempStr); printlcd(0,1,"T:" + String(tempStr)); } else { Serial.println("Fehler beim auslesen der Temperatur"); printlcd(0,1,"T:ER"); } if (!isnan(humidity)) { Serial.print("Luftfeuchtigkeit: "); Serial.print(humidity); Serial.println(" %"); //Cursor einstellen und Text an entsprechende Stelle im Disply schreiben printlcd(8,1,"H:" + String(humidity)); } else { Serial.println("Fehler beim Auslesen der Luftfeuchtigkeit"); printlcd(8,1,"H:ERR"); } // Wartezeit von 10 Sekunden vor der nächsten Messung delay(10000); } void printlcd(byte posx, byte posy, String Text) { lcd.setCursor(posx, posy); lcd.print(Text); }
Im #Include-Teil kommt die oben genannte Library für die Steuerung des Displays hinzu.
Dann definiere ich die PINs für den Anschluss der Datenleitungen des I2C Busses.
Die Adresszuweisung für den Sensor und das Display ist im Code schon erklärt.
void printlcd(byte, byte, String); – ist die Funktionsdeklaration, die dann auch hinter der Loop stehen darf.
Ich nutze diese Form gerne, da der Code aufgeräumter scheint.
Im Setup() nutze ich die deklarierte Funktion dann auch erstmalig zum Beschreiben der ersten Zeile des Displays:
printlcd(0,0,“DIYTechAdventure“); Das Display adressiert erst die Spalten, dann die Zeilen. so bedeutet 0,0 erste Spalte, erste Zeile – 8,1 ist dann die 9. Spalte, 2. Zeile. Es wird in der Funktion void printlcd(byte posx, byte posy, String Text) mit lcd.setCursor Spalte und Zeile gesetzt und dann diese Stelle der Text mit lcd.print() geschrieben.
// Puffer für die Temperaturanzeige
char tempStr[6];
// Temperatur in String konvertieren, 4 Gesamtstellen, 1 Nachkommastelle
dtostrf(temperature, 4, 1, tempStr);
printlcd(0,1,“T:“ + String(tempStr));
Herausforderung: An dieser Stelle möchte ich die Temperatur mit nur einer Stelle hinter dem Komma ausgegeben haben. Deshalb packe ich die gelesene Temperatur in den Puffer und wandle Float in String und lege gleichzeitig fest, dass ich nur 4 Zeichen brauche und davon eins hinter dem Komma.
Auch das packe ich wieder in den Funktionsaufruf zum Schreiben des Displays.
Wenn alles richtig gelaufen ist, solltest du das bekommen. Erste Zeile die fest programmierte Ausgabe. Zweite Zeile Temperatur und Luftfeuchtigkeit, die alle 10 Sekunden aktualisiert wird.
Bleibt noch zu erwähnen, dass wir hier 2 verschiedene Betriebsspannungen verwenden. Wie beim ESP32 üblich, läuft dieser mit 3.3V. Das Display aber mit 5V. Der Sensor hat einen größeren Versorgungsbereich (zwischen 2.1 und 5.5V). Bitte beachte die Spannungstoleranz der ESP-PINs.
Wir sind wieder am Ende eines DIYTechAdventures angekommen. Viel Spaß beim Nachbauen und wenn Fragen sind, immer die Kommentarfunktion nutzen.