Go Down

Topic: PCF8574AP Eingänge auslesen (Read 1 time) previous topic - next topic

Lan-Police

Oct 03, 2012, 08:34 pm Last Edit: Oct 03, 2012, 08:37 pm by Lan-Police Reason: 1
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

Code: [Select]
#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);
 
}

pylon

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?

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

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

uwefed


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

Lan-Police

#5
Oct 04, 2012, 09:37 pm Last Edit: Oct 04, 2012, 10:11 pm by Lan-Police Reason: 1

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

Go Up