Toilettenampel mit Tasterhaltung

Wenn es das ist was ich denke. Stehen da keine Fehler oder der gleichen drin!

Genau so mit dem Widerstand ist er angeschlossen. Ausser das dich den dritten GND habe und nicht den zweiten. Wieso braucht man diesen Widerstand überhaupt?

Nicht denken. Machen. Neuer Code.
Einfügen.
Dann Werkzeuge - Serieller Monitor aufrufen
Dann unten rechts im Seriellen Monitor die Zahl auf 115200 stellen.
Code hochladen
Schalter bedienen - Da muss was passieren.
Wenn da nichts passiert gehe zu #42

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 kontrol()
{
  byte x = 200;
  static byte y = 0;
  x = x + digitalRead(5) << 1;
  x = x + digitalRead(7) << 1;
  x = x + digitalRead(9);
  if (y != x)
  {
    y = x;
    Serial.println(y, BIN);
  }
}
void loop ()
{
  kontrol();
  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 (115200);
  Serial.println(F("Start..."));
  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);
}

Meine Ausgabe:

14:42:38.159 -> Start...
14:42:38.159 -> 100000
14:42:38.159 -> 100100
14:42:41.903 -> 100010 // Hier schalter an gemacht
14:42:42.897 -> 100001
14:42:45.914 -> 100011 // hier schalter aus gemacht
14:42:47.902 -> 100100

Falls sich außer mir noch jemand fragt, hab ich mal ein paar Kommentare zugefügt...

1 Like

Hab ich Dir doch einen Link gegeben.
Grüße Uwe

Danke
:slight_smile:

Der Sketch läuft durch ohne das was passiert. Oder was machst du genau?


Alle LED`S gehen und der Schalter auch.

Ach...
Dann wird das nichts. Das beisst sich. Bau mal um:
Der Taster geht mit einem Kontakt an GND. mit dem anderen Kontakt an den PIN 11.
In meinem Sketch ist der interne PULLUP aktiviert - steht im Setup und ich werte den nach GND gedrückten Taster aus.

Jetzt geht es. :partying_face: :+1:
Muss nur noch Grün und Rot tauschen.

VIELEN DANKE DAFÜR. Jetzt will ich noch das Programm verstehen lernen.
Ich habe eigentlich noch so viele Fragen.

Macht das jetzt was das der Ohne Widerstand läuft?

Nein, der Widerstand ist dafür gedacht einen definierten Pegel beim Nichtdrücken zu setzen.
Das habe ich im Code mit dem aktivierten internen PULLUP gemacht.

Was hat der Pegel für einen Sinn?

Gestern habe ich dich total falsch verstanden, du meintest einen Toilettenlüfter. Nein, denn habe ich nicht vorgesehen, könnte man aber noch zufügen. Habe ja ein 4Kanal Relais.
Dann muss ich aber auch noch einen Lüfter verbauen. :see_no_evil: Verdammt, noch mehr Arbeit.
Aber du bringst mich auf eine böse Idee :smiling_imp:, ich habe noch einen MM mit Sprachausgabe, Spracherkennung und Gesichtserkennung. Der könnte sich ja auch beschweren, wenn es ihm stinkt.

LAs den Aufbau so und las folgenden Code laufen:
Taste gedrückt - LED geht an, Taste nichtgedrückt LED geht aus.
Geht niccht?

Jetzt weisst Du warum Du einen definierten Pegel brauchst.

const byte    PinLed = 9 ;
const byte    PinBut   =  11;

void setup()
{
  Serial.begin (115200);
  Serial.println(F("Start..."));
  pinMode (PinLed, OUTPUT);          // auf Output
  pinMode (PinBut, INPUT);
}
void loop ()
{
  if (!digitalRead(PinBut))
  {
    digitalWrite(PinLed, HIGH);
  }
  else
  {
    digitalWrite(PinLed, LOW);
  }
}

Ohne definierten Pegel wirkt Dein offener Eingang wie eine Antenne und kann beliebig LOW oder HIGH werden.

Gruß Tommy

Also den Widerstand wieder einbauen und abändern?

Eigentlich würde doch ein Arduino Nano dafür langen oder geht das dann nicht mehr?

pinMode (PinBut, INPUT_PULLUP);

Wenn du den internen verwendest ist doch alles in Ordnung.

Grüße Uwe

Ich hätte noch eine kleine Herausforderung, nur wenn de willst.
Ich bin ja aus der Industrie, und bei mir/uns muss jede Anlage eine Sicherheitsschaltung haben. Sprich, wenn ich sie wieder Nutze, muss es wieder verschließen und die Zeit neu gemessen bzw. dazu addiert werden.

Und was ist die Frage?

Um aus diesem Satz eine Herausforderung zu machen, sollte @kupper erklären, welche Funktion eine "Sicherheitsschaltung" bei einer Anzeige-LED haben soll. Und wie das "bzw." bei der Zeitmessung zu verstehen ist.
Bei "Wenn ich sie wieder Nutze" ist "sie" die Anlage, d.h. die Toilette bzw. deren Schließkontakt, und "Nutze" ist ein Öffnen oder Schließen des Kontakts, richtig?

Hallo,
durch Gas können bleibende Schäden bei Personen entstehen, insofern ist die richtige Sicherheitskategorie nach EN 954-1 / ISO 13849-1 zu berücksichtigen. Und die Anlage gegen unbeabsichtigte wieder Einschaltung zu schützen. Zweikanalig natürlich . :wink:

Zum Thema Zeit : PNOZ Sicherheitsrelais da wird sowas gemacht. :see_no_evil:

duck un weg
Heinz