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.
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
:
Bearbeitet durch User
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); }
:
Bearbeitet durch User
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.
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.
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.
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
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 !
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 | }
|
Wie wäre es denn mit
1 | switch
|
?
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 | 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.