PCF8574AP Eingänge auslesen

Hey,

ich hab an einem A. UNO per I2C einen PCF8574AP hängen, den ich für Tastereingänge benutzen möchte. Aber ich hab das Problem, das ich im moment nur immer einen Taster gleichzeitig ausgelesen bekomme. Ich bräuchte aber das auch mehrere Taster gleichzeitig gedrück sein können und ich aulesen kann welche genau gedrückt sind.

Siehe Beispiel Code wo immer nur ein Taster auslesbar ist, wenn da ein zweiter gedrückt ist bräuchte ich ja “tausende” IF Abfragen Kombinationen !?

Hat jemand ne Idee wie ich das “kompakt” hinbekommen kann ?

Bin noch sehr neu in der µC Welt :~

Gruß
Jens

#include <Wire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#define inputexpander B0111000  // Adresse des PCF8574 hier: PCF8574AP mit allen 3 Adress-Pins nach GND
#define outputexpander B0111001  // Adresse des PCF8574 hier: PCF8574AP mit A0 auf Hight, A2+3 auf GND
byte x=0;
byte y=0;
byte a=0;

void setup()
{
    Wire.begin();
    lcd.begin(16, 2);
    Serial.begin(9600); 
}

void loop()
{
  
    Wire.beginTransmission(outputexpander);     //Begin the transmission to PCF8574
    Wire.write(B00000000);                               //Send the data to PCF8574
    Wire.endTransmission();            //End the Transmission
  
  
    Wire.requestFrom(inputexpander,1); 
    if(Wire.available())     //If the request is available
      {
        x=Wire.read();       //Receive the data
        lcd.clear();
        lcd.setCursor(0, 1);
        lcd.print(x,BIN);
        Serial.println(x,BIN);
        
      }
    if(x<255)                     //If the data is less than 255
      {
        if (x==254) { lcd.setCursor(0, 0); lcd.print("Taster 1"); }; //P0
        if (x==253) 
          { 
           Wire.beginTransmission(outputexpander);     //Begin the transmission to PCF8574
           Wire.write(B00010000);                               //Send the data to PCF8574
           Wire.endTransmission();            //End the Transmission
           };
          
      }
   delay(1000);
   
 }

Du kriegst nicht die Nummer des Eingangs zurück, sondern das Bitmuster der 8 Eingänge. Somit hast Du immer den Status aller 8 Eingänge auf einmal. Oder hast Du nicht je einen Taster an einem der Eingänge des PCF8574A?

Du brauchst genau 8 IF um alle Eingänge abzufragen. Du kannst http://arduino.cc/en/Reference/BitRead verwenden um den Zustand eines einzelnen Bits des Bytes zu lesen.

Grüße Uwe

Hallo Jens, musst du absolut den PCF8574AP verwenden. Ich könnte mir vorstellen, dass es mit dem EDE300 http://www.componentkits.com/dslibrary/EDE300.pdf einfacher gehen könnte. Hier werden die 8 Eingänge serial gewandelt und du brauchst nur eine Codetabelle zu hinterlegen.

Gruß Gerd

COOL: Hallo Jens, musst du absolut den PCF8574AP verwenden. Ich könnte mir vorstellen, dass es mit dem EDE300 http://www.componentkits.com/dslibrary/EDE300.pdf einfacher gehen könnte. Hier werden die 8 Eingänge serial gewandelt und du brauchst nur eine Codetabelle zu hinterlegen.

Gruß Gerd

Wo bekommt man den EDE300. Als sinnvolle Alternative zu einem I2C Port Expander sehe ich nur ein Shiftregister. Grüße Uwe

uwefed: Du brauchst genau 8 IF um alle Eingänge abzufragen. Du kannst http://arduino.cc/en/Reference/BitRead verwenden um den Zustand eines einzelnen Bits des Bytes zu lesen.

Grüße Uwe

Hallo Uwe,

das mit dem BitRead hat super funktioniert.

Danke!

Gruß Jens