Hallo,
habe ein Beispiel aus dem Forum etwas abgewandelt:
unsigned long SecondsRunning() //https://forum.arduino.cc/index.php?topic=224649.0
{ static unsigned long secondsCounted=0;
static unsigned long prevMillis=0;
while( millis() - prevMillis >= 1000){
secondsCounted++;
prevMillis += 1000;
}
return secondsCounted;
}
void setup() {
Serial.begin(9600);
}
unsigned long lastSeconds, thisSeconds;
void loop() {
for (int n=1; n < 11; n++){
thisSeconds=SecondsRunning();
if (thisSeconds == lastSeconds +1)
{
lastSeconds+=1;
Serial.println(n);
}
}
}
Ziel ist, die Sekunden zyklisch von 1 bis 10 auf dem Monitor auszugeben. Nach 10 solls wieder mit 1 weitergehen.
Warum geht das nicht so? Auf dem Monitor werden "zufällige" Zahlen angezeigt, etwa so:
4
9
4
4
9
8
3
1
6
4
9
4
3
8
6
1
10
Irgendwo muss ein Knoten im Gehirn sein, aber wo?
Deine for-Schleife ist das Problem. Die Laufvariable 'n' hat absolut nichts mit den vergangenen Sekunden zu tun.
Die for-Schleife läuft immer ohne Verzögerung durch. Hast Du innerhalb deiner 10 Durchläufe zufällig einen Sekundensprung, dann wird der momentane Laufwert von 'n' ausgegeben - das hat aber nichts mit den Sekunden zu tun. Ist die for-Schleife durchgelaufen, geht es mit loop() gleich wieder von vorne los.
Dein 'Knoten' dürfte darin liegen, dass Du meinst, ein Durchlauf der Schleife würde 1 Sek. dauern. Das ist aber nicht der Fall - da ist nichts was den Durchlauf bremst.
ich hab noch nicht genau verstanden was du willst, die Sekunden kannst Du ja nicht anzeigen hast ja keine Uhr.
Was Du kannst : jede Sekunde einen Zähler von 0 an um 1 erhöhen bis er 11 werden will, dann setzt Du ihn aber gleich wieder auf 0 zurück.
Zudem hast du im setup 2 Variablen deffiniert. Diese sind allerdings nur innerhalb des Setup bekannt. Wenn sie global sein sollen, was ich vermute , müssen sie ausserhalb einer Funktion deffiniert werden . Eigendlich macht man das immer ganz am Anfang.
Schau dir die Beispiele aus der IDE an.
while( millis() - prevMillis >= 1000){
}
ist auch denkbar schlecht , das ergibt eine Schleife in der das Programm festhängt, mach ein if daraus .
Danke für Eure freundlichen Hinweise. Post #6 scheint mir am elegantesten, aber da ich mich bei Strukturen auf noch dünnerem Eis als sonst bewege, versuche ich erst Mal den Hinweis aus #5 umzusetzen.
Vielen Dank!
Programmieren habe ich gelernt zur Zeit von Pascal - noch bevor Objektorientierung Einzug hielt. In der Zwischenzeit doch vieles vergessen, erst nach der Rente wieder damit angefangen. Deshalb seht mir bitte einiges nach
r_a_mueller:
Programmieren habe ich gelernt zur Zeit von Pascal - noch bevor Objektorientierung Einzug hielt. In der Zwischenzeit doch vieles vergessen, erst nach der Rente wieder damit angefangen. Deshalb seht mir bitte einiges nach
Dann dürfte einfaches C ohne OO doch überhaupt kein Problem für dich sein.
Ulli
Andererseits:
Mit Arduino stehst du mit beiden Beinen in der OOP.
Das kann man versuchen auszublenden, hilft aber wenig.
Den nutzen tut man es sowieso.
Alleine Serial, EEPROM, Wire und die ganzen anderen Libs...
Nahezu alle in C++.