ich habe mal wieder eine typische Anfängerfrage: ich möchte einen digitalen Output Pin erst dann auf High setzen, wenn mehrere digitale Input Pins für eine bestimmte Dauer auf Low sind, also z.B.
Pin 4 und Pin 5 sind beide für mindestens 500ms auf Low -> setze Pin 10 auf High
Wie sieht der Code prinzipiell aus, um die Zeitdauer zu messen in der Pin 4 und Pin 5 auf Low stehen, und erst danach den Pin 10 auf High zu setzen?
Danke euch wieder sehr für Anregungen/Tips die mich hier weiterbringen
/*
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-06
*/
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 bitmap = 0b11111111; // wird später zu einem "wie sind die Pins"
uint8_t mask = 0b11111111; // wird später zu einem "wie sollen die Pins sein"
for (int 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 (mask != bitmap) {
digitalWrite(outputPin, LOW);
status = IDLE;
Serial.println(status);
}
if (millis() - previousMillis > 1000) {
digitalWrite(outputPin, HIGH);
status = AKTIV;
Serial.println(status);
}
break;
case AKTIV :
if (mask != bitmap) {
digitalWrite(outputPin, LOW);
status = IDLE;
Serial.println(status);
}
break;
}
}
void loop() {
test();
}
von der Idee her ist es eine finite state machine mit den Status
IDLE - Pin Bedingung ist nicht erfüllt
WARTEN - die Pin Bedingung ist erfüllt, aber noch nicht genug Zeit ist um
AKTIV Pin Bedingung ist erfüllt, und genug Zeit ist um
ich experimentiere grade erst etwas, hab noch nichts programmiert. Letztendlich ist es ein Programm zur Auslösung von Aktionen durch Abfrage von unterschiedlichen Schalterstellungen mittels des Zustandes zweier Pins:
Pin 4 auf High, oder Pin5 auf High, oder beide Pins auf Low
Da der Schalter immer von "Pin 4 High" über "beide Pins auf Low" zu "Pin 5 High" schaltet, und wieder zurück, will ich die Aktion für den Zustand "beide Pins auf Low" erst dann auslösen wenn dieser Zustand eine gewisse Zeit lang besteht, um abzufangen dass beim Übergang von "Pin 4 High" über "beide Pins auf Low" zu "Pin 5 High" diese ungewollt ausgelöst wird.
Ich rate mal, du hast einen Umschalter (mit Mittelstellung?) mit dem du HIGH entweder auf den einen oder den anderen Pin gibst.
Hast du überhaupt zwei Pulldown Widerstände an die Pins 4 und 5 angeschlossen?
Sonst sind die offenen Pins nicht LOW, sondern UNDEFINIERT.
Nicht umsonst gibt es einige Beispiele, wie man Schalter oder Taster einliest.
Nicht wirklich, da ich die letzten Wochen massiv beruflich eingespannt war, bin ich erst heute dazu gekommen, mich mal wieder etwas darum zu kümmern. Eine Testschaltung steht, funktioniert auch fast so wie sie soll aber diese zeitliche Verzögerung beim auslösen einer Aktion für den beschriebenen speziellen Status Muss ich noch einbauen, leider fehlt mir da das Know-how, was die Programmierung angeht. Das ganze wird aber auch noch eine ziemliche Zeit dauern, bis es wirklich fertig ist, da ich auch absehbar nur sporadisch mal Zeit dafür haben werde. Aber nichts, desto trotz will ich das Ganze nutzen, um zu lernen, Also seht es mir nach, wenn ich auch noch länger ab und zu mal solche Fragen dazu stellen werde solange das Projekt noch nicht abgeschlossen ist. Ich bin ja froh, dass es dieses Forum und hier so viele hilfsbereite Benutzer gibt, das ist echt super!