Heute lag ein neues Display für mich in der Post.![]()
Da aber im Netz leider nur schlechte Dokumentation für mein neues 20x4 Display zu finden war,
habe ich mich entschlossen ein kleines 'HelloWorld' Demo zu schreiben:
Hardware:
Arduino Uno
20x4 Zeichen Display QC2004A mit Sainsmart LCD2004 Controller
4 Verbindungskabel
Anschlussmethode:
I2C (Verkabelung ist den angehängten Bildern zu entnehmen)
Software:
Arduino IDE
LiquidCrystal-Library
Als erstes den Ordner 'LiquidCrystal' aus der .zip-Datei in den Ordner Dokumente/Arduino/libraries ziehen.
Jetzt sollte die LiquidCrystal-Library bekannt sein.
Ein Wort zum I2C-Port:
Mein Display-Controller hat den Port 0x27.
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);
Sollte dieser Wert nicht bekannt sein, kann dieser I2C-Scanner zum Herausfinden des Ports benutzt werden.
Code:
Das Ergebnis ist eine leicht zu steuernde visuelle Anbindung an den Bediener bei nur 4 Pins belegten Pins. Klasse!Code:#include <Wire.h> #include <LiquidCrystal_I2C.h> //https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads // Belegung für 16x4 LCD-Modul QC2204A // mit Sainsmart LCD2004 I2C-Controller LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE); void setup() { lcd.begin(20,4); lcd.setCursor(4,1); lcd.print("Hallo Welt!"); delay(5000); } void loop() { //Display löschen und Cursor nach oben links lcd.clear(); lcd.home(); //---Zeilen ansprechen lcd.setCursor(4,0); lcd.print("Zeile 1"); lcd.setCursor(5,1); lcd.print("Zeile 2"); lcd.setCursor(6,2); lcd.print("Zeile 3"); lcd.setCursor(7,3); lcd.print("Zeile 4"); delay(2000); //---Display-Inhalt nach rechts scrollen lcd.scrollDisplayRight(); //lcd.scrollDisplayLeft() delay(2000); //---Cursor ein lcd.clear(); lcd.home(); lcd.print("Cursor blinkt:"); lcd.setCursor(0,1); lcd.blink(); delay(2000); //---alternativer Cursor lcd.clear(); lcd.home(); lcd.print("Cursor Unterstrich:"); lcd.setCursor(0,1); lcd.cursor(); delay(2000); //---Zurücksetzen lcd.clear(); lcd.home(); lcd.noCursor(); lcd.noBlink(); //---Alle Zeichen anzeigen lcd.print("Alle Zeichen..."); delay (2000); lcd.clear(); lcd.setCursor(2,0); int i=1; for (char c = -128; c < 127; c++,i++){ lcd.print(c); if (!(i%16)) lcd.setCursor(2,(i/16)%4); if (!(i%64)) delay(3000); } delay(3000); //---Display aus lcd.clear(); lcd.home(); lcd.print("Display aus..."); delay(2000); lcd.off(); delay(2000); //---Display wieder an lcd.on(); //lcd.noBacklight(); //lcd.backlight(); }![]()
![]()
![]()
![]()
![]()
-----------------------------Aktualisiert:-----------------------------
Wie baue ich mir eigene Zeichen (Custom Chars)?
Oben genanntes LCD hat 8 Speicherplätze für selbstdefinierbare Zeichen.
Pro Zeichen werden 5x8 Pixel benutzt.
Im folgenden wird eine Glocke als Zahlen-Code berechnet.
Anmerkung: Die Hex-Code-Umrechnung braucht man eigentlich nicht.
In eine Tabelle gepackt (1 bedeutet sichtbar, 0 unsichtbar) kann man mit ein bischen Phantasie die Glocke erkennen:
16 08 04 02 01 Bitwert 0 0 1 0 0 16*0 + 8*0 + 4*1 + 2*0 + 1*0 = 4 = 0x04 0 1 1 1 0 16*0 + 8*1 + 4*1 + 2*1 + 1*0 = 14 = 0x0E 0 1 1 1 0 16*0 + 8*1 + 4*1 + 2*1 + 1*0 = 14 = 0x0E 0 1 1 1 0 16*0 + 8*1 + 4*1 + 2*1 + 1*0 = 14 = 0x0E 1 1 1 1 1 16*1 + 8*1 + 4*1 + 2*1 + 1*1 = 31 = 0x1F 0 0 0 0 0 16*0 + 8*0 + 4*0 + 2*0 + 1*0 = 0 = 0x00 0 0 1 0 0 16*0 + 8*0 + 4*1 + 2*0 + 1*0 = 4 = 0x04 0 0 0 0 0 16*0 + 8*0 + 4*0 + 2*0 + 1*0 = 0 = 0x00
Nun fügen wir die Glocke (und 7 andere Zeichen) im Code als Array ein:
uint8_t bell[8] = {0x04,0x0E,0x0E,0x0E,0x1F,0x00,0x04,0x00};
oder alternativ:
uint8_t bell[8] = {4, 14, 14, 14, 31, 0, 4, 0};
Dann übergeben wir das Array an das Display (Speicherplatz 0):
lcd.createChar(0, bell);
Und lassen es ausgeben:
lcd.write(byte(0));
Code:#include <Wire.h> #include <LiquidCrystal_I2C.h> // Belegung für 16x4 LCD-Modul QC2204A // mit Sainsmart LCD2004 I2C-Controller LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE); void setup() { lcd.begin(20,4); createCustomChars(); lcd.setCursor(2,1); lcd.print("Eigene Zeichen!"); delay(5000);lcd.clear(); lcd.print("Codes 0x00-0x07"); lcd.setCursor(0, 2); for (int i=0; i<8; i++) { lcd.write(byte(i)); } } void loop() {} void createCustomChars() { uint8_t bell[8] = {0x04,0x0E,0x0E,0x0E,0x1F,0x00,0x04,0x00}; uint8_t note[8] = {0x02,0x03,0x02,0x0E,0x1E,0x0C,0x00,0x00}; uint8_t clock[8] = {0x00,0x0E,0x15,0x17,0x11,0x0E,0x00,0x00}; uint8_t heart[8] = {0x00,0x0A,0x1F,0x1F,0x0E,0x04,0x00,0x00}; uint8_t duck[8] = {0x00,0x0C,0x1D,0x0F,0x0F,0x06,0x00,0x00}; uint8_t check[8] = {0x00,0x01,0x03,0x16,0x1C,0x08,0x00,0x00}; uint8_t cross[8] = {0x00,0x1B,0x0E,0x04,0x0E,0x1B,0x00,0x00}; uint8_t retarrow[8] = {0x01,0x01,0x05,0x09,0x1F,0x08,0x04,0x00}; lcd.createChar(0, bell); lcd.createChar(1, note); lcd.createChar(2, clock); lcd.createChar(3, heart); lcd.createChar(4, duck); lcd.createChar(5, check); lcd.createChar(6, cross); lcd.createChar(7, retarrow); }







Zitieren



Lesezeichen