-         
+ Antworten
Ergebnis 1 bis 10 von 10

Thema: 20x4 Display mit I2C Controller: Setup und Hello World

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    307
    Blog-Einträge
    3

    20x4 Display mit I2C Controller: Setup und Hello World

    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:	76
Größe:	93,4 KB
ID:	27436Klicke auf die Grafik für eine größere Ansicht

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

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

Name:	4.jpg
Hits:	50
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);
    }
    Geändert von Sisor (20.02.2014 um 09:16 Uhr) Grund: Übersichtlichkeit des Thread

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    16.02.2014
    Ort
    bei Karlsruhe
    Beiträge
    63
    Hey dankesehr!

    Das sieht mir ganz nach dem Teil aus was ich gestern Abend über Amazon bestellt habe und eigentlich erwarte daß das zu einem Zittersieg wird bis ich es zum laufen bekomme.

    Es ist da ziemlich spärlich beschrieben ("SainSmart IIC LCD2004-character display module") und weitere Doku wird wohl auch nicht mitgelifert, nur in den User-Bewertungen hat sich freundlicherweise einer geopfert und technische Hinweise gegeben - der verwendet aber externe Libraries.

    Jetzt bin ich wirklich gespannt wenn das Teil kommt. Wenn das nun so einfach wie von Dir beschrieben mit den integrierten Bibliotheken und Deinem Beispielprogramm funktioniert wäre das ja mehr Glück als ich verdient habe...

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.04.2008
    Beiträge
    253
    als Digispark-Fan verwende ich immer diese Dinger: http://shop.cboden.de/Displays/20x4-...rungssatz.html. Dort gibt es aber auch auch Displays und I2C Backplane getrennt, so dass man auf weniger als 15 Euro für ein 2004 I2C Display kommt ... und das auch noch von einem deutschen Versender. Zudem haben die Backplanes den Vorteil, dass sich die I2C Adresse einfach per Schalter einstellen lässt und nicht mit Löt-Brücken "hingebrutzelt" werden müssen. Sehr sinnvoll sind in meinen Augen auch die beiden I2C Stiftleisten ... so kann man einfach das nächste I2C Device "verketten".

    Ein total einfaches Beispielprogramm dafür findet sich auch auf: http://cboden.de/mikro-controller/digispark/lcd-anzeige .

    Das mit der fehlenden Doku ist aber wohl überall ein Problem

    PS: I2C belegt eigentlich nur 2 Pins (SDA und SCL) da man +5V und GND fairer Weise eigentlich nicht als Pin rechnen darf
    Geändert von redround (16.02.2014 um 14:56 Uhr)

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    16.02.2014
    Ort
    bei Karlsruhe
    Beiträge
    63
    Tja schade, soo einfach will's bei mir nun leider nicht klappen. Die LiquidCrystal_I2C.h gibt's nicht in meiner jungfräulichen Arduino-Umgebung und mit irgendeiner gleichnamigen, die ich im Netz gefunden habe scheitert's bereits am Compiler-Durchlauf.

    Aber genug für heute, morgen ist auch noch ein Tag...

    @redround
    Stimmt, solche Daisychain Stecker für'n I2C sind/wären wirklich eine feine Sache. Falls man wenigstens mal eine I2C-Komponente zum laufen kriegt.
    Ein Löt-Brücken-hingebrutzel wird's bei diesem Display aber auch nicht geben - da sind keine...

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    307
    Blog-Einträge
    3
    Stimmt. Ich war der festen Überzeugung, die LiquidCrystal-Library wäre im Standard-Librarypack.

    Hier downloaden:
    LiquidCrystal-Library

    Dann den Ordner 'LiquidCrystal' aus der .zip-Datei in den Ordner Dokumente/Arduino/libraries ziehen.
    Erst dann Arduino-IDE öffnen.

    Nun sollte die LiquidCrystal-Library bekannt sein.
    Geändert von Sisor (20.02.2014 um 08:56 Uhr)

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.04.2008
    Beiträge
    253
    Zitat Zitat von cdk Beitrag anzeigen
    Ein Löt-Brücken-hingebrutzel wird's bei diesem Display aber auch nicht geben - da sind keine...
    das ist natürlich blöd, da das Display dann über eine feste I2C Adresse verfügt, die Du kennen musst. 99,9% aller I2C Backplanes verwenden einen PCF8574 als I2C Portexpander. Der hat 3 Adress-Pins (zufällig Pin 1 bis 3). Da musst Du mal messen, welche davon mit GND und welche mit +5V verbunden sind. Daraus ergibt sich dann die Adresse (alle 3 GND = 0x20; alle 3 +5V = 0x27). Alternativ kannst Du auch einfach die Adressen 0x20 bis 0x27 per Schleife durchlaufen und jeweils versuchen einen anderen Text auszugeben. Bei einer der Adressen sollte das Display dann was anzeigen.

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    307
    Blog-Einträge
    3

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    16.02.2014
    Ort
    bei Karlsruhe
    Beiträge
    63
    Super! Vielen Dank Euch beiden - jetzt funktioniert alles, einschl. I2C-Scanner und Custom Chars!

    Mußte lediglich die Adresse für mein LCD von 0x27 auf 0x3f ändern, habe nämlich ein Display mit dem PCF8574A erhalten. Das Problem wird aber im WWW öfters erwähnt und selbst ohne dieses Wissen wär's ja nun dank der Scanroutine kein Problem gewesen. Selbst bei Sainsmart scheint man sich nicht sicher zu sein welche Version man denn nun verkauft - habe dort Beispielcode mit der einen wie auch mit der anderen Adresse gefunden...

    Sollte man die belegte Adresse wirklich mal ändern müssen wird's aber haarig. Leiterbahn durchtrennen is nich - bei dem Layout würde man damit auch den Rest der Schaltung mit abhängen. Da müßte man dann schon einen der SMD-Pins anlupfen und freischwebend "umpolen".

    Ist aber derzeit nicht mein Problem und mit dem Input aus diesem Thread kann ich mich jetzt mal daran machen die Ansteuerung selbst in den Griff zu bekommen. Dankesehr!

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    65
    Beiträge
    1.002
    Blog-Einträge
    1
    Hallo ,
    grossen Dank für die ausführlichen Berichte hier, ich habe auch einige solcher I2C -LCD Adapter von Saintsmart auf Lager, nur noch nicht im Einsatz gehabt.
    Da kann ich hier Berichtetes gleich bei der Verwendung dann mit einbringen. Sonst stehe ich auch wie der "Ochs vorm Neuen Tor"

    Gerhard
    Arduinos, STK-500, EasyPIC-40,+PICKIT 3 und STM8/32-Discovery Boards

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    16.02.2014
    Ort
    bei Karlsruhe
    Beiträge
    63
    So, habe derweil ein bißchen mit dem Teil rumgespielt. Wen's interessiert - anbei Fotos vom verfügbaren Zeichensatz:
    Klicke auf die Grafik für eine größere Ansicht

Name:	Zeichensatz_LCD_4x20_SainSmart.jpg
Hits:	42
Größe:	68,1 KB
ID:	27636

    Die erste Zeile "gilt nicht" - das sind selbst definierte Zeichen für meine Bargraphanzeige, die ich mit einem Alkoholsensor verwende. Ansonsten ist jenseits von 7bit-ASCII leider nicht viel brauchbares vorhanden - die letzten Zeilen bieten aber immerhin noch deutsche Umlaute und griechische Buchstaben an...

    Ansonsten ist mir aufgefallen daß das Display offensichtlich mal ein 2x80 Display war. Leider wird die 1. Zeile in die 3. (!) umgebrochen und die 2. in die 4., sodaß die Scroll-Befehle nur sehr bedingt brauchbar sind. Plöt.

    Aber dennoch muß ich sagen daß die blind investierten 20E für das Teil gut angelegt waren. Mit der Unterstüzung hier konnte ich es blitzschnell und problemlos verwenden und es bietet für eine zeichenbasierte Anzeige eine optimal große Anzeigefläche...

+ Antworten

Ähnliche Themen

  1. Verkaufe 2004 Character LCD Module Display 20X4 Zeichen Blau TC2004A-03
    Von bufu im Forum Kaufen, Verkaufen, Tauschen, Suchen
    Antworten: 4
    Letzter Beitrag: 25.01.2014, 12:23
  2. Initialisierung des LCD - Display (20x4)
    Von hemisoft im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 16
    Letzter Beitrag: 28.05.2013, 21:43
  3. neues 20x4 Display an M128
    Von copcom-weber im Forum Robby RP6
    Antworten: 6
    Letzter Beitrag: 18.06.2010, 08:55
  4. Display mit HX8238A Controller
    Von wurm im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 25.05.2009, 00:01
  5. Uni-Projekt: 15 Servos, LCD-Display, Schalter und Controller
    Von iNGY! im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 18
    Letzter Beitrag: 24.10.2007, 01:04

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •