I2C-Bus und PCF8574 entprellen

Hallo zusammen,

da ich im Studium mich mit C/C++ nie anfreunden konnte habe ich das jetzt erst mal drei Jahre ruhen lassen und fange jetzt von vorne an.

Nun habe ich folgende Frage: ich habe am I2C-Bus einen PCF8574 mit Eingängen. Der läuft auch so weit. Nun will ich die Bounce-Bibliothek nutzen um den taster zu entprellen und die Flankenauswertung nutzen zu können.

Hier mal ein Code-Ausschnitt:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Bounce2.h>

#define I2C_ADDR    0x40 >> 1 // I2C-Addresse

LiquidCrystal_I2C lcd(0x38,16,4);

byte Eingang;

Bounce debouncer_P3 = Bounce();
Bounce debouncer_P2 = Bounce();
Bounce debouncer_P1 = Bounce();
Bounce debouncer_P0 = Bounce();

int I2C_0;
int I2C_1;
int I2C_2;
int I2C_3;

int Hoch = 0;
int Enter = 0;
int Runter = 0;
int Zuruck = 0;
int Stufen = 0;

void setup() {
  
 debouncer_P3.attach(I2C_3);
 debouncer_P3.interval(20);
 
 debouncer_P2.attach(I2C_2);
 debouncer_P2.interval(20);
 
 debouncer_P1.attach(I2C_1);
 debouncer_P1.interval(20);
 
 debouncer_P0.attach(I2C_0);
 debouncer_P0.interval(20);

  
  Wire.begin(I2C_ADDR); 
      lcd.init();
    lcd.setCursor(0,0);
    lcd.print("Hello, world!");
  
}


void loop() {
  Wire.beginTransmission(I2C_ADDR);
  //Wire.write(0xFF);              // Alle Pins HIGH
  
  Wire.requestFrom(I2C_ADDR, 1); 
  while(Wire.available() == 0); 
  Eingang = Wire.read();
  Wire.endTransmission(I2C_ADDR);
  
  if(Eingang == 1) I2C_0 = true;
  if(Eingang == 2) I2C_1 = true;  
  if(Eingang == 4) I2C_2 = true;  
  if(Eingang == 8) I2C_3 = true;
  
   debouncer_P3.update();
   debouncer_P2.update();
   debouncer_P1.update();
   debouncer_P0.update();
  
  Hoch = debouncer_P0.rose();
  Enter = debouncer_P1.rose();
  Runter = debouncer_P2.rose();
  Zuruck = debouncer_P3.rose();

Nun habe ich aber folgendes Problem: Die Auswertung toggelt unregelmäßig hin und her. Und wenn man den Taster drückt passiert meistens gar nix.

Vielleicht habe ich das mit dem debouncer.attach() falsch verstanden. Aber da muss es ja bestimmt auch eine Lösung geben. Oder kann man hier nur harte Pins vom Board auswerten?

Habe bisher nix gefunden zu dem Thema. Wenn mir da einer weiterhelfen könnte wäre das super.

Danke.

Vielleicht habe ich das mit dem debouncer.attach() falsch verstanden. Aber da muss es ja bestimmt auch eine Lösung geben. Oder kann man hier nur harte Pins vom Board auswerten?

const int PIN_1=10;
int PIN_2;

Bouncer b1();
Bouncer b2();

void setup() {
b1.attach (PIN_1); // entspricht attach (10);
b2.attach (PIN_2); // entspricht attach (0);
}

Mal abgesehen davon, dass ich den Sinn nicht verstehe, sollte wohl klar sein, dass es nicht gehen kann.

Eine Pin Nummer und der Inhalt einer Variablen sind verschieden. Und Bounce kann meines Wissens nicht konfiguriert werden, um den Inhalt einer Variablen auf Änderung zu überwachen, oder was immer du da vorhast.

Ausserdem ändern sich deine 4 Variablen I2C_0 ... nie mehr, nachdem sie evtl. einmal auf 1 gesetzt wurden ;)

Non puoi usare la libreria per fare il debounce. Devi farlo "a mano" rileggendo lo stato del pin dopo 5 mS. Ciao Uwe [EDIT] Entschuldigung; ich wechsle zu schnell von deutsch nach italienisch und bin mir manchmal nicht der zuvor verwendeten Sprache bewußt. Du kannst die Debunce Bibliothek für'S Entprellen nicht verwenden. Du mußt das Entprellen manuell im Sketch machen indem Du eine Verzögerung von 5-10 mS nach dem Lesen einbaust.

Grüße Uwe [/EDIT]

Genau das hatte ich vor. Wollte mir primär die Flankenauswertung ersparen.

Aber wenn die Bibliothek das nicht kann muss ich das wohl selber machen. Und das mit dem rücksetzen, da hast du recht.