Das Programm habe ich wieder zur Seite gelegt. Und ich habe ein anderes ausgegraben. Die Lib von dem gefällt mir besser, weil die offenbar auch gepflegt wird. Jedenfalls soweit ich das sehe. Das ist jetzt das Testprogramm:
Code: Alles auswählen
/**
* @Datei
* @Autor Septillion (https://github.com/sseptillion)
* @Datum 20.05.2016
* @brief Beispiel für die Verwendung von buttonRead()
*
* Aufgrund des quasi-bidirektionalen Ports am PCF8574 ist es
* möglich, denselben Pin gleichzeitig als Ein- und Ausgang zu verwenden.
*
* Verbinden Sie dazu die LED (oder ein anderes Gerät) zwischen Vcc und dem Pin und
* eine Taste zwischen GND und dem Pin.
*
* Um den Pin zu lesen, ist der Ausgang kurz (460us @ normale I2C-Geschwindigkeit)
* während des Lesens hoch eingestellt. Also nur Geräte verwenden, die die kleine Pause verkraften
* im Zustand. Es ist für das menschliche Auge mit einer LED nicht sichtbar.
*
* buttonRead() kann auch für Pins verwendet werden, die nur eingegeben werden.
*
* In diesem Beispiel wird Pin 0 des PCF8574 (Adresse 0x20) verwendet um a). zu blinken,
* kann aber gleichzeitig verwendet werden, um die Onboard-LED umzuschalten.
*
* HINWEIS: Die Taste beeinflusst die LED am selben Pin. Die LED leuchtet auf
* unabhängig vom eingestellten Ausgangszustand, wenn Sie die Taste drücken.
* Weil Minus über die Taste und weiter über die LED nach Plus.
*/
#include <PCF8574.h>
#include <Wire.h>
PCF8574 pcf20(0x20);
const byte onboardLed = 13;
const byte PcfButtonLedPin = 0;
unsigned int blinkMillis;
unsigned int buttonMillis;
void setup() {
Serial.begin(115200);
pcf20.begin();
pinMode(onboardLed, OUTPUT);
}
void loop() {
static bool state;
unsigned int currentMillis = millis();
// Beschränken Sie das Lesen der Taste auf 20 Mal pro Sekunde
// Schnell genug für die meisten Tasten
// aber auf diese Weise haben Sie keinen Dimmer-Ausgang, da er während des Lesens der Schaltfläche ausgeblendet wird
// Ein Lesen dauert 460us t 16Mhz Arduino und normale I2C-Geschwindigkeit.
if(currentMillis - buttonMillis >= 50){
buttonMillis = currentMillis;
if(state != pcf20.readButton(PcfButtonLedPin)){
if(state){
//toggle der LED
digitalWrite(onboardLed, !digitalRead(onboardLed));
}
state = !state;
}
}
//Lässt die gleiche Ausgabe blinken
if(currentMillis - blinkMillis >= 500){
//Update time
blinkMillis = currentMillis;
pcf20.toggle(PcfButtonLedPin);
Serial.println(pcf20.read8(), BIN);
}
}
Es funktioniert bereits, aber ich weiß noch nicht in allen Punkten wie und warum es funtioniert. Muss ich noch ein bischen testen.
Franz
