Zitat Zitat von Sisor Beitrag anzeigen
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!

Klicke auf die Grafik für eine größere Ansicht

Name:	3.jpg
Hits:	138
Größe:	93,4 KB
ID:	27436Klicke auf die Grafik für eine größere Ansicht

Name:	2.jpg
Hits:	145
Größe:	90,7 KB
ID:	27435Klicke auf die Grafik für eine größere Ansicht

Name:	1.jpg
Hits:	94
Größe:	58,1 KB
ID:	27434Klicke auf die Grafik für eine größere Ansicht

Name:	4.jpg
Hits:	78
Größe:	40,2 KB
ID:	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);
}

Guten Abend,
tolle sache habe grade bei dir gesehen, mir ict auf gefallen das du dei Display mit Plus und minus versorgt hast aber der SDA ist auf 4 und SCL auf 5
du dagegen hast die 2 leitungen oben angeschlosse ist das so richtig? ich bin neu darum vielleicht die Dumme Frage.
danke und Gruß.
ledblu