LCD Display 16x2 HD44780 ansteuern (Arduino und Python)

LCD Display 16x2 HD44780 ansteuern (Arduino und Python) - Control-LED

Um Daten oder Informationen eines Raspberry Pi oder Arduino Projekts, ohne den seriellen Austausch zum PC darzustellen, eignet sich das I2C Dislay Modul. Es ist in den Ausführungen 16x2 (Ziffern x Zeilen) und 16x4 erhältlich. Auf den Zeilen können Buchstaben, Zahlen oder sonstige Ziffern dargestellt werden. Sollte man einen Zugriff auf den Programmablauf benötigen, kann das Modul auch als Auswahlmenü verwendet werden.

 

Wie kommuniziert das LCD Modul mit dem Raspberry PI oder Arduino?

 

Das LCD Modul kommuniziert über das I2C Interface mit den Controllern. Dafür ist der Treiberchip HD44780 auf der Platine integriert. Du musst nur 4 Kabel anschließen um die Übertragung der Messwerte zu starten.

Zusätzlich kannst du die I2C Adresse mit Lötbrücken an den Stellen A0-A2 einstellen, damit keine Adressierungskonflikte mit anderen I2C Geräten entstehen können.

 

<Okay, dann zeig mir mal wie ich das Display benutzen kann!

 

 Also gut!

Ich zeige dir in diesem Tutorial, wie du das Display Modul mit dem Raspberry Pi und dem Arduino benutzen kannst. Für beide Plattformen gibt es bereits librarys, mit denen das Programmieren einfacher wird.

Im Anhang des Posts sind 3 typische Anwendungen als Code zum Download verfügbar. Dabei können mit dem Codes die folgenden Anwendungen ausgeführt werden:

 

►Einen Text auf dem Display ausgeben.

►Längere Texte als Laufschriften darstellen.

►Ein einfaches Menü programmieren.

An welchen Stellen die Variablen der Codes für deine Anwendung angepasst werden müssen, werde ich erklären.

 

1. Anschluss des I2C Display

 

Sowohl für den Arduino als auch für den Raspberry Pi sind I2C fähige Pins auf der Platine integriert. Dafür werden die SDA(Serial Data) und SCL (Serial Clock) Pins benötigt.

Auf den folgenden Skizzen sind die Pins markiert.

I2C Verbindung Arduino LCD Display

 

 

 

I2C Verbindung RaspberryPi LCD Display

 

2.1 Text auf LCD Display ausgeben (LiquidCrystal_I2C Arduino library)

 

Um das Modul mit dem Arduino zu nutzen, benötigst du die LiquidCrystal_I2C library. Sie kann in der Bibliotheksverwaltung der Arduino IDE gedownloadet werden.

• Starte die Arduino IDE- Sketch-Bibliothek einbinden- Bibliothek verwalten.

• Suche die LiquidCrystal_I2C library und lade die aktuelle Version herunter.

• Lade den nachfolgenden Sketch auf den Arduino um das Display zu testen.

Die Funktion der Befehle sind durch die Kommentarzeilen erklärt.

include  //LCD-Bibliothek laden
LiquidCrystal_I2C lcd(0x27, 16, 2)//(Adresse des LCD Treiber 0x26, Ziffern pro Zeile, Zeilen)

void setup() 
{
lcd.init(); 						//lcd wird gestartet 
lcd.backlight(); } 					//backlight wird angeschalten.

void loop() 
{
lcd.setCursor(0, 0); 				//Zeile 1 festgelegt 
lcd.print("Hallo"); 				//Text Zeile 1: Hallo
lcd.setCursor(0, 1); 				//Zeile 2 festgelegt.
lcd.print("Welt"); 					//Text Zeile 2: Welt
}
Hm, alles klar, aber ich sehe gar keine Ziffern.

 

Das Treibermodul ist nun richtig angeschlossen.
Auf dem LCD Modul ist jedoch nichts zu sehen..

Nicht wundern..das ist normal...die Hintergrundbeleuchtung des LCD Displays wird durch das Überbrücken der seitlichen Pins eingeschalten. Ohne die Überbrückung fließt kein Strom. Anstatt die Pins zu überbrücken, kannst du ebenfalls einen Schalter benutzen.

Zusätzlich musst du eventuell an dem Poti drehen um den Kontrast zwischen dem LCD Display und der Hintergrundbeleuchtung einzustellen.

 

LCDDisplay Hintergrundbeleuchtung

 

2.2 Text auf LCD Display Modul ausgeben (RPLCD Python library)

 

Um das Display mit dem Raspberry Pi zu nutzen benötigst du vorerst die RPLCD library. Sie kann über den Paket Manager (PIP) von Python installieren oder du lädst dir die library direkt von herunter.
Auf den neueren Raspbian Versionen ist der PIP Manager bereits vorinstalliert, weshalb du damit die library installieren kannst.
sudo pip install RPLCD

Zusätzlich benötigst du noch die aktuelle I2C Treiber Software.
sudo apt-get install python-smbus

►Starte nun den folgenden Python Sketch um das Display zu testen:

 

from RPLCD.i2c import CharLCD
lcd = CharLCD('PCF8574', 0x27)   			
#Initialisiere LCD Modul 
#'PFC8574' ->Chip des Treibers  
#0x27 -> I2C Adresse 
lcd.cursor_pos = (0,0)				
#Setze Cursor auf Zeile 0 und Spalte 0
lcd.write_string(u'Raspberry Pi')
#Schreibe den String von links nach rechts.
lcd.cursor_pos = (1,0)
lcd.write_string(u'I2C Display')

 

3.1 Lauftexte (LiquidCrystal_I2C Arduino library)

 

Es ist gut möglich, dass der auszugebende Text die Größe der Zeile von 16 Ziffern überschreitet. Sollte der Text zu groß sein, wird die Zeichenfolge abgeschnitten und nur die ersten Ziffern sind lesbar. Die Abhilfe ist ganz einfach!

Programmiere den Schriftzug als Lauftext!

Den folgenden Sketch kannst du dafür verwenden. Ändere die Variable "message" in deinen Text.

#include  
LiquidCrystal_I2C lcd(0x27, 16, 2); 

char message[] = "Beispielsketch für eine Laufschrift";

void setup() {
  lcd.init();
  lcd.backlight();
}

void loop() {
  scroll_text(message, 0);                                                                    /*Ausgabe des Textes in der ersten Zeile (lcd_row = =0) */
}

void scroll_text(char *message, int lcd_row){    
  
for (int printStart = 15; printStart >= 0; printStart--)  {                                   /*Scrollt den Text auf das LCD Modul von rechts nach links. (Print_Start = 15, Letters nach 15 werden abgeschnitten. Print_Start wird verringert bis auf 0. Textfeld voll. */
    showLetters(printStart, 0, message, lcd_row);                                             /*Setzt den Cursor auf Ziffer 15. Die Ziffer wird mit der for-schleife in void show_letters dekrementiert, bis der ganze Schriftzug auf der Zeile zu sehen ist. */
  }
for (int letter = 1; letter <= strlen(message); letter++) {                                   /*Scrollt den Text links aus dem LCD Modul raus. (Print_Start =1 , anzuzeigende Letters  des Strings verringert, bis Text aus dem Feld gescrollt.) */
    showLetters(0, letter, message, lcd_row);                                                 /*Setzt den Cursor auf Ziffer 1 und verringert die Länge des Schriftzugs nach jedem Durchlauf, bis der Text nach links aus dem Anzeigefeld rausgescrollt ist. */
  }
}


void showLetters(int printStart, int startLetter, char *message, int lcd_row) {            
  lcd.setCursor(printStart, lcd_row);                                                         /*Setzt den Cursor auf die Position print_Start */
  for (int currentLetter = startLetter; currentLetter < strlen(message); currentLetter++) {   /*Greift auf die Buchstaben des Text zu. */ 
    lcd.print(message[currentLetter]);                                                        /*Zeigt, die in den Funktionsargumenten übergebenen Ziffern an. */
  } 
  lcd.print(" ");                                                                             /*Falls keine Buchstaben nachrücken, schreibt leer */ 
  delay(400);                                                                                 /*Zeit zwischen dem Scrollen */
}

3.2 Lauftexte (RPLCD I2C Python library)

 

Der Sketch für die Ansteuerung mit dem Raspberry Pi mit Python. Das Prinzip ist das gleiche, wie bei der Arduino Version. Als erste wird der Text mit der for schleife (for shifts in range(1,digits+1,1):) von rechts nach links in das LCD Feld eingeschoben und sobald alle Ziffern zu sehen sind, wird der Text auf der rechten Seite abgeschnitten (for outshift in range(1,len(text)+,1):)

Um den Text zu ändern, kannst du das String Argument für den Funktionsaufruf "scroll_text('String', 16, lcd)" mit einem beliebigen Text ersetzen.

 

import time
from RPLCD.i2c import CharLCD
lcd = CharLCD('PCF8574', 0x27)

def scroll_text(text, digits, lcd):
    
    for shifts in range(1,digits+1,1):
		lcd.clear()
        lcd.cursor_pos = (0,(digits-shifts))
        lcd.write_string(text[:shifts])
        time.sleep(0.4)
              
    for outshift in range(1,len(text)+1,1):
		lcd.clear()
        lcd.cursor_pos = (0, (digits-shifts))
        lcd.write_string(text[outshift:len(text)])
        time.sleep(0.4)
        
scroll_text('Beispielcode für einen Lauftext', 16, lcd) 

Ok, der Code funktioniert zwar... ABER... der hintere Teil des Textes wird immer auf die zweite Zeile von meinem LCD Moduls umgebrochen? So bringt mir das nichts!

 

Ja das stimmt. Das liegt an der RPLCD library. In dem Code wird in der Zeile lcd eine Instanz der Klasse CharLCD mit den Parametern (PCF8547, 0x27) angelegt. Dabei steht PCF8574 für den Treiberchip. Der Wert 0x27 steht für den Adressierungswert im I2C Interface. Die Klasse beinhaltet noch einen weiteren Parameter "auto_linebreaks".

Ändere die Zeile 3 in: 

lcd = CharLCD('PCF8574', 0x27, auto_linebreaks = True)

Wie du siehst, gibt es einen weiteren paramater "auto_linebreaks". Um die Zeilenumbrüche zu deaktivieren, musst du den Parameter auto_linebreaks auf False stellen (auto_linebreaks = False).

 

3. LCD Display Auswahlmenü (LiquidCrystal I2C library)

 

Zum Schluss ist hier das Auswahlmenü für den Arduino . Die Navigation des Auswahlmenüs kannst du mit Tastatureingaben über den seriellen Monitor ausführen kannst. Dabei soll mit den Tasten "u" für up, "d" für down und "e" die Auswahl "Schrift""Alphabet" und "Countdown" ausgewählt werden können.

Die Kommunikation verläuft über die serielle Verbindung zum PC. Sobald eine Eingabe gesendet wurde, werden die zugehörigen Funktionen (void Schrift{}, void Alphabet{}, void Countdown{} aufgerufen.)

Die aktuelle Auswahl ist als Lauftext gekennzeichnet. Den Code findest du im Anhang im Ordner Arduino_I2C_Display.rar.

Die Menünamen kannst du ändern, indem du char select1, char select2, char select3 in deine gewünschten Menünamen änderst. Wenn du mehr Menüauswahlen haben möchtest, kannst du weitere char Variablen hinzufügen.

char select1[] = "Schrift";
char select2[] = "Alphabet";
char select3[] = "Countdown";
/* char select4 = {"Weitere Auswahlmöglichkeit"}..
 *  .....
 *  weitere Auswahlmöglichkeiten mit char4,char5... hinzufügbar
 */

typedef void (* GenericFP)();

char *auswahl[] = {select1, select2, select3);
 GenericFP f_menu[3] = {&Schrift, &Alphabet, &Countdown};		/*Funktionszuweisung zu Auswahlmöglichkeiten */

Beachte jedoch, dass du die neu erstellen Menünamen zudem in den Pointer char *auswahl (Zeile 15) eintragen musst.

Weiterhin sind die Menünamen Funktionen zugeordnet. Sollest du andere Menünamen verwenden, musst du zudem die Funktionnamen als auch die Zuweisung in GenericFP f_menu[3] (Zeile 16) ändern.

Solltest du mehr als 3 Menüs benötigen musst du die Listengröße [3] dementsprechend vergrößern.

Die Funktionen (void Schrift{}, void Alphabet{}, void Countdown{}) sind separaten Tabs eingefügt. Solltest du die Menünamen geändert haben, musst der Funktionsname anstatt void Schrift{} --> void (dein Menüname){} lauten.

Falls es nicht funktioniert, schreibe mir einen Kommentar oder eine Mail.


 

3.1 LCD Display Auswahl Menü (RPLCD python library)

 

Das Auswahlmenü in Python funktioniert ähnlich wie das in C. Der Unterschied liegt in der Darstellung des aktuell angewählten Menüs. Das auszuwählende Menü ist durch einen Pfeil gekennzeichnet.

Den Code findest du im Anhang als Python_LCD_Display.rar
 

Die Auswahlmöglichkeiten kannst du anpassen, indem du die Werte des Tuple "menu_home" änderst. Der erste String Wert wird auf dem LCD Modul angezeigt, der zweite ist die jeweilige Funktion, die bei der Auswahl ausgeführt wird.

Die Navigation erfolgt mit den Tasten u(up), d(down), e(enter).

Auswahlmenü


Der Code könnte beliebig mit Untermenüs aufgefüllt werden. Ich hoffe ich konnte dir mit Tutorial weiterhelfen.