Nach einer erfolgreichen if abfrage wieder zurück zum anfrag ( void loop springen?

#4972519
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.
#4972536
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);
}
Gast #4972548
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);
}
Beitrag #4972568 wurde von einem Moderator gelöscht.
Gast #4972628
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
}
Persönliche Seite #4972726
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.
Persönliche Seite #4973419
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.

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