/*
https://forum.arduino.cc/t/befehl-erst-ausfuhren-wenn-pin-status-uber-eine-bestimmte-mindestzeit-hinweg-unverandert-ist/1238604
https://wokwi.com/projects/393062541441394689
2024-03-22 by noiasca
to be deleted 2024-07 - code in Thread
*/
constexpr uint8_t inputPin[] {4, 5};
constexpr uint8_t outputPin {13};
enum Status {IDLE, WARTEN, AKTIV} status;
uint32_t previousMillis = 0;
void setup() {
Serial.begin(115200);
for (auto &i : inputPin) pinMode(i, INPUT_PULLUP);
pinMode(outputPin, OUTPUT);
}
void test() {
uint8_t mask = 0b11111111; // wird in der For Schleife zu einem "wie sollen die Pins sein"
uint8_t bitmap = 0b11111111; // wird in der For Schleife zu einem "wie sind die Pins"
for (size_t i = 0; i < sizeof(inputPin); i++) {
mask ^= 1 << i; // bit löschen
if (digitalRead(inputPin[i]) == LOW ) bitmap ^= 1 << i;
}
//Serial.print(mask, BIN); Serial.print(' '); Serial.println(bitmap, BIN);
switch (status) {
case IDLE :
if (mask == bitmap) {
previousMillis = millis();
status = WARTEN;
Serial.println(status);
}
break;
case WARTEN :
if (millis() - previousMillis > 1000) {
digitalWrite(outputPin, HIGH);
status = AKTIV;
Serial.println(status);
}
if (mask != bitmap) {
digitalWrite(outputPin, LOW);
status = IDLE;
Serial.println(status);
}
break;
case AKTIV :
if (mask != bitmap) {
digitalWrite(outputPin, LOW);
status = IDLE;
Serial.println(status);
}
break;
}
}
void loop() {
test();
}