Pages: [1]   Go Down
Author Topic: PCF8574AP Eingänge auslesen  (Read 818 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-confuse

Gruß
Jens

Code:
#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);
  
 }
« Last Edit: October 03, 2012, 01:37:34 pm by Lan-Police » Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 96
Posts: 4763
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20298
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 194
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20298
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: October 04, 2012, 03:11:55 pm by Lan-Police » Logged

Pages: [1]   Go Up
Jump to: