im Arduinoprogramm springen

#4025314
Lesenswert?

....
> Vermutlich um in und aus eine/r Schleife zu springen.
....
> Um aus einer Schleife zu springen verwendet man break

Alles richtig und sehr wahrscheinlich doch falsch.

Bitte haltet immer im Hinterkopf, dass derartige Fragesteller Anfänger 
sind. Die Fragen schon mal danach, wo sie in Moskau links abbiegen 
müssen und ob sie ein Visum brauchen, wenn sie von Nürnberg nach 
Frankfurt fahren.

Soll heissen: orientiert euch nicht nach dem was er gefragt hat, sondern 
an dem was er in seiner 'üblicherweise' mickrigen Projektbeschreibung 
von sich gibt. Denn das wonach er konkret gefragt hat, ist eher selten 
der Weg, wie man solche Dinge löst.

Arduinotypisch funktioniert der Umgang mit 'Timer' Bausteinen (das sind 
nicht die Hardware Timer) so, dass man die millis() Funktion zu Hilfe 
nimmt. Konzeptionell ist es eine Uhr und mittels Zeitvergleich stellt 
man fest, wie lang die Zeitspanne war, seit man das letzte mal eine 
Aktion gemacht hat. Ist die Zeitspanne lang genug bzw. überschritten, 
dann wird die entsprechende Aktion durchgeführt.
1
unsigned long lastDone;
2

3
void loop()
4
{
5
  unsigned long now;
6

7
  now = millis();
8
  if( ( now - lastDone ) > Zeitspanne ) {
9
    lastDone = now;
10

11
    .... mache, was es jede Zeitspanne zu tun gibt
12
  }
13
}

um diese Zeitspanne erneut laufen bzw. erneut bei 0 beginnen zu lassen, 
genügt es lastDone auf den Wert von now zu setzen (auf den aktuellen 
Wert von millis()).

Zum Beispiel so, dass dieses Zurücksetzen solange macht, solange ein 
Taster gedrückt ist. Erst mit dem loslassen des Tasters unterbleibt das 
Zurücksetzen und die (beispielweise) 10 Sekunden beginnen zu laufen nach 
deren Ablauf dann irgendwas passiert.
1
unsigned long lastDone;
2

3
void loop()
4
{
5
  unsigned long now;
6

7
  now = millis();
8
  if( ( now - lastDone ) > 10000 ) {
9
    lastDone = now;
10

11
    .... mache, was es alle 10 Sekunden zu tun gibt
12
  }
13

14
  if( digitalRead( Taster ) == LOW )
15
    lastDone = now;    // sorge dafür, dass die 10 Sekunden erst ab jetzt zu
16
                       // laufen beginnen.
17
  }
18
}

Oder auch, wenn es sich um eine Einmalaktion handelt, mit beispielweise 
einem Flag, ob eine Aktion erfolgen soll
1
unsigned long lastDone;
2
unigned char doAction = false;
3

4
void loop()
5
{
6
  unsigned long now;
7

8
  now = millis();
9
  if( doAction && ( now - lastDone ) > 10000 ) {
10
    doAction = false;
11
    lastDone = now;
12

13
    .... mache, was es 10 Sekunden nach loslassen der Taste zu tun gibt
14
  }
15

16
  if( digitalRead( Taster ) == LOW ) {
17
    doAction = true;
18
    lastDone = now;    // sorge dafür, dass die 10 Sekunden erst ab jetzt zu
19
                       // laufen beginnen.
20
  }
21
}


Schleife gibt es da in dem von ihm zu schreibenden Code genau gar keine. 
Daher ist auch ein break irrelevant.
Oder um beim Beispiel zu bleiben: Eine gute Beratung geht darauf ein, 
dass man nicht von Nürnberg nach Frankfurt über Moskau fährt und sich 
daher die Frage nach dem Visum gar nicht stellt. Eine gute Beratung 
deckt auf, dass der übliche Weg darin besteht, die A3 zu nehmen und gut 
ists. Eine gute Beratung berücksichtigt, dass der Fragesteller komplett 
auf dem Holzweg ist und lenkt ihn erst mal in die richtige Richtung.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren