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.
Gast
#4972524
mit while und coninue?
Muss ich continue noch was mitgeben ? Sonst bekomme ich den fehler : continue statement not within a loop Fortsetzung der Anweisung nicht innerhalb einer Schleife
Gast
#4972529
DAVID -. schrieb: > Muss ich continue noch was mitgeben ? zeige doch mal etwas code, niemand sieht was du machst.
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
#4972537
DAVID -. schrieb: > Ok klar vermutlich kann du einfach return machen. Dann wird das Loop ja wieder aufgerufen.
Hatte ich beim ersten versuch schon ok, ich versuche es noch mal.
Gast
#4972548
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);
}
Ne weil wenn ich bei voltage <= 2.23) angekommen bin die andern: voltage <= 2.28) voltage <= 2.35) .... Auch mit auslösen.
Gast
#4972559
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 von einem Moderator gelöscht.
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 ?
Gast
#4972582
Tip: Schau mal nach wie eine if, else if und else Bedingung funktioniert. ist eine if Bedingung wahr dann werden die restlichen nicht verarbeitet.
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
oh man stimmt nicht richtig auf gepasst! vielen dank !
Gast
#4972628
Und warum nicht so ??:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
Wie wäre es denn mit
1 | |
?
Gast
#4972643
Chris F. schrieb: > Wie wäre es denn mitswitch? mit float und Bereich?
Gast
#4972654
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
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.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
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.