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 }
I am using A4 for SDA and A5 for SCL.
I will try connecting resistors.
Thanks and Regards
Nithin
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
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