Arduino NANO:    Torbaustein PCF8574
 

 
Alternativen zur Beschaltung der Torbits P0-P7 siehe im Datenblatt
Schaltungsdiagramm für den Torbaustein PCF 8574 am I2C-Bus des NANO-Boards
 
Der I2C-Baustein PCF8574 besitzt 8 Stück digitale Torausgänge mit offenem Kollektor. Von diesen kann jeder bei entsprechender Beschaltung als Eingang oder Ausgang benutzt werden. Eine mögliche Beschaltung der Pins zu Testzwecken, als Ausgang bzw, Eingang ist dem obigen Bild zu entnehmen. Alternativen beschreibt das Datenblatt.
 
Datenblatt des PCF8574
 

Programm PCF8574, digitale Torbits setzen und lesen
/*
Erweiterungstorbaustein PCF8574
===============================
Nach dem Einschalten des PCF8574 führen die Pins P0-P1 ein hochohmiges 1-Signal. Bei der im Bild gezeigten
Test-Beschaltung muß vom Programm sichergestellt werden, dass die Eingangspins ein 1-Signal ausgeben. Dieses kann vom Taster auf 0 gezogen werden, was auch die Leuchtdioden anzeigen.
 
*/

#include <Wire.h>                    // Einbinden der Wire-Bibliothek des Arduino
byte I2CadrTORa = 0x20;              // Basisadresse des Torbausteins PCF8574,A0=A1=A2=GND => TorA
                                     // je nach Beschaltung von A0-A2 sind noch die Adressen 0x21-0x27
                                     // möglich.
 
byte maskeIN = B11110000;            // Die Maske bewirkt, dass die Anschlusspins P0-P1 Eingänge sind
                                     // P4-P7 sind Ausgänge, die anfänglich auf 0 gesetzt sind.

// einmalig: Startbedingungen des Programms einstellen
// ---------------------------------------------------
void setup() {
   Wire.begin();
   Wire.setClock (100000L);          // I2C- Bus mit 100kHz
   writeTOR(I2CadrTORa, maskeIN);    // siehe maskeIN
}
 
// dauerhafte Schleife, in welcher das Tor des PCF8574
// gelesen und beschrieben wird
// ---------------------------------------------------
void loop() {
   byte torA;
   // delay bewirkt aus bisher ungeklärten Gründen, trotz
   // der unmittelbaren Lese/Schreibaktion den angegebenen
   // Verzug zwischen der Ein- und der Ausgabe
   // delay(2000);
   torA =readTOR (I2CadrTORa);
   // die Maske bewirkt, dass die Eingange bei
   // der Ausgabe weiterhin auf 1 gesetzt bleiben.
   writeTOR (I2CadrTORa, maskeIN+(torA>>4));
}
 
// liest das Tor mit der I2C-Adresse 'I2Cadr'
// und gibt dessen Wert 'torByte' zurück
// ------------------------------------------
byte readTOR(byte I2Cadr){
   byte torByte;
   Wire.beginTransmission (I2Cadr);
   Wire.requestFrom (I2Cadr, 1);     // Master will 1 Byte Daten vom Slave lesen
   if (Wire.available ()) {          // .. wenn die Daten verfügbar sind
      torByte = Wire.read();         // .. diese lesen
   }
   Wire.endTransmission();
   return torByte;
}
 
// schreibt den angegebenen Wert 'value'
// zum Tor mit der I2C-Adresse 'I2Cadr'
// -------------------------------------
void writeTOR(byte I2Cadr, byte value){
   Wire.beginTransmission (I2Cadr);
   Wire.write (value);               // Ausgabe des Bytes 'value'
   Wire.endTransmission();
}