Forum: Compiler & IDEs Nach einer erfolgreichen if abfrage wieder zurück zum anfrag ( void loop springen?


von DAVID B. (bastler-david)


Lesenswert?

Hallo
Ich habe mir was zusammen gebastelt wo sich aber leider 3 if abfragen 
gegenseitig aufheben.

Ich muss also erreichen das nach der ersten zutreffenden if abfrage es 
von neuen durchlaufen soll also von loop an OHNE Reset.

Mit goto void loop(); gehts nicht.
Wie kann ich es noch lösen ?
VIELEN dank.

von Peter II (Gast)


Lesenswert?

mit while und coninue?

von DAVID B. (bastler-david)


Lesenswert?

Muss ich continue noch was mitgeben ?
Sonst bekomme ich den fehler :

continue statement not within a loop
Fortsetzung der Anweisung nicht innerhalb einer Schleife

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

DAVID -. schrieb:
> Muss ich continue noch was mitgeben ?

zeige doch mal etwas code, niemand sieht was du machst.

von DAVID B. (bastler-david)


Lesenswert?

Ok klar

void loop()
{

  int sensorValue = analogRead(2);
  float voltage = sensorValue * (2.56 / 1023.0);

  if ( voltage <= 2.23)
  {
    digitalWrite(0, LOW);
    ...............
    delay(10000);

  }

  if ( voltage <= 2.28)
  {
    digitalWrite(0, LOW);
    ...............
    delay(10000);

  }

  if ( voltage <= 2.35)
  {
   digitalWrite(0, LOW);
    ...............
    delay(10000);
  }

  if ( voltage <= 2.41)
  {
    digitalWrite(0, LOW);
    ...............
    delay(10000);
  }

   if ( voltage >= 2.41)
  {
    digitalWrite(0, LOW);
    ...............
    delay(10000);
  }
  delay(8000);
}

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

DAVID -. schrieb:
> Ok klar

vermutlich kann du einfach return machen. Dann wird das Loop ja wieder 
aufgerufen.

von DAVID B. (bastler-david)


Lesenswert?

Hatte ich beim ersten versuch schon ok, ich versuche es noch mal.

von Werner P. (Gast)


Lesenswert?

warum nicht so:

void loop()
{

  int sensorValue = analogRead(2);
  float voltage = sensorValue * (2.56 / 1023.0);

  if ( voltage <= 2.23)
  {
    digitalWrite(0, LOW);
    ...............
    delay(10000);

  } else if ( voltage <= 2.28)
  {
    digitalWrite(0, LOW);
    ...............
    delay(10000);

  } else if ( voltage <= 2.35)
  {
   digitalWrite(0, LOW);
    ...............
    delay(10000);
  } else if ( voltage <= 2.41)
  {
    digitalWrite(0, LOW);
    ...............
    delay(10000);
  } else if ( voltage > 2.41)
  {
    digitalWrite(0, LOW);
    ...............
    delay(10000);
  }
  delay(8000);
}

von DAVID B. (bastler-david)


Lesenswert?

Ne weil wenn ich bei  voltage <= 2.23) angekommen bin die andern:
voltage <= 2.28)
voltage <= 2.35)
....
Auch mit auslösen.

von Werner P. (Gast)


Lesenswert?

DAVID -. schrieb:
> Ne weil wenn ich bei  voltage <= 2.23) angekommen bin die andern:
> voltage <= 2.28)
> voltage <= 2.35)
> ....
> Auch mit auslösen.

beziehst Du dich jetzt auf mich?

Beitrag #4972568 wurde vom Autor gelöscht.
von DAVID B. (bastler-david)


Lesenswert?

ja weil wenn eins erfolgreich ist er zu 2 über geht und das natürlich 
auch erfolgreich ist ich muss aber nach dem ersten schon abrechen das es 
nicht zu einer weitern abfrage kommt.
Oder habe ich das nur falsch verstanden ?

: Bearbeitet durch User
von Werner P. (Gast)


Lesenswert?

Tip: Schau mal nach wie eine  if, else if und else Bedingung 
funktioniert.

ist eine if Bedingung wahr dann werden die restlichen nicht verarbeitet.

von Dirk B. (dirkb2)


Lesenswert?

DAVID -. schrieb:
> Oder habe ich das nur falsch verstanden ?

Was meinst du, was das else bedeutet?

Es heißt sonst/andernfalls.
Der Zweig wird nur dann aufgerufen, wenn die if-Bedingung unwahr ist.
Und das gilt dann auch für die if-Abfrage in disem else-Zweig

von DAVID B. (bastler-david)


Lesenswert?

oh man stimmt nicht richtig auf gepasst!
 vielen dank !

von DraconiX (Gast)


Lesenswert?

Und warum nicht so ??:
1
void loop()
2
{
3
4
  int sensorValue = analogRead(2);
5
  float voltage = sensorValue * (2.56 / 1023.0);
6
7
  if ( voltage <= 2.41)
8
  {
9
    digitalWrite(0, LOW);
10
    ...............
11
    delay(10000);
12
  } else if ( voltage > 2.41)
13
  {
14
    digitalWrite(0, LOW);
15
    ...............
16
    delay(10000);
17
  }
18
  delay(8000);
19
}

von Chris F. (chfreund) Benutzerseite


Lesenswert?

Wie wäre es denn mit
1
switch
?

von Peter II (Gast)


Lesenswert?

Chris F. schrieb:
> Wie wäre es denn mitswitch?

mit float und Bereich?

von Kaj (Gast)


Lesenswert?

Peter II schrieb:
> mit float und Bereich?
Wenn man das ganze auf ganze Zahlen abbildet und die GCC-Extensions 
nutzt geht das.
https://gcc.gnu.org/onlinedocs/gcc/Case-Ranges.html

von Chris F. (chfreund) Benutzerseite


Lesenswert?

Sehe ich auch so.

Das else-if Konstrukt ist ja ähnlich der switch, nur man muss die 
Reihenfolge beachten. Also von oben nach unten die Ranges durchgehen und 
immer den nächsten Bereich danach angeben.

Die Switch finde ich einfach leserlicher, ich weiss genau wo ich ankomme 
wenn ich irgendwo darin mit "break;" aussteige und das was der Compiler 
daraus macht ist das gleiche.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

1
void loop()
2
{
3
4
  int sensorValue = analogRead(2);
5
  float voltage = sensorValue * (2.56 / 1023.0);
6
7
  if ( voltage <= 2.41)
8
  {
9
    digitalWrite(0, LOW);
10
    ...............
11
    delay(10000);
12
  } else if ( voltage > 2.41)
13
  {
14
    digitalWrite(0, LOW);
15
    ...............
16
    delay(10000);
17
  }
18
  delay(8000);
19
}

Hier würde else genügen, denn was kann "voltage" an diesem Punkt schon 
anderes sein als größer als 2.41?

Die float-Rechnerei am Anfang ist falsch, statt durch 1023 muss hier 
durch 1024 geteilt werden.

Ewiges ADC-Umrechnungsthema.



Man könnte allerdings die ganze float-Rechnerei auch weglassen und sich 
Gedanken darum machen, was der ADC liefert. Der liefert einen Wert von 0 
bis 1023. Bei einer Referenzspannung von 2.56 und einem Teiler von 1024 
.. ähm, könnte man auch erkennen, daß der ADC in 2.5mV-Schritten 
auflöst, also  400 Schritte pro Volt macht.

Und damit ist "magische Zahl" 2.41 auch als 964 (400 * 2.41) zu 
begreifen.

Das kann der Compiler zur Übersetzungszeit berechnen, das resultierende 
Programm wird dadurch deutlich kleiner und schneller.
1
#define MAGIC_VALUE ((int) (2.41 * 400))
2
3
void loop()
4
{
5
  int sensorValue = analogRead(2);
6
7
  if (sensorValur <= MAGIC_VALUE)
8
  {
9
    digitalWrite(0, LOW);
10
    ...............
11
    delay(10000);
12
  } 
13
  else
14
  {
15
    digitalWrite(0, LOW);
16
    ...............
17
    delay(10000);
18
  }
19
  delay(8000);
20
}

Daß jetzt das "Programm" immer noch in allen Fällen das gleiche macht 
... das kann man sich dann auch noch ansehen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.