PCF8574 – Ein LCD Display mit nur zwei Pins am Arduino betreiben.

Wie man ein LCD Display am Arduino anschließt habe ich ja nun schon mehrfach gezeigt. Nachteil war immer dass ein Display gleich einen Großteil der verfügbaren Pins des Arduino belegt hat. In diesem Beitrag erfahren Sie, wie man per I2C und mittels Portexpander PCF8574 – ein LCD Display mit nur zwei Pins am Arduino betreiben kann. Letztendlich zeige ich wie man mehrere Displays ebenfalls mit nur zwei Pins am Arduino betreiben kann.

Bauteile für dieses Beispiel

1 x Arduino Uno Rev.3
1 x Drehpoti
1 x PCF8574 Portexpander
1 x 16×2 LCD Display
und eine Menge Steckbrücken

16x2 PCF8574 I2C Breadboard Foto

 

Der Portexpander PCF8574

Da die Anzahl der digitalen Ports am Arduino begrenzt sind und man oft mehr Ports braucht als eigentlich verfügbar sind, kann man sich behelfen indem man einen Schieberegister benutzt. Man kann aber auch mittels I2C Bus den I/O Portexpander PCF8574 von Phillips ansteuern. Dieser Baustein bietet ganze 8 bidirektionale Portleitungen die man einzeln über den I2C Bus setzen und auch abfragen kann.

PCF8574 Belegung

 

Belegung des PCF8574

  • A0 – A2 = Auswahl der I2C Bus Adresse
  • P0 – P7 = Digitale I/O Ports
  • SDA = Datenleitung – Verbindung zum I2C Bus
  • SCL = Taktleitung – Verbindung zum I2C Bus
  • INT = Interrupt Ausgang
  • VDD = +5V
  • VSS = GND

Über die Ports A0, A1 und A2 lässt sich die Adresse einstellen. indem man diese Ports auf LOW oder HIGH setzt. Es lassen sich bis zu 16 PCF8574 am I2C Port des Arduino anschließen. Darauf, wie man diese Adressen nun genau einstellt möchte ich hier nicht näher eingehen. Sie sollten sich bei Interesse die Wiki Seite zu I2C und das DataSheet des PCF8574 anschauen.

 

Verbinden des Displays mit dem Portexpander

16x2 PCF8574 I2C Steckplatine

ACHTUNG
Je nach genutztem Arduino müssen Sie die Ports SDA und SCL des Portexpanders an unterschiedlichen Ports am Arduino anschließen. In der Liste sehen Sie wo bei den verschiedenen Arduinos SDA und SCL liegen.

Arduino               SDA          SCL
Arduino UNO           A4           A5 
Arduino Mega 2560     20           21
Arduino Leonardo      2             3

 

PCF8574                Arduino              Display
Port 16 (VDD)          +5V                  -
Port 15 (SDA)          A4 (SDA)             - 
Port 14 (SCL)          A5 (SCL)             -
Port 13 (INT)          -                    -
Port 12 (P7)           -                    -
Port 11 (P6)           -                    Port 4 (RS)
Port 10 (P5)           -                    Port 5 (R/W)
Port 9  (P4)           -                    Port 6 (E)
Port 8  (VSS)          GND                  -
Port 7  (P3)           -                    Port 14 (DB7)
Port 6  (P2)           -                    Port 13 (DB6)
Port 5  (P1)           -                    Port 12 (DB5)
Port 4  (P0)           -                    Port 11 (DB4)
Port 3  (A2)           GND                  -
Port 2  (A1)           GND                  - 
Port 1  (A0)           GND                  -

 

Library

Um nun bequem mit dem Display per I2C kommunizieren zu können, behelfe ich mir einer fantastischen Library, die Sie hier herunterladen können.

Beispiel Sketch

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

LiquidCrystal_I2C lcd(0x20,16,2);

void setup()
{
    lcd.init();
    lcd.setCursor(0,0);
    lcd.print("Hello, world!");
}

void loop()
{
  lcd.setCursor(0,0);
  lcd.print("Sek. seit Start");
  lcd.setCursor(0,1);
  lcd.print(millis()/1000);
}

 

Mehrere Displays am Arduino anschließen

Ein Display mit nur zwei Pins betreiben lief ja schon mal ganz gut. Aber die Vorteile von I2C sind ja, dass man bis zu 18 Portexpander gleichzeitig betreiben kann. Hier also ein Beispiel mit zwei Portexpandern und zwei Displays. Wie Sie sehen ist der Aufbau weiterer Portexpander kongruent zum ersten. Lediglich die Ports SDA und SCL  weiterer Portexpander müssen mit den Ports SDA und SCL des ersten Portexpanders verbunden werden. Der wichtigste Punkt hier sind jedoch die Verbindungen an A0 – A1. Am ersten Portexpander haben wir A0, A1 und A2 jeweils auf GND gelegt. Laut Datenblatt steht dies für die Adresse 0x20. Im oben angegebenen Sketch sehen Sie in Zeile 3, dass die Adresse 0x20 beim Aufruf des Displays mit übergeben wurde. Um nun zwei oder noch mehr Displays ansteuern zu können, müssen sich natürlich die Adressen aller Portexpander unterscheiden.

In diesem Ausschnitt aus dem Data Sheet des PCF8574 sehen Sie wie Sie die verschiedenen Adressen übergeben können. Ich habe für Portexpander 1 die Adresse 20h, also hexadezimal 20 oder auch 0x20 gewählt indem ich A0, A1 und A2 jeweils auf GND gelegt habe. Für den zweiten Portexpander werde ich die Adresse 21h, also 0x21 wählen. Dazu lege ich A0 auf +5V und A1, sowie A2 auf GND.

PCF8574 Address Map

 

 

Steckplatine mit zwei Portexpandern und zwei Displays

16x2 PCF8574 I2C 2 Displays Steckplatine

Beispiel Sketch

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

LiquidCrystal_I2C lcd1(0x20,16,2); // Display 1 mit 16 Spalten und 2 Zeilen an Adresse 20h
LiquidCrystal_I2C lcd2(0x21,16,2); // Display 2 mit 16 Spalten und 2 Zeilen an Adresse 21h

void setup()
{
    lcd1.init(); // Display 1 initialisieren
    lcd2.init(); // Display 2 initialisieren 

    lcd1.setCursor(0,0);
    lcd1.print("DISPLAY 1");

    lcd2.setCursor(0,0);
    lcd2.print("DISPLAY 2");

    delay(1000);

    lcd1.clear();
    lcd2.clear();
}

void loop()
{
  lcd1.setCursor(0,0);
  lcd1.print("Sek. seit Start");
  lcd1.setCursor(0,1);
  lcd1.print(millis()/1000);

  lcd2.setCursor(0,0);
  lcd2.print("Zeile 1");
  lcd2.setCursor(0,1);
  lcd2.print("Zeile 2");
}

16x2 PCF8574 I2C 2 Displays Breadboard



Schnäppchen bei reichelt elektronik!

Stark reduzierte Restbestände bei Neuware

Über Enrico S.

Programmierer, Webdesigner, Grafiker, Blogger, Screencaster, Arduino- und eMobility Enthusiast. nefilim3006 ist auch bei Google+ vertreten

8 Kommentare zu “PCF8574 – Ein LCD Display mit nur zwei Pins am Arduino betreiben.

  1. Servus!
    Ich habe mal eine Frage bezüglich SCL und SDA Ports. Ich lese überall das das die Ports 2+3 sind (benutze den Leonardo), aber ich habe das nicht hinbekommen. Nachdem ich mir den Leonardo mal genauer angeschaut habe, ist mir aufgefallen das es neben dem RESET-Knopf Pins mit SCL und SDA gibt, die funktionieren bestens (http://arduino.cc/en/uploads/Main/ArduinoLeonardoFront_2_450px.jpg).
    Gibt es da unterschiedliche Versionen, sind das verschiedene Revisionen vom Leonardo oder hab ich was komplett falsch verstanden?

    Martin

  2. Hallo Enrico,
    erst einmal Danke fuer die tollen Beiträge zum Arduino.
    Habe mir da schon einige Tipps holen können …

    Ich habe da mal eine Frage …

    Gibt es auch eine Möglichkeit auf beiden Displays die gleichen Werte auszugeben ohne dies wie hier doppelt zu schreiben zu muessen (Doppelbelegung im Speicher) … ?
    Gleiche Adresse den Displays zuweisen?

    void loop()
    {
    lcd1.setCursor(0,0);
    lcd1.print(„Sek. seit Start“);
    lcd1.setCursor(0,1);
    lcd1.print(millis()/1000);

    lcd2.setCursor(0,0);
    lcd2.print(„Zeile 1“);
    lcd2.setCursor(0,1);
    lcd2.print(„Zeile 2“);
    }

    Vielen Dank vorab!!!

  3. hallo auf dem bild mit den 2 displays ist beim pcf8574 pin3 mit +5v verbunden,pin1 ub 2 mit mit masse.das ergibt eine I2C-adresse von 4 also insgesammt nicht wie im programbeispeil 21 H sondern 24H.ist wohl einflüchtigkeitsfehler
    mfg

  4. Hallo,

    zunächst vielen Dank für all die super Tutorials, diese Seite hat mir schon viel weiter geholfen.
    Zum PCF8574 habe ich nur die Anmerkung, dass bei Verwendung der Version PCF8574A die Adresse von 0x20 zu 0x38 geändert werden muss, wie ich eben erfahren musste. Ist vielleicht eine Hilfestellung für Leute, bei denen dieses Problem in Zukunft auftritt.

    Mit freundlichen Grüßen

  5. Hallo
    Ich habe einen Portexpander PCF 8574AT SMD.
    Mit Bascom bekomme ich ihn nicht zum laufen,woran kanns liegen?
    Gruss Michael