Zum Inhalt springen

LCD Display LCD1602

    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:

    ESP32

    Display LCD1602 mit I2C Modul

    SHT3x (aus dem Beitrag Temperaturmessung mit dem SHT3x)

    Breadboard

    Verbindungsdrähte (Jumper Wire)

    ESP32 und Temperatursensor SHT31 mit LCD_Dislplay als Fitzing-Schaltplan
    Fitzing



    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.

    Screenshot zur auswahl der LCD Display Library

    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.

    Displayausgabe des fertigen Projektes - LCD1602 Display am ESP32 und SHT31 programmieren

    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.


    0 Kommentare
    Inline Feedbacks
    View all comments