//Programm zum Auslesen aller Eingänge am PCF8574/*###############################################Programm zum Auslesen der Inputs am PCF8574Es müssen beim Programmstart einige Sachen berücksichtigt werden: - Baudrate im seriellen Monitor ist 9600 - Adresse für TestIO einstellen - Die Eingänge des Portexpanders benötigen ein GND Signal zum Schalten. Das Signal wird dann softwareseitig invertiert
Viel Spaß beim Ausprobieren###############################################*/#include <Wire.h> //Bibliothek mit wichtigen Befehlen für I2C Kommunikation
#define TestIO 0x38 //Mein Test IC
byte WERT[4] = {0,0,0,0}; //Empfangener ByteWert (Aufruf und Beschreiben über WERT[0] = ... bis WERT[3] = ...byte ALTWERT[4] = {0,0,0,0}; //Hilfsvariable zum Prüfen auf Änderungen am Port
bool InTestIO[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //Hier werden die einzelnen Bits hinterlegt, damit sie später im Programm zur Verfügung stehen 0-7 ist Aktueller Zustand, 8-15 Änderung vorhanden?bool Test = false; //Toggle Beispielvariable
long Stopuhr[5] = {0,0,0,0,0}; //Hilfsvariablen für das zeitbasierte Aufrufen von Programmabschnitten
void I2C_Write(int adr, int var1) //Einfaches Byte senden{ Wire.beginTransmission(adr); // Start Übertragung zum Gerät mit Adresse 'adr' Wire.write(var1); // Variable /Byte senden Wire.endTransmission(); // Ende}
void I2C_Write_M(int adr, int var1, int var2) //2 Bytes senden{ Wire.beginTransmission(adr); // Start Übertragung zum Gerät mit Adresse 'adr' Wire.write(var1); // 1. Variable Wire.write(var2); // 2. Variable Wire.endTransmission(); // Ende}
void setup() { Wire.begin(); // Bus starten Serial.begin(9600); // Serielle Ausgabe starten I2C_Write(TestIO, 0xFF); //alle Bits sind Eingänge (Standardmäßig mit Pullup)
delay(1000); //Kurze Verzögerung Serial.println("Programm ist Startklar");}
void loop() {Abfrage_Inputs(100);Abarbeitung_Inputs();}/*###################################### * Abfrage der Inputs an einem Portexpander * Kann beliebig kopiert und angepasst werden für alle weitere Expander######################################*/void Abfrage_Inputs(int I2CInt){ if(millis() - Stopuhr[0] > I2CInt) { //Portexpander TestIO auslesen Wire.requestFrom(TestIO, 1); // Ein Byte (= 8 Bits) vom PCF8574 lesen while(Wire.available() == 0); // Warten, bis Daten verfügbar WERT[0] = 255 - Wire.read(); // in invertierte Eingabe wandeln if (WERT[0] != ALTWERT[0]) { // Wert nur ausgeben wenn er sich ändert Serial.print("neuer Wert TestIO: "); Serial.println(WERT[0]); // Wert auf "Serial Monitor" ausgeben Wire.endTransmission(true); for(int i = 0; i<8; i++) //Alle 8 Bit werden als einzelne Bits an den Seriellen Monitor ausgegeben und in Die InTestIO an der richtigen Stelle gespeichert, { Serial.println(bitRead(WERT[0], i)); if(InTestIO[i] != bitRead(WERT[0], i)) //Ist eine Änderung vorhanden? { InTestIO[i] = bitRead(WERT[0], i); InTestIO[i+8] = true; //Bit für die Änderung des einen Kanales setzen } } ALTWERT[0]=WERT[0]; // und nachführen } Stopuhr[0] = millis(); //Zurücksetzen der Stopuhr } }
void Abarbeitung_Inputs() //Aufruf der einzelnen Bits{ if(InTestIO[8]) //Wenn Bit0 eine Änderung hat, dann... { InTestIO[8] = false; //Zurücksetzen des Bits Änderung, da ja der geänderte Wert bearbeitet wird if(InTestIO[0]) //Wenn Bit0 True ist, dann... { Test = !Test; //Variable Toggeln jedesmal wenn ein True Signal anliegt. Serial.print("Toggle Variable: "); Serial.println(Test); //Ausgabe } else //sonst.... { } }
if(InTestIO[9]) { InTestIO[9] = false; if(InTestIO[1]) { } else { } }
if(InTestIO[10]) { InTestIO[10] = false; if(InTestIO[2]) { } else { } }
if(InTestIO[11]) { InTestIO[11] = false; if(InTestIO[3]) { } else { } }
if(InTestIO[12]) { InTestIO[12] = false; if(InTestIO[4]) { } else { } }
if(InTestIO[13]) { InTestIO[13] = false; if(InTestIO[5]) { Serial.println("IO6: TRUE"); //Beispiel Ausgabe } else { Serial.println("IO6: False"); } }
if(InTestIO[14]) { InTestIO[14] = false; if(InTestIO[6]) { } else { } } if(InTestIO[15]) { InTestIO[15] = false; if(InTestIO[7]) { } else { } }}