Hallo zusammen.
( Dieses Bsp ist nur ein Teilschritte zur späteren Tastenentprellung (mehrerer Tasten über Interrupt) ohne delay(),
daher bitte NUR schrittweise (Konzept)Hinweise, und KEINE fertigen Lösunge, sonst lerne ich das nie... )
1. Primär geht es mir darum, Zeitberechnungen in eine Funktion auszulagern, ohne den loop() mit delay() etc. zu Bremsen!
2. Mehrer parallele Zeitberechnungen möglich.
3. Möglichst nur eine Zeitberechnungs-Funktion für alle Anwendungen, auf die Jeder, zu jeder Zeit zugreifen kann.
Bsp:
loop(){
//kein delay()
//kein while()
...macht irgend etwas
Start: LED1, ein, für 20ms, danach aus für 1000ms
...macht irgend etwas
Start: LED2, ein, für 100ms, danach aus für 100ms
...macht irgend etwas
}
Alle loop()-Schritte sind unabhängig voneinander.
Eine Funktion(), Bsp.Ausg() als "EierLegendeWollMilchSau". Problem ist hierbei, dass ich nur eine "volatile long msStart=0;" zur Verfügung habe.
Mein (falscher) Ansatz, ohne delay();
HTML-Code:
void loop() {
...
Ausg(LED1Pin, 1, 20);
...
Ausg(LED1Pin, 0, 1000);
...
Ausg(LED2Pin, 1, 100);
...
Ausg(LED2Pin, 0, 100);
...
}
void Ausg(int Pin, int OnOff, long Dauer) { // Dauer=0...dauerhaft, ohne Zeitlimit
if(Dauer != 0) {
if(msStart == 0) {
msStart = millis();
}
if(millis() <= msStart + Dauer) {
digitalWrite(Pin, OnOff);
}
else {
digitalWrite(Pin, !OnOff);
msStart = 0;
}
}
else {
digitalWrite(Pin, OnOff);
}
}
PS: Besser kann ich meine Gedanken gerade nicht formulieren. Daher bitte Fragen, wenn euch irgend eine Info fehlt.
- - - Aktualisiert - - -
PS:
Für jeden Ein/Ausgang eine eigene Funktion?
... mit eigenem Zähler?
... und eigener volatile long Variablen?
Sollte das eine gute Lösung sein?
Statt dessen würde ich gerne alles in kleine und kleinste Funktionsblöcke unterteilen.
Lesezeichen