Arduino PCF8574 lesen und schreiben

Im nachfolgenden Beispiel werden 8 Bit vom I2C-INPUT-Modul gelesen und 1:1 auf das I2C-OUTPUT-Modul ausgegeben.

Es ist also damit möglich mehrere digitale Signale von einer Karte auf die andere zu übertragen.

Die Adressierung der beiden Karten ist in der zweiten und dritten Zeile programmiert. Die auf unseren Karten aufgedruckte Adresse ist die 8-Bit Adresse. Beim Arduino muss die Slaveadresse im 7-Bit Format angegeben werden. Deshalb wird die Adresse mit dem Befehl  >> 1  durch zwei geteilt.

In den nächsten Programmzeilen werden alle Bits der Eingangskarte im PCF8574A nach high gesetzt. High ist auch die Grundeinstellung des PCF8574(A) wenn er an die Versorgungsspannung angeschlossen wird.

 

/*  
 ==============================================
 Test I2C-Input auf I2C-Output 
 ==============================================
 */

#include <Wire.h>
#define I2C_IN_ADDR 112 >> 1 // I2C-INPUT-Addresse als 7 Bit
#define I2C_OUT_ADDR 64 >> 1 // I2C-OUTPUT-Addresse als 7 Bit

byte WERT=0;
byte OUT_INV=0;
byte ALTWERT;

void setup() {
  Serial.begin(9600);       // Serielle Schnittstelle konfigurieren
  Wire.begin();             // I2C-Pins definieren

  // setzten aller Bits der Eingabekarte auf 1
  // -----------------------------------------
  Wire.beginTransmission(I2C_IN_ADDR);   // Start Übertragung zum PCF8574
  Wire.write(0xFF);                      // Alle Bits sind Eingänge
  Wire.endTransmission();                // Ende
}

void loop() { 

  // Einlesen der Bits aus der I2C-INPUT Karte
  // ------------------------------------------
  Wire.requestFrom(I2C_IN_ADDR, 1);    // Ein Byte (= 8 Bits) vom PCF8574 lesen
  while(Wire.available() == 0)         // Warten, bis Daten verfügbar 
    ;
  WERT = 255 - Wire.read();            // in invertierte Eingabe wandlen     
  
  if (WERT != ALTWERT) {               // Wert nur ausgeben wenn er sich ändert
    Serial.print("neuer Wert: ");      
    Serial.println(WERT);              // Wert auf "Seriel Monitor" ausgeben
    Wire.endTransmission(true);
    ALTWERT=WERT;                      // und nachführen
  }
  
  // Ausgeben der gleichen Bits an die I2C-OUTPUT Karte
  // --------------------------------------------------   
  OUT_INV = 255 - WERT;                 // in invertierte Ausgabe wandlen 
  Wire.beginTransmission(I2C_OUT_ADDR); // Start Übertragung zum PCF8574
  Wire.write(OUT_INV);                  // Wert schreiben
  Wire.endTransmission();               // Ende

}

 

Speichere in deinen Favoriten diesen permalink.

5 Kommentare

  1. I am using A4 for SDA and A5 for SCL.
    I will try connecting resistors.

    Thanks and Regards
    Nithin

  2. Thank you so much for your reply, I am using PCF8574 for output module and PCF8574A for input module but i also tried with PCF8574 for both the modules but still it did not work, what could be the problem?

    Thanks and Regards
    Nithin

    • Hello,
      witch Pins did you use on the arduino?
      please make a resistor 4,7k or 10k between
      +5V and SDA
      and an second resistor 4,7k or 10k between
      +5V and SCL

  3. Hello,

    I tried the code with arduino uno, but the code is not working for me, is it something has to do with input and output addressing pins i am using 8574 and in the input board it shows 64 +1(65), can you please help me.

    Thanks and Regards
    Nithin

    • Hello,
      both modules with PCF8574?
      Then you have to Jumper the Output-Board LOW LOW LOW = slave-address 64
      and the Input-module LOW LOW HIGH = slave-address 66

      #define I2C_IN_ADDR 66 >> 1 // I2C-INPUT-Addresse as 7 Bit
      #define I2C_OUT_ADDR 64 >> 1 // I2C-OUTPUT-Addresse as 7 Bit

      Then it works

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert