Sainsmart I2C LCD 2004 in Betrieb nehmen

Hallo,
vor einiger Zeit habe ich mir ein SainSmart LCD 20 x 4 mit festangebauten Portexpander für I2C-Anschluss gekauft.
(Siehe hier die Herstellerseite, bei dieser Variante ist immerhin ein Link mit der Library new LiquidCrystal von fmalpartida)
Ich hab das LCD so an meinen Arduino angeschlossen:
LCD / Arduino:
GND → GND
Vcc → +5V
SCL → SCL (“15”)
SDA → SDA (“14”)
Nach dem Einschalten waren die Zeichen (die 5x8 Pixel) in der ersten und dritten Zeile komplett gefüllt, ein Zeichen hat etwas geblinkt. Die Füllung der beiden Zeilen konnte ich mit einer Justage am Poti für den Kontrast beheben. (Find ich etwas merkwürdig, dass da nur 2 Zeilen bei falschem Kontrast schwarz werden).
Ich habe das “Hello World” Programm für I2C aus der oben genannten Libraray-Sammlung von fmalpartida geladen. Daraufhin wurden zwei Zeichen in der Mitte der ersten Zeile mit 4 Strichen gefüllt, die sich nach ablauf des setup-Teils (nach 1 Sekunde) etwas weiter geschoben haben bis in die 2. Zeile, dann fing das Display an zu blinken (die Hintergrund beleuchtung…)
Eigenlich sollte Im setup-Teil ein Text angezeigt werden und im Loop-Teil eine kleine Animation über Custom-Zeichen. Die Hintergrundbeleuchtung wird gar nicht angesprochen.

Ich weiß jetzt nicht wo die Fehlerquelle liegt.

  • Passt die Library nicht? - Die ist aber immerhin von SainSmart direkt verlinkt… Allerdings passt hier auch die Adresse nicht, mein LCD hat die Adresse 0x3F, nicht 0x38) aber gut, die Library ist ja nicht maßgefertigt für dieses LCD.
  • werden die falschen Pins angesteuert? Es gibt einen Constructor bei dem man die Pins der einzelnen Anschlüsse des LCD übergeben kann… Allerdings habe ich keinerlei Dokumentation gefunden, welcher Pin wo angeschlossen ist (die Pins sind PCF8574-seitig nicht beschriftet…)
  • Ist das Teil kaputt?
  • Hab ich das Teil falsch angeschlossen? Ich habe etwas hier im Forum recherchiert und bin auch eine Fritzing-Skizze gestoßen, bei der der I2C Bus an Analoge Pins angeschlossen wird - welchen Sinn hat das?

Hat vielleicht jemand Erfahrung mit den SainSmart-LCDs? Ich würd mich über Hilfe sehr freuen!

Hier ist das Programm “HelloWorld_i2c.pde”

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>



#define BACKLIGHT_PIN     13

LiquidCrystal_I2C lcd(0x3F);  // Set the LCD I2C address

//LiquidCrystal_I2C lcd(0x38, BACKLIGHT_PIN, POSITIVE);  // Set the LCD I2C address


// Creat a set of new characters
const uint8_t charBitmap[][8] = {
   { 0xc, 0x12, 0x12, 0xc, 0, 0, 0, 0 },
   { 0x6, 0x9, 0x9, 0x6, 0, 0, 0, 0 },
   { 0x0, 0x6, 0x9, 0x9, 0x6, 0, 0, 0x0 },
   { 0x0, 0xc, 0x12, 0x12, 0xc, 0, 0, 0x0 },
   { 0x0, 0x0, 0xc, 0x12, 0x12, 0xc, 0, 0x0 },
   { 0x0, 0x0, 0x6, 0x9, 0x9, 0x6, 0, 0x0 },
   { 0x0, 0x0, 0x0, 0x6, 0x9, 0x9, 0x6, 0x0 },
   { 0x0, 0x0, 0x0, 0xc, 0x12, 0x12, 0xc, 0x0 }
   
};

void setup()
{
   int charBitmapSize = (sizeof(charBitmap ) / sizeof (charBitmap[0]));

  // Switch on the backlight
  pinMode ( BACKLIGHT_PIN, OUTPUT );
  digitalWrite ( BACKLIGHT_PIN, HIGH );
  
  lcd.begin(20,4);               // initialize the lcd 

   for ( int i = 0; i < charBitmapSize; i++ )
   {
      lcd.createChar ( i, (uint8_t *)charBitmap[i] );
   }

  lcd.home ();                   // go home
  lcd.print("Hello, ARDUINO ");  
  lcd.setCursor ( 0, 1 );        // go to the next line
  lcd.print (" FORUM - fm   ");
  delay ( 1000 );
}

void loop()
{
   lcd.home ();
   // Do a little animation by writing to the same location
   for ( int i = 0; i < 2; i++ )
   {
      for ( int j = 0; j < 16; j++ )
      {
         lcd.print (char(random(7)));
      }
      lcd.setCursor ( 0, 1 );
   }
   delay (200);
}

Hoi,

veresuch mal diesen Sketch (Adresse natürlich anpassen):

/* YourDuino.com Example Software Sketch
 20 character 4 line I2C Display
 Backpack Interface labelled "LCM1602 IIC  A0 A1 A2"
 terry@yourduino.com */

/*-----( Import needed libraries )-----*/
#include <Wire.h>  // Comes with Arduino IDE
// Get the LCD I2C Library here: 
// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
// Move any other LCD libraries to another folder or delete them
// See Library "Docs" folder for possible commands etc.
#include <LiquidCrystal_I2C.h>
/*-----( Declare Constants )-----*/
//none
/*-----( Declare objects )-----*/
// set the LCD address to 0x27 for a 20 chars 4 line display
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address


/*-----( Declare Variables )-----*/
//none

void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(9600);  // Used to type in characters

  lcd.begin(20,4);         // initialize the lcd for 20 chars 4 lines and turn on backlight

// ------- Quick 3 blinks of backlight  -------------
  for(int i = 0; i< 3; i++)
  {
    lcd.backlight();
    delay(250);
    lcd.noBacklight();
    delay(250);
  }
  lcd.backlight(); // finish with backlight on  
  
//-------- Write characters on the display ----------------
// NOTE: Cursor Position: CHAR, LINE) start at 0  
  lcd.setCursor(3,0); //Start at character 4 on line 0
  lcd.print("Hello, world!");
  delay(1000);
  lcd.setCursor(2,1);
  lcd.print("From YourDuino");
  delay(1000);  
  lcd.setCursor(0,2);
  lcd.print("20 by 4 Line Display");
  lcd.setCursor(0,3);
  delay(2000);   
  lcd.print("http://YourDuino.com");
  delay(8000);
// Wait and then tell user they can start the Serial Monitor and type in characters to
// Display. (Set Serial Monitor option to "No Line Ending")
  lcd.setCursor(0,0); //Start at character 0 on line 0
  lcd.print("Start Serial Monitor");
  lcd.setCursor(0,1);
  lcd.print("Type chars 2 display");   


}/*--(end setup )---*/


void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  {
    // when characters arrive over the serial port...
    if (Serial.available()) {
      // wait a bit for the entire message to arrive
      delay(100);
      // clear the screen
      lcd.clear();
      // read all the available characters
      while (Serial.available() > 0) {
        // display each character to the LCD
        lcd.write(Serial.read());
      }
    }
  }

}/* --(end main loop )-- */


/* ( THE END ) */

Habe auch so ein Teil gekauft und dachte, es wäre im Dutt 8) - isses aber nicht :smiley:

Und: beim UNO sind SCL und SDA an A4 und A5 rausgeführt :wink:

an welchem Arduino betreibst du das Display?

Müsste ein UNO sein:

SCL -> SCL ("15")
SDA -> SDA ("14")

Denke mal, dass das nicht wirklich Pin14 und 15 sind (wegen Anführungszeichen) sondern die beiden (neuen) zusätzlichen Ports daneben (ab Rev. 3 ist da ja beim UNO der I2C Bus rausgeführt - neben A4 und A5 auf den "alten" Revisionen)

Ich hatte letztens ein ähnliches Problem. Diese Seite hatte geholfen
http://arduino-info.wikispaces.com/LCD-Blue-I2C

http://forum.arduino.cc/index.php?topic=203389.msg1498751#msg1498751

//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

ist das Entscheidende am Ganzen ... bis auf die Adresse kann das bei (fast) allen LCDs mit I2C Backpacks übernommen werden :smiley:

Nach dem Einschalten waren die Zeichen (die 5x8 Pixel) in der ersten und dritten Zeile komplett gefüllt, ein Zeichen hat etwas geblinkt. Die Füllung der beiden Zeilen konnte ich mit einer Justage am Poti für den Kontrast beheben. (Find ich etwas merkwürdig, dass da nur 2 Zeilen bei falschem Kontrast schwarz werden).

Diese "Einschaltbildschirm" ist zur Kontrasteinstellung gedacht und kommt sobald das LCD Modul versorgungsspannung bekommt. Wenn du jetzt mit dem Kontrast die Zeichen wegregelst, heißt das, daß Du den Kontrast für das Display so eingestellt hast, daß man nichts sehen kann.
Also Display mit Spannung versorgen und den kontrast so regeln daß man die beiden Balken besonders gut sieht.

Viele Grüße Uwe

Leute, ihr seid toll, hier lerne ich immer wieder was dazu :slight_smile:
Richtig vermutet, ich habe einen UNO R3, sorry das hab ich vergessen zu erwähnen.
Ich werd das morgen mal ausprobieren, mit der direkten Pinzuweisung. Das hatte ich auch schon in Vermutung, nur hab ich mangels Dokumentation leider keine Ahnung, was wo angeschlossen ist :expressionless:
Dass die zwei gefüllten Zeilen zur Kontrasteinstellung sind, wäre ja eine gute Erklärung, allerdings habe ich ja noch einen blinkenden Cursor und die zwei Zeichen, die aus 4 waagrechten Strichen bestehen - die sind einwandfrei zu sehen. Ich werd da morgen auch nochmal etwas rumprobieren, habs jetzt vorerst wieder so eingestellt, dass die Zeilen schwarz sind, danke für den Hinweis.

Wenn es alles korrekt angeschlossen ist, sollte das nach der Initialisierung des Displays weggehen.

So, einen Tag später als angekündigt, aber immerhin :slight_smile:
Danke für die Verlinkung auf http://arduino-info.wikispaces.com/LCD-Blue-I2C
Die Anzeige aus dem Setup-Programm funktioniert. Die Library hat wohl falsche Default-Werte für den Constructor ohne explizite Pin-Angabe. Wenn das LCD-Object mit dieser Zeile anlegt, funktionierts:
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

Eine Frage zum Display: Ich habe leider offenbar ein japanisches Modell gekauft - kann ich das irgendwie dazu überreden, Umlaute darzustellen? (Ohne den Umweg über Custom-Chars, da man damit wohl niemals schön die print-Funktionen verwenden könnte.)
Und rein informativ: Wo bekomme ich günstig ein 2004 LCD in deutscher Ausführung (muss kein I2C sein, da ich das Teil ja auch umlöten kann. (Oder evtl. auch selbst bauen, mit einem PCF8574)

Das hängt mit dem Controller auf dem Display zusammen. Es gibt zwar einen europäischen Zeichensatz, aber die haben praktisch alle den japanischen Zeichensatz. Schau mal ins Datenblatt des Controllers auf Seite 17:

Die Umlaute gibt es aber sie entsprechen nicht den ASCII-Werten, da die gar nicht Teil des Standard ASCII Satzes sind:
ä -> 1110 0001 -> 0xE1
ö -> 1110 1111 -> 0xEF
ü -> 1111 0101 -> 0xF5

Wenn du dann lcd.write(0xE1) machst hast du ein 'ä'.

Du kannst auch sowas machen:

char str[] = { 'K', 0xF5, 'h', 'l', '\0' };
lcd.print(str);

Hallo habe das problem das bei meinem Modul die Fehlermeldung "POSITIVE" nicht declared ist.
kennt jemand den fehler.

gruß bello12

Passt die Library auch wirklich zu dem Sketch die den irgendwoher hast? Wahrscheinlich nicht. Es gibt mehrere Libraries die gleich heißen aber unterschiedlich aufgebaut sind.