Oplossing drukknoppen op I2C

Wanneer op de I/O-pinnen van een PCF8574 een verandering optreedt, zal het INT-signaal van de PCF8574 laag worden. We verbinden dit signaal met pin 4 van de Leonardo om te kunnen vaststellen dat er een wijziging gebeurd is op de PCF8574, en dat de nieuwe toestand moet worden ingelezen via de I2C bus.

#include <Wire.h>

void setup() {
  Wire.begin();        // join i2c bus (address optional for master)
  Serial.begin(115200);  // start serial for output
  pinMode(4,INPUT_PULLUP);
}

void loop() {
  // zet alle uitgangen van de PCF8574 hoog
  Wire.beginTransmission(0x38);
  Wire.write(0xFF);
  Wire.endTransmission();

  // wacht tot de INT pin laag wordt
  while(digitalRead(4)) {}
  Wire.requestFrom(0x38, 1);    // vraag 1 byte aan de PCF8574

  while (Wire.available()) { // wacht tot byte beschikbaar is
    byte c = Wire.read();    // lees de waarde
    Serial.println(c,BIN);     // print de waarde binair
  }
}

In de loop()-functie zetten we eerst alle I/O lijnen van de PCF8574 hoog. Daarna wachten we tot pin 4, die verbonden is met het INT-signaal van de PCF8574 laag wordt.

Als dit gebeurd is vragen we de PCF8574 om de waarde op de I/O pinnen door te sturen. We wachten met de Wire.available() functie tot de PCF8574 zegt dat hij klaar is om de waarde te sturen, en lezen die dan met de Wire.read()-functie.

Daarna zenden we de nieuwe waarde in binaire vorm naar de seriële terminal.