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:
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();
}
Das Ergebnis ist eine leicht zu steuernde visuelle Anbindung an den Bediener bei nur 4 Pins belegten Pins. Klasse!:p
Anhang 27436Anhang 27435Anhang 27434Anhang 27437
-----------------------------
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);
}