Go Down

Topic: Anleitung: PCF8574 als I2C-Input am Arduino (Read 23468 times) previous topic - next topic

Bernie007

Diese Anleitung dient dazu, die I2C-Kommunikation zwischen dem Arduino-Board und dem Port-Extension-Baustein PCF8574 zu demonstrieren. Der Code fragt drei Taster ab, die als Input am PCF8574 hängen. Je nachdem welche Taste gedrückt wird, leuchtet die rote, gelbe oder grüne LED, welche über das Standardverfahren zum Leuchten gebracht werden.  Anbei findet ihr den Schaltplan, ein Fritzing-Diagramm und den Code. Viel Erfolg mit Euren PCF8074-Experimenten!

Bernie007 grüßt

Code: [Select]

/* Programm zur Demonstration des Zusammenspiels zwischen Arduino und PCF8574
=============================================================================

Sinn des Codes:
==============
Auf einem Breadboard stecken drei Taster. Mittels dieser Taster sollen drei LEDs angesteuert werden. Prinzipiell ist das natürlich ohne den Erweiterungsbaustein PCF8574 möglich.
Freilich soll die Schaltung die Verwendung von I2C im Zusammenspiel zwischen dem Arduino und dem Baustein PCF8574 demonstrieren. So hängen die Taster am Erweiterungsbaustein,
während die LEDs wie üblich über das Arduino aus- und eingeschaltet werden.


Schaltplan:
===========
Arduino-Verbindungen mit LEDs:
------------------------------
Arduino-Pin 2: eine rote LED mit einem Vorwiderstand von 330 Ohm->GND
Arduino-Pin 3: eine gelbe LED mit einem Vorwiderstand von 330 Ohm->GND
Arduino-Pin 4: eine grüne LED mit einem Vorwiderstand von 330 Ohm->GND


Arduino-Verbindungen mit PCF8574:
---------------------------------
Arduino-Pin A4: vorgeschriebene SDA-Verbindung zum PCF8574, Pin 15=SDA
Arduino-Pin A5: vorgeschriebene SCL-Verbindung zum PCF8574, Pin 14=SCL
Arduino-Pin GND: vorgeschriebene GND-Verbindung zum PCF8574, Pin 8
Arduino-Pin 5V: vorgeschriebene 5V-Verbindung zum PCF8574, Pin 16

Verbindungen des PCF8574 zur Festlegung der Adresse und der Inputs (Taster):
---------------------------------------------------------------------------
Zunächst wird die Adresse des Porterweiterungsbausteins PCF 8574 definiert, und zwar mittels der Pins 1-3:
PCF8574, Pin1->GND
PCF8574, Pin2->GND
PCF8574, Pin3->GND
Zur Verwendung mehrerer PCF8574 kann man die Adresse natürlich ändern. Wichtig ist nur, dass jeder Baustein seine eigene Adresse hat.

PCF8574, Pin4=Pin P0->Taster 1->GND
PCF8574, Pin4=Pin P1->Taster 2->GND
PCF8574, Pin4=Pin P2->Taster 3-GND
*/

#include <Wire.h>
#define PCF8574 0x20

int ledPinRot=2;
int ledPinGelb=3;
int ledPinGruen=4;
boolean datenkomm=true;  //Das ist ein Mist. Keine Klassen in der Arduino IDE!

//Funktion zum Schreiben auf einen PCF8574-Baustein
void PCF8574_Write(int adresse, byte daten) {
  Wire.beginTransmission(adresse);
  Wire.write(daten);
  Wire.endTransmission();
  delay(5);
}

//Funktion zum Lesen des PCF8574-Bausteins
byte PCF8574_Read(int adresse) {
  byte datenByte=0xff;
  Wire.requestFrom(adresse,1);
  if(Wire.available()){
    datenByte=Wire.read();
    datenkomm=true;
    }
  else {
    datenkomm=false;
  }
  return datenByte;
}

void setup(){
  pinMode(ledPinRot, OUTPUT);
  pinMode(ledPinGelb, OUTPUT);
  pinMode(ledPinGruen, OUTPUT);
 
  //Alle Lampen aus: JA, genau so!!! HIGH heißt aus, LOW ist an! Das liegt am PCF8474
  digitalWrite(ledPinRot,HIGH); 
  digitalWrite(ledPinGelb,HIGH);
  digitalWrite(ledPinGruen,HIGH);
 
  Wire.begin();
  Serial.begin(9600);
  PCF8574_Write(PCF8574,0xff);
  }

void loop() {
  byte daten;
  daten=PCF8574_Read(PCF8574);
  if (datenkomm) {
    if(bitRead(daten,0))
      digitalWrite(ledPinRot,LOW);
    else
      digitalWrite(ledPinRot,HIGH);
     
    if(bitRead(daten,1))
      digitalWrite(ledPinGelb,LOW);
    else
      digitalWrite(ledPinGelb,HIGH); 
     
    if(bitRead(daten,2))
      digitalWrite(ledPinGruen,LOW);
    else
      digitalWrite(ledPinGruen,HIGH);
     
    delay(1000);
    }
}





Lafi2004

Hi,

how can i use a second or third PCF8574 with this libery?
Gruß Lafi

HotSystems

Hi,

how can i use a second or third PCF8574 with this libery?
Hier darfst du in deutsch schreiben.

Welche Library meinst du ?
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Lafi2004

Hallo,

ich benutze diese hier https://github.com/skywodd/pcf8574_arduino_library

Leider sind meine Kenntnisse noch recht bescheiden...

Vielen Dank für die Hilfe

Gruß Lafi

SpaghettiCode

Hi,

schau mal hier http://www.ti.com/lit/ds/symlink/pcf8574.pdf
Punkt 8.3.3 --> Die Adresse wird an der Hardware, also dem PCF8574 / Adapter geändert.

Gruß André

Lafi2004

Hallo André,

das mit der Adresse ändern hatte ich schon verstanden, aber wie spreche ich den 2. IC mittels der Software an?

Aus dem Beispielcode:
Code: [Select]
// PCF8574 instance
PCF8574 expander;


Kann ich das vielleicht so ändern?
Code: [Select]
// PCF8574 instance
PCF8574 expander1;
// PCF8574 instance
PCF8574 expander2;


Und dann so ansprechen?
Code: [Select]

  expander1.pinMode(0, OUTPUT);
  expander2.pinMode(0, OUTPUT);
Gruß Lafi

HotSystems

#6
Aug 11, 2018, 02:42 pm Last Edit: Aug 11, 2018, 02:52 pm by HotSystems
Und warum postest du nur Fragmente ?
Zeige den kompletten Sketch, dann können wir evtl. deinen Fehler erkennen.
Aber wenn du es unbedingt mit einer Libray machen musst, dann nimm diese hier.
Die funktioniert.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

postmaster-ino

Hi
Kann ich das vielleicht so ändern?
Code: [Select]
// PCF8574 instance
PCF8574 expander1;
// PCF8574 instance
PCF8574 expander2;


Und dann so ansprechen?
Code: [Select]

  expander1.pinMode(0, OUTPUT);
  expander2.pinMode(0, OUTPUT);

Jupp, sieht gut aus.
Der zweite (achte) 8574 ist ja auch nur ein weiterer I²C-Slave, Der genau wie sein Bruder angesprochen wird.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Go Up