IchOhneNamen:
nun stehe ich vor der Aufgabe einen Arduino innerhalb einer Schleife so zu programmieren das 3 button's je eine LED auslösen (also 3 LED's ), diese sollen unabhängig voneinander funktionieren und dabei je einen timer starten. Der wenn er gestartet wurde jederzeit von der Schleife ausgelesen werden so kann.
Zur Veranschaulichung des Vorgangs habe ich eine Grafik hinzugefügt.
Du hast als erstes mal folgendes Problem: Deine oben beschriebene Programmieraufgabe ("sollen unabhängig voneinander funktionieren", "Timer jederzeit auslesen") passt in keiner Weise zu Deinem PAP ("Warten auf Abschluß des Vorgangs").
Wenn Du für einen Mikrocontroller Vorgänge programmieren möchtest, die "gleichzeitig" und "unabhängig voneinander" ablaufen und "jederzeit auslesbar" Werte liefern sollen, darf es im Programm kein "Busy Waiting" ("Beschäftigtes Warten") auf das Ende eines bestimmten, einzelnen Vorgangs geben.
Sondern der Ablauf ist eine fortlaufend abgearbeitete Befehlskette, in der Begriffe wie "warten auf" nicht vorkommen dürfen. Dein PAP sieht vielmehr eher so aus:
- Start
- Schalter 1 betätigt? ==> Wenn Vorgang nicht aktiv, Starte Vorgang 1 ==> weiter mit 3
- Schalter 2 betätigt? ==> Wenn Vorgang nicht aktiv, Starte Vorgang 2 ==> weiter mit 4
4 Schalter 3 betätigt? ==> Wenn Vorgang nicht aktiv, Starte Vorgang 3 ==> weiter mit 5.
- Wenn Vorgang 1 aktiv ==> Aktion zu Vorgang 1 ==> Wenn Endzeit 1, beenden ==> weiter mit 6.
- Wenn Vorgang 2 aktiv ==> Aktion zu Vorgang 2 ==> Wenn Endzeit 2, beenden ==> weiter mit 7
- Wenn Vorgang 3 aktiv ==> Aktion zu Vorgang 3 ==> Wenn Endzeit 3, beenden ==> weiter mit 8
- Schaltstatus LED 1 setzen
- Schaltstatus LED2 setzen.
- Schaltstatus LED3 setzen.
- Weiter zu Start
Immer ein Schritt nach dem anderen.So dass auf Schritt 5. ("Wenn Vorgang 1 aktiv") in jedem Fall danach Schritt 6 folgt, egal ob die Zwischenschritte aus Schritt 5. ("Aktion zu Vorgang 1", "Wenn Endzeit 1") ausgeführt wurden (weil eine Bedingung erfüllt ist) oder nicht.
Wobei Du den Fall vorliegen hast, dass immer drei gleiche Abläufe vorliegen, so dass Du am besten von der Programmierung her die Vorgänge 2-4, 5-7 und 8-11 jeweils in einer for-Schleife abarbeitest.
Und zu Deiner Aussage "dabei je einen timer starten" noch eine Anmerkung:
Mache Dich von der Vorstellung los, dass Du für drei Vorgänge drei Timer brauchst. Wenn Du um 6:30 Uhr aufstehen möchtest, um 8:00 in der Schule sein musst und um 14:30 Uhr einen Zahnarzttermin hast, brauchst Du dann drei Uhren, um die Zeiten einhalten zu können? Nein. Und so, wie Du nur eine Uhr für drei Termine benötigst, benötigt Dein Mikrocontroller auch nur eine Uhr (dazu gibt es die millis()-Funktion) und drei Termine, in dem Fall die Startterminde der Vorgänge.
unsigned long vorgangStartzeit[3];
boolean vorgangAktiv[3];
Und sobald ein Vorgang gestartet wird, merkst Du Dir nur die Startzeit und dass der Vorgang aktiv wird:
vorgangStartzeit[i]=millis(); // mit i = Index des Vorgangs (0, 1 oder 2)
vorgangAktiv[i]=true;
Und die Timer-Zeit eines Vorgangs ermittelst Du immer als Differenz aus der aktuellen millis() Zeit und der Startzeit. Beispielsweise um zu prüfen, ob 10 Minuten (600 Sekunden, 600000 Millisekunden) abgelaufen sind und der Vorgang beendet werden soll:
for (int i=0;i<3;i++)
{
if (millis()-vorgangStartzeit[i]>600000L) vorgangAktiv[i]=false;
}
Und schwupps hast Du drei Vorgänge darauf überprüft, ob ihre 10 Minuten abgelaufen sind und den Vorgang ggf. auf nicht mehr aktiv gesetzt.