Toiletten-Ampel-Sketch

Hallo zusammen,

ich taste mich gerade das erste Mal an ein Arduino Projekt heran und bin begeistert über die Möglichkeiten. Leider ist es auch mein erster Programmier-Versuch und ich bekomme ständig eine Fehlermeldung. Vielleicht kann mir ja jemand einen Tipp geben, woran es liegen könnte.

Projektbeschreibung:
Ich habe eine alte Verkehrsampel, die ich gerne wieder zum Leben erwecken würde. Ich möchte sie gerne einsetzen um per Lichtsignal vor unserer Gästetoilette den Ansturm zu regeln.

Dazu möchte ich gerne einen Türkontakt-Schalter und einen Bewegungsmelder im Gästebad anbringen.

Die beiden Sensoren sollen abgefragt werden und je nach Input, unterschiedliche Szenarien an der Ampel leuchten. (z.B. Tür zu und Bewegung im Bad = Rot; Türe auf und keine Bewegung = Grün; Türe zu, aber keine Bewegung = Gelb blinkt bis Bewegung oder Türe sich meldet usw)

Hier ist mein Sketch, dass ich mir aus verschiedenen Sketches zusammen gebastelt habe:

int green=5;            // Das Wort „green“ steht jetzt für den Wert 5.
int orange=6;           // Das Wort „orange“ steht jetzt für den Wert 6.
int rot=7;              // Das Wort „rot“ steht jetzt für den Wert 7.
int bewegung=8;         // Das Wort „bewegung“ steht jetzt für den Wert 8.
int bewegungsstatus=0;  // Das Wort „bewegungsstatus“ steht jetzt zunächst für den Wert 0. Später wird unter dieser Variable gespeichert, ob eine Bewegung erkannt wird oder nicht.

int doorstatus=0;       // Das Wort "doorstatus" steht jetzt zunächst für den Wert 0. Später wird unter dieser Variable gespeichert, ob die Türe geschlossen oder offen ist. 

int doorsensor=9;       // Das Wort "doorsensor" steht jetzt für den Wert 9.




void setup()                  // Hier beginnt das Setup.
{
pinMode(green, OUTPUT);       // Der Pin mit dem Piezo (Pin 5) ist jetzt ein Ausgang.
pinMode(orange, OUTPUT);      // Der Pin mit dem Piezo (Pin 6) ist jetzt ein Ausgang.
pinMode(rot, OUTPUT);         // Der Pin mit dem Piezo (Pin 7) ist jetzt ein Ausgang.
pinMode(bewegung, INPUT);     // Der Pin mit dem Bewegungsmelder (Pin 7) ist jetzt ein Eingang.
pinMode(doorsensor, INPUT);   // Der Pin mit dem Türsensor (Pin 9) ist jetzt ein Eingang. 
}

void loop()                               //Der Loop-Teil beginnt
{                                         //Mit dieser Klammer wird der Loop-Teil geöffnet.
bewegungsstatus=digitalRead(bewegung);    //hier wird der Pin7 ausgelesen. Das Ergebnis wird unter der Variablen „bewegungsstatus“ mit dem Wert „HIGH“ für 5Volt oder „LOW“ für 0Volt gespeichert.
doorstatus=digitalRead(doorsensor);       //hier wird der Pin9 ausgelesen. Das Ergebnis wird unter der Variablen „bewegungsstatus“ mit dem Wert „HIGH“ für 5Volt oder „LOW“ für 0Volt gespeichert.


if ((doorstatus==HIGH) && (bewegungsstatus==HIGH))    //wenn Türe zu UND Bewegung erkannt, dann
{
digitalWrite(rot, HIGH);                              // Rot an
digitalWrite(orange, LOW);                            // Orange aus
digitalWrite(green, LOW);                             // Grün aus
} 




else if ((doorstatus==HIGH) && (bewegungsstatus==LOW))    // wenn Türe zu UND keine Bewegung erkannt, dann
{
     for ((doorstatus==HIGH) && (bewegungsstatus==LOW);  // Solange die Türe zu ist und keine Bewegung erkannt wird blinkt Orange
     digitalWrite(rot, LOW);       // Rot aus
     digitalWrite(orange, HIGH);   // Orange an
     digitalWrite(green, LOW);     // Grün aus
     delay(1000);                  // warte 1 Sekunde
     digitalWrite(orange, LOW);    // Orange aus
     delay(1000);                  // warte 1 Sekunde
     )
}

else if ((doorstatus==LOW) && (bewegungsstatus==LOW))    // wenn Türe auf UND keine Bewegung erkannt, dann Grün
{ 
digitalWrite(rot, LOW);        // Rot aus
digitalWrite(orange, LOW);     // Orange aus
digitalWrite(green, HIGH);     // Grün an
}

else ((doorstatus==LOW) && (bewegungsstatus==HIGH))     // wenn Türe auf aber Bewegung erkannt, dann Orange und Grün
{
digitalWrite(rot, LOW);         // Rot aus
digitalWrite(orange, HIGH);     // Orange an
digitalWrite(green, HIGH);      // Grün an
}
}

Niesi:
Hier ist mein Sketch ...

Dazu nur zwei allgemeine Tipps:

Wenn Du den Überblick über Deinen Code behalten und evtl. auch noch in zwei oder mehr Jahren wieder „hineinfinden“ können möchtest, solltest Du den Code deutlich strukturieren (z. B. geeignete Leerzeilen einfügen, einrücken [schnell: Strg-T])
Wenn Du den potenziellen Helfern (Lesern) Deines Codes einen Gefallen tun möchtest, klammerst Du den Sketch in „Code-Tags“
(Code markieren und im Editor </> klicken)

Gruß

Gregor

int green=5; // Das Wort „green" steht jetzt für den Wert 5.

Das kann man zwar so kommentieren, ist aber eigentlich bald trivial.
Viel interessanter ist, was "int green=5;" bedeutet: wohl ein symbolischer Name für eine Pin-Nummer.

Diese Namen haben den Vorteil, dass man sie nur einmal festlegt und woanders verwenden kann.
Dadurch lassen sich auch fehlerhafte und verwirrende Kommentare wie

pinMode(rot, OUTPUT);         // Der Pin mit dem Piezo (Pin 7) ist jetzt ein Ausgang.

pinMode(bewegung, INPUT);     // Der Pin mit dem Bewegungsmelder (Pin 7) ist jetzt ein Eingang.

vermeiden.

Ein Piezo ist übrigens ein Piepser, eine grüne Leuchtdiode ist eher kein Piezo ...

Fehlermeldungen haben einen Text, der mit etwas Erfahrung auch zu lesen ist, und Hinweise gibt.
Hab gutmütigerweise mal deinen Sketch versucht zu kompilieren, und erhalte für Zeilen 38/39

could not convert 'digitalWrite(((uint8_t)rot), 0u)' from 'void' to 'bool'

Das ist zugegebenermassen etwas verwirrend, da der eigentliche Fehler in der Zeile oben drüber ist.

Deine for - Konstruktion ist sehr verwirrend und unvollständig (und wohl ersatzlos zu entfernender Schrott ) und hat daher die Interpretation der nächsten Anweisung völlig in die Irre geleitet...
Dein letztes else   fängt übrigens alle vorher in den if / else if nicht behadelten Fällen ab und hat daher keine runden Klammern

if ( ... ) { ... }        
else if ( ... ) { ... }
else { ... }

Alle newbies werden hier mit "Bitte Code-Tags" angemeckert, du auch :wink:

Und Herzlich willkommen !

Also zunächst einmal vielen Dank für die schnellen Antworten.

Ich habe meinen ursprünglichen Post jetzt nochmal verändert und den Code in Code Tags gepackt. mea culpa

Auch den Fehler in den Kommentaren (Piezo) habe ich bei der Gelegenheit entfernt. Das kam daher, weil ich mir die Codes aus verschiedenen Quellen zusammen gebastelt habe... und da war es wohl noch ein Piezo :-/

Aber nochmal zu meiner for Schleife in der else if Bedingung:
Damit möchte ich eigentlich erreichen, dass die gelbe Lampe blinkt solange der Status des Türsensors und des Bewegungsmelders auf "Türe zu" und "keine Bewegung" steht. Lässt sich das denn irgendwie eleganter lösen?

else if ((doorstatus==HIGH) && (bewegungsstatus==LOW))    // wenn Türe zu UND keine Bewegung erkannt, dann
{
     for ((doorstatus==HIGH) && (bewegungsstatus==LOW);  // Solange die Türe zu ist und keine Bewegung erkannt wird blinkt Orange
     digitalWrite(rot, LOW);       // Rot aus
     digitalWrite(orange, HIGH);   // Orange an
     digitalWrite(green, LOW);     // Grün aus
     delay(1000);                  // warte 1 Sekunde
     digitalWrite(orange, LOW);    // Orange aus
     delay(1000);                  // warte 1 Sekunde
     )
}

Und aus dem letzten Tipp von michael_x werde ich leider nicht schlau. Soll das bedeuten, dass an der Stelle keine else Bedingung hin muss, sondern eine weitere else if?

Vielen Dank schon einmal im Voraus.

Deine Forschleife ist krank.
Da blinkt nix.
Wundert mich, dass der Kompiler das überhaupt so frisst!
Schalte doch bitte mal alle Meldungen in den Voreinstellungen ein...

Aber nochmal zu meiner for Schleife in der else if Bedingung:
Damit möchte ich eigentlich erreichen, dass die gelbe Lampe blinkt solange der Status des Türsensors und des Bewegungsmelders auf "Türe zu" und "keine Bewegung" steht. Lässt sich das denn irgendwie eleganter lösen?

Vorschlag:

  1. Man/Du setzt ein Flag "BlinkeGelb"
  2. Ein nebenläufiger Programmteil erledigt das blinken.

Und aus dem letzten Tipp von michael_x werde ich leider nicht schlau. Soll das bedeuten, dass an der Stelle keine else Bedingung hin muss, sondern eine weitere else if?

Ich kümmere mich mal nicht um deine Logik im einzelnen:

if (bedingung1) {
   Anweisung_A;
} else if (bedingung2) {
   Anweisung_B;
} else {
   Anweisung_C;
}

Hier wird entweder Anweisung_A oder Anweisung_B oder Anweisung_C ausgeführt, immer eine der drei.
Den letzten else-Zweig kannst du weglassen, dann wird eben A oder B oder gar nichts gemacht. ( Wenn weder bedingung1 noch bedingung2 zutrifft).

Was ich meinte war, dass nachelsekeine Bedingung kommt, sondern direkt eine Anweisung.

Du wirst die Fehlermeldung

expected ';' before '{' token

bekommen.
Dein Ausdruck((doorstatus==LOW) && (bewegungsstatus==HIGH))
wird als auszuführende Anweisung aufgefasst und müsste also mit einem ; abgeschlossen werden.

Eine Anweisung

  false;

ist sinnlos aber zulässig.

Kann es sein, daß Du "for" und "while" verwechselst?