20x4 LCD Modul über PCF8574 (I²C) betreiben

Hallo,
Ich möchte mein LCD Modul (20x4 Zeichen , HD44780 kompatibel)
mit einem PCF8574 Portexpander betreiben.

Ich habe ihn so angeschlossen:

Mein Code:

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

LiquidCrystal_I2C lcd(0x20,20,4);  // set the LCD address to 0x20 for a 16 chars and 2 line display

void setup()
{
  lcd.init();                      // initialize the lcd 
 
  // Print a message to the LCD.
  lcd.backlight();
  lcd.print("Hello, world!");
}

void loop()
{

Doch leider bekomme ich nur nichts erkennbares angezeigt:

Ich hoffe ihr könnt mir helfen

Gruß Steffen

Hallo,

da fehlen die Pullups. Für die Hintergrundbeleuchtung würde ich einen Vorwiderstand für die LEDs empfehlen. Außerdem hängt der PCF8574 an den falschen Ausgängen des Arduino. Wenn Du willst, guck mal hier: elektronik-bastelkeller.de

Gruß,
Ralf

stevie1002:
Doch leider bekomme ich nur nichts erkennbares angezeigt:
Dropbox - Error - Simplify your life

Ich hoffe ihr könnt mir helfen

Kann es sein, dass Du von Deinem IC PB0, PB1, PB2, PB3 mit den Anschlüssen DB4, DB5, DB6, DB7 verdrahtet hast?
Gehört das so?

Ich kenne mich zwar mit der direkten Verwendung solcher Chips nicht aus (und löte selbst immer nur fertige China-Adapter als Huckepackplatine an meine LCDs), aber ich würde das mal nachprüfen.

Außerdem dürftest Du die Hintergrundbeleuchtung mit zu viel Strom überlasten. Miß mal den Strom, der da gezogen wird und vergleiche mit dem Datenblatt! Oder schau im Datenblatt nach der zulässigen Betriebsspannung für die Hintergrundbeleuchtung! Meistens darf die Hintergrundbeleuchtung an 5V Displays nur mit 4.3 bis 4.5V betrieben werden, so dass ein kleiner Vorwiderstand notwendig ist.

Ralf:
stimmt das könnte ich noch ausprobieren, 4,7K Ohm an 5V oder?
In dem Link den du mir geschickt hast wird ein Arduino Leonardo verwendet, beim Uno sind das die richtigen pins.
(Hätte ich noch erwähnen sollen das ich ein Uno benutze :drooling_face: )

jurs:
Leider hab ich kein Datenblatt zu dem Modul und finde auch keines, ist irgendein China LCD und das kam ohne ein Blatt Papier :frowning:
Zu den Anschlüssen: Ich habe es bis jetzt immer so in den Bildern/Plänen gesehen, aber ob das auch stimmt weiß ich leider auch nicht.

Ich probiers mal mit Pullups und bau für das Backlight noch ein Widerstand ein.

danke schonmal

stevie1002:
stimmt das könnte ich noch ausprobieren, 4,7K Ohm an 5V oder?

Ja, 4,7 K sind in Ordnung.

Gruß,
Ralf

hangele dich mal mit dem Durchgangsprüfer von Pin 15 & 16 zu den Anschlüssen des Backlights. Wenn du von hinten auf die Leiterplatte guckst und oben rechts die Pins sind, dann sind bei mir linke Seite Mitte 2 Vorwiderstände und 2x 3 Lötbrücken, womit man das Backlight sogar umpolen kann. Rechts Mitte sind die 2 Pins des Backlight.
Die PullUps können zwischen 2,2K und 10K groß sein. Ich hatte aber auch schon den Fall, das mit 3,3k der I2C Bus einfror! Lade dir den I2C Scanner auf den Arduino und schau mal in den Serial Monitor. Wenn alles passt, findest du dann die Adresse vom Display. Danach schau mal, ob die Hintergrundbeleuchtung sich einschalten läßt. Es gibt Lib's, wo 2 Datenleitungen vertauscht sind. Das ist für die Pollin I2C Adadapterplatine erforderlich. Die Hintergrundbeleuchtung ist aber quasi der kleinste gemeinsame Nenner :slight_smile:

Gruß Gerald

stevie1002:
jurs:
Leider hab ich kein Datenblatt zu dem Modul und finde auch keines, ist irgendein China LCD und das kam ohne ein Blatt Papier :

Zum Glück haben ja fast alle LCDs die gleichen Anschlüsse in derselben Reihenfolge auf der Platine.

Falls Du "nur" bei den Datenleitungen etwas verwechselt hast, kannst Du ja mal diesen Test-Sketch ausprobieren, wenn Du ihn etwas umschreibst (Zeichenzahl pro Zeile von 16 auf 20, Library LiquidCrystal_I2C statt LiquidCrystal).

Bei diesem Test-Sketch scrollen alle 255 darstellbaren Zeichen über das Display, inklusive aller Sonderzeichen:
In der ersten Zeile von rechts nach links.
In der zweiten Zeile von links nach rechts.

Falls NUR Datenleitungen vertauscht sind, solltest Du wenigstens das Scrollen innerhalb der Zeilen sehen können:
In der ersten Zeile von rechts nach links.
In der zweiten Zeile von links nach rechts.

Und dabei sollte innerhalb von ca. 80 Sekunden jedes Zeichen in jeder Zeile einmal durch die Anzeige laufen. Wenn die Verkabelung richtig ist, folgen die Ziffer (012345...), die Großbuchstaben (ABCDEFG...) und die Kleinbuchstaben (abcdefg...) irgendwo in der Darstellung aufeinander. Wenn die Datenleitungen querbeet verkabelt sind, sind die Zeichen irgendwo über den Zeichensatz verteilt zu finden.

// LCD Scrolltext by 'jurs' for German Arduino Forum
// define the chars in one LED line
#define LEDLINE 16  

// Folgende zwei Zeilen Code für Sainsmart LCD Keypad Shield
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Sainsmart keypad LCD


// Folgende zwei Zeilen Code für I2C Display
// #include <LiquidCrystal_I2C.h>
// LiquidCrystal_I2C lcd(0x20,16,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display


// define scrolling speed for two LED lines
const int ledScrollSpeed[2]={300,300};
// define scrolling direction for two LED lines (true means right-to-left scrolling)
const boolean ledScrollDir[2]={true,false};

char charAt(char *text, int pos)
// scrolling-logic coded here
{
  if (pos<LEDLINE) return ' '; // scroll in
  else if (pos>=LEDLINE && pos<LEDLINE+strlen(text))
    return text[pos-LEDLINE]; // scroll text
  else return ' ';  // scroll out

}


void task_text(char *text, byte line)
// scroll the LED lines
{
  char currenttext[LEDLINE+1];
  static unsigned long nextscroll[2];
  static int positionCounter[2]; 
  int i;
  if (millis()>nextscroll[line])
  {
    nextscroll[line]=millis()+ledScrollSpeed[line]; 

    for (i=0;i<LEDLINE;i++)
      currenttext[i]=charAt(text,positionCounter[line]+i);
    currenttext[LEDLINE]=0;    

    lcd.setCursor(0,line);
    lcd.print(currenttext);
    if (ledScrollDir[line])
    {
      positionCounter[line]++;
      if (positionCounter[line]==strlen(text)+LEDLINE) positionCounter[line]=0;
    }  
    else  
    {
      positionCounter[line]--;
      if (positionCounter[line]<0) positionCounter[line]=strlen(text)+LEDLINE-1;
    }  
  }
}


char allChars[256];

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  for (int i=0;i<256;i++)
    allChars[i]=i+1;
//  allChars[256]=0;
}

void loop() {
  // Scroll text in line number 0
   task_text(allChars,0);
  // Scroll text in line number 1
   task_text(allChars,1);  
}

Sorry das ich so lange nicht mehr geschrieben hab, kam einfach nicht dazu :frowning:

@Nix_mehr_frei:
Das mit dem I²C-Scanner habe ich bereits getestet und er gibt mir die I²C-BUS Adresse 0x20 aus. Also dürfte es am I²CBus und dem PCF nicht liegen.
Ich gehe mal davon aus, dass das LCD-Modul falsch verdrahtet ist.
Das Display habe ich genau wie auf dem Bild verdrahtet, mit Ausnahme des Backlight's, das habe ich direkt an 5V und Gnd.
Eventuell benutze ich eine falsche Lib.

@jurs:
Es sind wohl nicht nur die Datenleitung falsch :frowning:

Die Anschlüsse:
1 - Gnd
2 - 5V
3 - 10k Poti
4 - P6
5 - P5
6 - P4
7 -
8 -
9 -
10 -
11 - P0
12 - P1
13 - P2
14 - P3
15 - 5V
16 - Gnd

Hallo, hier ein Link zu dem I2C Modul für LCD

http://www.pollin.de/shop/downloads/D810145B.PDF
vielleicht hilft´s.

Gruß Marco

Vom Pollin I2C Modul war bisher nie die Rede. Dieses benötigt eine angepasste Lib!
Näheres dazu findest du hier: http://hmario.home.xs4all.nl/arduino/LiquidCrystal_I2C/
Mit diesem Problem hatte ich auch zu kämpfen.

Gruß Gerald

Danke Marco, aber wie nix_mehr_frei bereits sagte, betreibe ich das LCD-Modul über einen PCF8574 Port-Expander (oder eher möchte ich es betreiben :expressionless: )

Mit dieser Lib müsste es ja theoretisch funktionieren, hier noch mal ein Schaltplan der im Ordner enthalten war:

Leider bin ich mir mit dem Bild nicht 100% sicher ob mit den Nummern auch wirklich die Anschlüsse gemeint sind die ich denke.

#edit:
Ohne den Expander Funktioniert das Display einwandfrei

Gruß
Steffen