Hallo, als Neuling in der ARDUINO-Programmierung versuche ich mich an einem kleinen Projekt -und scheitere trotz zeitraubender Forum-Studie. Ich bitte um fachkundige Hilfe ... Habe das ganze Programm bis auf eine LED zu schalten abgespeckt - esgeht um den Grundsatz. Die Erklärung steht im Programm /* TEST ... für wenn diese SchalterKombination, dann LED A wenn diese SchalterKombination, dann LED B ansonsten LED C Der Aufbau: * LED`s mit Pin`s und GND verbinden * Die Taste an Pin 24 und +5V 10K Widerstand an Pin 24 und GND Die Mehrfachverzweigung wird mit einer mehr oder weniger komplizierten Schachtelung von if-Anweisungen realisiert. So lautete eine Toturial-Beschreibung.... ..... if(Bedingung 1){ //Anweisungsteil für die Option 1 } else { if (Bedingung 2){ //Anweisungsteil für die Option 2 } else { if (Bedingung 3){ //Anweisungsteil für Option 3 } else { //Anweisungsteil für die Option 4 } } } .... */ const int ledA = 40; // LED/gn = Pin 40 const int ledB = 41; // LED/bl = Pin 41 const int ledC = 42; // LED/rt = Pin 42 const int Taste = 24; // Taste = Pin 24 const int Zeit1 = 32; // Dipp-Schalter 1 Minute = Pin 32 const int Zeit2 = 33; // Dipp-Schalter 2 Minute = Pin 33 const int Zeit4 = 34; // Dipp-Schalter 4 Minute = Pin 34 // Durch die Kombinationen der Schalter lassen sich Zeiten von 1-8 Minuten realisieren // 8 Minuten = wenn alle Schalter LOW int buttonState = 0; // variable for reading the pushbutton status void setup() { pinMode(ledA, OUTPUT); pinMode(ledB, OUTPUT); pinMode(ledC, OUTPUT); pinMode(Taste, INPUT); pinMode(Zeit1, INPUT); pinMode(Zeit2, INPUT); pinMode(Zeit4, INPUT); } void loop() { if (digitalRead(Zeit1 == HIGH) && (Zeit2 == LOW) && (Zeit4 == LOW)); { // Taster-Bedingung für 1 Minute buttonState = digitalRead(Taste); // read the state of the pushbutton value: if (buttonState == HIGH) { // Prüfung, ob StartTaster gedrückt wurde digitalWrite(ledA, HIGH); // grüne LED wird eingeschaltet delay(1500); // 1,5s warten digitalWrite(ledA, LOW); // grüne LED wird ausgeschaltet delay(300); } else { // wenn Taste NICHT betätigt wurde, werden alle Ausgänge auf LOW geschaltet digitalWrite(ledA, LOW); } else { // wenn vorherige Bedingungen nicht erfüllt wurden, dann ... if (digitalRead(Zeit1 == LOW) && (Zeit2 == HIGH) && (Zeit4 == LOW)) { // Taster-Bedingung für 2 Minute buttonState = digitalRead(Taste); // read the state of the pushbutton value: if (buttonState == HIGH) { // Prüfung, ob StartTaster gedrückt wurde digitalWrite(ledB, HIGH); // blaue LED wird eingeschaltet delay(1500); // wartet 1,5 s digitalWrite(ledB, LOW); // blaue LED wird ausgeschaltet delay(300); } else { // wenn Taste NICHT betätigt wurde, werden alle Ausgänge auf LOW geschaltet digitalWrite(ledB, LOW); } } else { // wenn vorherige Bedingungen nicht erfüllt wurden, dann ... if (buttonState == HIGH) { // Prüfung, ob StartTaster gedrückt wurde digitalWrite(ledC, HIGH); // rote LED wird eingeschaltet delay(1500); // 1,5s vor Ablauf warten digitalWrite(ledC, LOW); // rote LED wird ausgeschaltet delay(300); } else { // wenn Taste NICHT betätigt wurde, werden alle Ausgänge auf LOW geschaltet digitalWrite(ledC, LOW); } // Ende für Zeile 88 } } } } // Ende für Zeile 34 (void setupü) Beim Kompillieren erhalte ich trotz diverser Versuche immer bei der zweiten bzw. dritten else-Verzweigung den Fehler: error: 'else' without a previous 'if' Wer kann mir und meinem kleinen Scetch helfen ? Möglich wäre dies ja auch mit switch - case. Hier scheitere ich aber an der Definition der Variablen ...
:
Verschoben durch Moderator
Diese komplizierte Schachtelung muss nicht sein. Du kannst das nächste if direkt nach einem else schreiben und musst nicht immer gleich explizit einen neuen Block aufmachen.
1 | if(var1) { |
2 | |
3 | } |
4 | else if(var2) { |
5 | |
6 | } |
Der Fehler ist übrigens das Semikolon beim ersten if, zumindest ist es einer davon, falls mehrere vorhanden sind.
:
Bearbeitet durch User
@ Kai L. (Firma: privat) (elocki) >als Neuling in der ARDUINO-Programmierung versuche ich mich an einem >kleinen Projekt -und scheitere trotz zeitraubender Forum-Studie. >Ich bitte um fachkundige Hilfe ... Was hat das mit dem Titel deines Beitrags zu tun? >Habe das ganze Programm bis auf eine LED zu schalten abgespeckt - esgeht >um den Grundsatz. Lies ein C-Buch! >Die Erklärung steht im Programm Die Erklärung steht im Buch!
Kai L. schrieb: > if (digitalRead(Zeit1 == HIGH) && (Zeit2 == LOW) && (Zeit4 == LOW)); { sorry, aber diese Zeile zeigt dass Du ganz von vorne anfangen solltest (wir haben alle mal klein angefangen)
Löse das Ganze über eine Subroutine. Dann kannst Du Dir den ganzen "else" Krempel sparen, sobald eine Bedingung erfüllt ist, einfach mit return aus der Subroutine raus. Sieht in etwa so aus:
1 | //Hauptprogramm:
|
2 | void main() |
3 | {
|
4 | DatDingWatTut(); |
5 | }
|
6 | |
7 | void DatDingWatTut(); |
8 | {
|
9 | if (bedingung1) |
10 | {
|
11 | //hier was passieren soll.
|
12 | return; //hier bricht es ab wenn Bedingung1 erfüllt ist. |
13 | }
|
14 | if (bedingung2) //else können wir uns sparen, wenn bedingung1 erfüllt war kommen wir hier gar nicth her. |
15 | {
|
16 | //hier was passieren soll.
|
17 | return; |
18 | }
|
19 | //restlicher code
|
20 | |
21 | //Hier noch was passieren soll wenn gar nix davon zutrifft
|
22 | return; |
23 | }
|
Mein Tip. Blockierend zu Arbeiten bedeutet schwieriges Debuggen. Arbeite generell nicht blockerend. Schmeiss die delays raus, arbeite mit einer Zustandmaschine und einem Timer interrupt. Dann weiss man immer wo das Programm steht. Kann sich den Zustand ausgeben lassen, und weiss wann das naechste Ereigniss eintreten muss.
Jetzt Nicht schrieb: > Mein Tip. Blockierend zu Arbeiten bedeutet schwieriges Debuggen. Arbeite > generell nicht blockerend. Schmeiss die delays raus, arbeite mit einer > Zustandmaschine und einem Timer interrupt. Dann weiss man immer wo das > Programm steht. Kann sich den Zustand ausgeben lassen, und weiss wann > das naechste Ereigniss eintreten muss. Von der Idee her prima, nur glaub ich wird das der Threadersteller nicht umsetzen können. Herr im Himmel, Freunde, wenn Ihr sowas vorschlagt bei einem der sehr offensichtlcih grad mal eben irgendwie Code zusammenkleistern kann müßt Ihr mehr liefern als ein paar Schlagworte. Weil wenn er mit dem Begriff einer State Machine was anfangen könnt hätt er's wahrscheinlich eh so realisiert.
Von der Moeglichkeit, debuggen zu Verinfachen einmal gehoert zu haben ist ja schon mal etwas. Vielleicht kommt der Poster ja auch einmal, in vielen Jahren, an einer Zustandsmaschine (State Machine) vorbei und erinnert sich dann... ... das waer dann die mit Null Zylindern und ohne Schlaeuche. vielleicht wagt der Poster sich auch irgendwann das Suchwort bei Gurgel einzugeben.
:
Bearbeitet durch User
Vielen Dank für die schnellen Antworten ... An Heinz ein besonderes DANKE, da er die Sache nicht noch verkompliziert, sondern sogar einen machbaren Lösungsansatz gegeben hat. Ich werde dann malkurzfristig eine Rückmeldung dazu geben. Macht alle weiter so im Forum.
Kai L. schrieb: > if(Bedingung 1){ > //Anweisungsteil für die Option 1 > } > else { > if (Bedingung 2){ > //Anweisungsteil für die Option 2 > } > else { > if (Bedingung 3){ > //Anweisungsteil für Option 3 > } > else { > //Anweisungsteil für die Option 4 > } > } > } War das nicht deine aufgabe? Es würde dir helfen den code symmetrischer zu gestalten, in etwa so
1 | if (bedingung1) |
2 | {
|
3 | if (bedingung2) |
4 | {
|
5 | |
6 | ...
|
7 | |
8 | }
|
9 | else
|
10 | {
|
11 | |
12 | ...
|
13 | |
14 | |
15 | }
|
16 | }
|
Jetzt sieht man genau wo eine block anfängt und wo er endet... beste grüsse public
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.