Toilettenampel mit Tasterhaltung

Dazu müsste ich erst mal wissen wie. Mir fehlt dazu noch das Wissen. Habe mir dazu aber noch ein Buch bestellt und auf YouTube findet man auch gutes Material, wenn man danach richtig sucht.

Dazu müsste ich erst mal wissen wie das mit Switch case geht.
Reine Pneumatik Steuerungen mache ich blind. Die habe ich von der Pike auf gelernt, aber hier tu ich mir noch etwas schwer.

Hallo
zerschnippel dein Projekt nach dem EVA-Prinzip in Teilprojekte.
Diese sind einfach zu testen und können danach zum Gesamtprojekt zusammengelötet werden. :slight_smile:
E = Eingabe -> Schalter auswerten
V = Verabeiten -> Starten und Stoppen von Timern
A = Ausgabe -> die Leds ansteuern.
Für alle die benötigten Funktionen gibt es im IDE Beispiele, die man für das Projekt anpassen kann.
Leider wird in den Beispielen keine OOP vermittelt, die sich für dein Projekt anbietet.

Ach schau:
Der Code aus #4 genommen und den loop()-Teil mit dem ersetzt aus #6.

Das ist Dein gesamtes Ding eigentlich fertig.
Ggfls. noch die Zeiten anpassen und staunen :wink:

Ich habs mal komplett gemacht und kommentiert.

const byte    PinLed  [] = { 5, 7, 9 };
const byte    PinBut     =  11;
enum { Off, On };
enum { ST_IDLE, ST_YELLOW, ST_RED, ST_REDwait, ST_REDYellow };  // Das ist eine Aufzaehlung der Stati
byte  state = ST_IDLE;                                          // Erster Status mit Programmstart

const unsigned long PeriodYellow = 1000;                        // Zeit in ms
unsigned long yellowPlus = 0;                                   // Variable zur Berechnung der Verlaengerung der Gelbphase
unsigned long msecLst;                                          // Merker für letzte Zeit
unsigned long msec;                                             // Merker für aktuelle Zeit

// -----------------------------------------------------------------------------
void setLeds ( const bool green,          // Funktion zur Ausgabe der Zustände
               const bool yellow, 
               const bool red )
{
  digitalWrite (PinLed [0], green);
  digitalWrite (PinLed [1], yellow);
  digitalWrite (PinLed [2], red);
}

// -----------------------------------------------------------------------------
void loop ()
{
  msec = millis ();                         // merkt sich die aktuelle Zeit
  switch (state)                            // verzweige je nach Zustand
  {
    case ST_YELLOW:                         // Wenn Status gelb
      setLeds (Off, On, Off);               // stelle die Ampel
      if ((msec - msecLst) > PeriodYellow)  // wenn Gelbzeit abgelaufen
        state = ST_RED;                     // wechsle zu rot
      break;
    case ST_RED:                            // wenn Status rot
      setLeds (Off, Off, On);               // stelle Ampel
      msecLst = msec;                       // merke die aktuelle Zeit
      state = ST_REDwait;                   // wechsel Status zu rot_warten
      break;
    case ST_REDwait:                        // wenn Status rot_warten
      if (digitalRead (PinBut))             // wenn Schloss geöffnet
      {
        yellowPlus = (msec - msecLst);      // ermittle die Zeit, die das Schloß zu war
        if (yellowPlus < 60000) yellowPlus = 1000;  // und setze passend dazu die Verlängerungszeit
        if (yellowPlus > 119900) yellowPlus = 119900;
        msecLst = msec;                     // merke die Zeit
        state = ST_REDYellow;               // wechsel Status zu rot_gelb
      }
      break;
    case ST_REDYellow:                      // wenn Status rot_gelb
      setLeds (Off, On, On);                // stelle die Ampel
      if ((msec - msecLst) > (PeriodYellow + yellowPlus)) // Wenn Zeit abgelaufen
      {
        state = ST_IDLE;                    // wechsel Status zu gruen
      }
      break;
    case ST_IDLE:                           // Wenn Status gruen
    default:                                // oder Status unbekannt
      setLeds (On, Off, Off);               // stelle Ampel
      if (!digitalRead (PinBut))            // Wenn Schloss zu
      {
        state = ST_YELLOW;                  // wechsel zu Status gelb
        msecLst = msec;                     // merke die Zeit
      }
      break;
  }
}
void setup()
{
  Serial.begin (9600);
  for (unsigned n = 0; n < sizeof(PinLed); n++) // Setze alle Pins
  {
    digitalWrite (PinLed [n], Off);             // aus
    pinMode      (PinLed [n], OUTPUT);          // auf Output
  }
  pinMode (PinBut, INPUT_PULLUP);
}

Vergleiche BlinkWithoutDelay mit Blink und ergänze beide um einen Taster.
Dann versuche, dass das Blinken sofort aufhört, wenn du den Taster loslässt.
Das geht nur in der "WithoutDelay" Variante.
Auch mehrere LEDs unabhängig blinken lassen ist dann ein Klacks.
Daher vergisst du die delay Variante komplett oder nimmst höchstens ein delay(5);, um den Taster zu Entprellen.
Dann kombinierst du Taster mit Zeitmessung (wie lange war Taster gedrückt / offen) und verwendest das Ergebnis für die LED-Ansteuerung.

Die passende Kombination aus Büchern und Beispielen ist individuell unterschiedlich.

Danke für die Info, aber eine Ampel hat hunderte kleiner Leuchtdioden, die zusammen gelötet sind. Redirect Notice
Bei meiner sind es noch viel mehr Dioden, das ist nur ein Knäul an LED`S. Die ist aber bestimmt auch 15Jahre alt oder so.

Dafür gibt es die Arduino Reference:

https://www.arduino.cc/reference/en/language/structure/control-structure/switchcase/

Das dürfte recht hell werden, diskret ginge anders :joy:

Möglicherweise ist also Dimmen angesagt.

Guten Morgen,
ich bin wieder hier, konnte dir gestern leider nicht mehr schreiben, ich kann max. 10 Nachrichten am Tag hinterlassen, was ein Schwachsinn ist.
Das Programm läuft leider nicht. Kann ich dich Persönlich anschreiben, habe auch noch paar fragen.

Das sind Uralte LED`S so hell sind die nicht und ob die überhaupt dimmbar sind weiß ich nicht. So sieht das in etwas aus.https://media04.lokalkompass.de/article/2013/04/25/7/3880047_XXL.jpg nur das hier nochmal eine Streuscheibe drauf ist.

Der Code tut - was geht denn nicht?
Der Code startet definitiv mit green.
Wenn der Kontakt an Pin 11 geschlossen wird, schaltet er auch um.

Negativ, läuft leider überhaupt nicht.

@kupper
Persönicher Kontakt über PM oder ähnlichen ist hier nicht gern gesehen weil:

  • Mehrere Köpfe bessere Antworten / Lösungen geben bzw besser erlähren können
  • Das Forum auch für andere da sein soll, die das gleiche Problem / Projekt haben /machen und die Hilfe bzw Antworten bzw Lösungen auch für sie zugänglich sein sollen.

Die 10 Posts am Tag für neue User (unter einer gewissen anzahl von Posts ist dazu da Spammer das leben etwas schwerer zu machen. Dadurch können Spammer nicht flächendeckend ihren Spam überallhin plazieren und die Moderatoren haben weniger Arbeit den Spamm zu löschen. Darum etwas Gedult, es ist nicht gegen Dich gerichtet sondern eine Regelung für uns alle.

Neme mal an das Kompilieren und Hochladen funktioniert.
Bitte eine konkretere Fehlerbeschreibung. Leuchtet nichts, wird auf den Taster nicht reagiert, sind die Farben falsch, sind die Zeiten Falsch, passiert was unerwartetes,

Grüße Uwe

Hallo,
na dann bau Dir mal ein paar Serial.print rein damit Du siehst wo es klemmt.
Heinz

Ein wenig genauer musst Du schon werden.
Bei mir tut er mit rudimentärer Ausgabe auf dem Seriellen Monitor.

Da ich absoluter Leihe bin, wollte ich mal das Programm in das kleinste Detail zerpflückt haben, sodass ich alles verstehe und ich wollte nicht das das jeder mitbekommen. Aber ok, wenn es so gewünscht ist halte ich mich natürlich auch daran.
Das mit den 10 Post ist zwar nervig, weil ich bestimmt 1000 Fragen habe. Aber ok, um Spam zu minimieren ok, ich weiß ja wie nervig der ist.

Alles Top, danke dafür schonmal.

Es leuchtet nur die Rote LED sonst tut sich nichts. Der Aufbau geht, ich hatte diesen schon in anderen Projekten.

Em? Helfe mit bitte mal, wie das geht, bzw. was ich machen muss.

Über die serielle Schnittstelle kann man Text im Terminal der IDE (Ikone rechts oben) anzeigen lassen. Dadurch kann der Sketch Lebenszeichen von sich geben.

Beispiel:

Hast Du am Taster den Internen Pullup aktiviert oder einen externen Pullup/Pulldown-Widerstand verwendet?

https://elektro.turanis.de/html/prj035/index.html

Grüße Uwe

Dann hast Du genau zwei Fehler!
Gruen und rot vertauscht
den Schalter nicht nachGND sondern nach 5v gelegt.

Hallo,

na ja z.B

void setLeds ( const bool green,          // Funktion zur Ausgabe der Zustände
               const bool yellow, 
               const bool red )
{
  Serial.print (green);Serial.print(yellow);Serial.println(red);
   delay(100); // damit das Ding nicht überläuft

  digitalWrite (PinLed [0], green);
  digitalWrite (PinLed [1], yellow);
  digitalWrite (PinLed [2], red);
}

sollte Dir auf dem Monitor was ausgeben .

innerhalb der select kannst du sowas noch einbauen

default:                                // oder Status unbekannt
      setLeds (On, Off, Off);  
      Serial.print("Status gruen"); 

im Setup noch ein

Serial.begin(9600);

einbauen damit das überhaupt geht
Heinz

@my_xy_projekt , sorry ich wollte Dich nicht kapern :wink: