/* Lauflichtschaltung * * für die Microcontroller Entwicklungsplatine NODEMCU ESP32 mit der Arduino-IDE * * Die Idee ist von mir, wesentliche Teile der Programmierung sind von Ulrich Wienker * Herbert Nieder im März 2021 */ // Die Nummerierung der Pins in ledPin entspricht der physischen Reihenfolge // auf dem Board, die "0" als Dummy-Nummer steht überall dort, wo in "pattern" ein // Leerzeichen zur optischen Trennung der Ampeln eingefügt ist // Man kann sie weglassen, die Zahl in PIN_COUNT muss entsprechend geändert werden int ledPin[] = { 23, 22, 21, 19, 0, 18, 5, 4, 2, 0, // Seite 1 des Boards 32, 33, 25, 26, 0, 27, 14, 12, 13}; // Seite 2 des Boards #define PIN_COUNT 19 // Zahl der angesteuerten Pins plus Dummypins #define NUM_OF_STATES 4 // vier verschiedene Zustände, gezählt von 0 bis 3 #define IN_PIN 15 // An Pin 15 ist ein Taster angeschlossen int inPinVal = 1; // der mit 1 (= nicht verbunden) initialisiert wird int pressed = 0; // Der Zustand des Tasters beim Start ist "nicht gedrückt" int state = 0; // Nummer der Abfolge beim beim Einschalten struct PATTERN { char single_pattern [PIN_COUNT+1]; long milli_sec; } patterns [] = { { "xxxx xxxx xxxx xxxx", 2000 }, // # 0 Testmuster alle Leds an { "oooo oooo oooo oooo", 2000 }, // # 1 Testmuster alle Leds aus { "xooo xooo xooo oooo", 200 }, // # 2 Abfolge Nummer 0 { "oxoo oxoo oxoo oooo", 200 }, // { "ooxo ooxo ooxo oooo", 200 }, // { "ooox ooox ooox oooo", 200 }, // { "oooo xooo xooo xooo", 200 }, // { "oooo oxoo oxoo oxoo", 200 }, // { "oooo ooxo ooxo ooxo", 200 }, // { "oooo ooox ooox ooox", 200 }, // { "oooo ooxo ooxo ooxo", 200 }, // { "oooo oxoo oxoo oxoo", 200 }, // { "oooo xooo xooo xooo", 200 }, // { "ooox ooox ooox oooo", 200 }, // { "ooxo ooxo ooxo oooo", 200 }, // { "oxoo oxoo oxoo oooo", 200 }, // #15 { "xxoo xxoo xxoo xxoo", 500 }, // #16 Abfolge Nummer 1 { "oxxo oxxo oxxo oxxo", 500 }, // { "ooxx ooxx ooxx ooxx", 500 }, // { "xoox xoox xoox xoox", 500 }, // #19 { "xooo oooo oooo ooox", 200 }, // #20 Abfolge Nummer 2 { "oxoo oooo oooo ooxo", 200 }, // { "ooxo oooo oooo oxoo", 200 }, // { "ooox oooo oooo xooo", 200 }, // { "oooo xooo ooox oooo", 200 }, // { "oooo oxoo ooxo oooo", 200 }, // { "oooo ooxo oxoo oooo", 200 }, // { "oooo ooox xooo oooo", 200 }, // { "oooo ooxo oxoo oooo", 200 }, // { "oooo oxoo ooxo oooo", 200 }, // { "oooo xooo ooox oooo", 200 }, // { "ooox oooo oooo xooo", 200 }, // { "ooxo oooo oooo oxoo", 200 }, // { "oxoo oooo oooo ooxo", 200 }, // #33 { "xxoo oooo oooo ooxx", 200 }, // #34 Abfolge Nummer 3 { "oxxo oooo oooo oxxo", 200 }, // { "ooxx oooo oooo xxoo", 200 }, // { "ooox xooo ooox xooo", 200 }, // { "oooo xxoo ooxx oooo", 200 }, // { "oooo oxxo oxxo oooo", 200 }, // { "oooo ooxx xxoo oooo", 200 }, // { "oooo ooox xooo oooo", 200 }, // { "oooo ooxx xxoo oooo", 200 }, // { "oooo oxxo oxxo oooo", 200 }, // { "oooo xxoo ooxx oooo", 200 }, // { "ooox xooo ooox xooo", 200 }, // { "ooxx oooo oooo xxoo", 200 }, // { "oxxo oooo oooo oxxo", 200 } }; // #47 int begin_pats[NUM_OF_STATES] = { 2, 16, 20, 34 }, end_pats[NUM_OF_STATES] = { 15, 19, 33, 47 }; // Anfänge und Ende der Abläufe void setup () // Festlegung der Pins als Eingang bzw. Ausgang { // Die Arrayelemente sind von 0 bis (pinCount - 1) nummeriert. // Durch die for-Schleife werden alle Led-Pins als Ausgänge festgelegt: for (int thisPin = 0; thisPin < PIN_COUNT; pinMode (ledPin[thisPin++], OUTPUT)); // Pin 15 wird als Eingang festgelegt pinMode (IN_PIN, INPUT); // Die Anzeige der Testmuster kann bei fertigen Schaltungen entfallen // Testmuster 1: Alle an für 2 Sekunden, sind wirklich alle angeschlossen? writePattern (patterns[0].single_pattern); delay (2000); // Testmuster 2: Alle aus für 2 Sekunden, bevor es losgeht writePattern (patterns[1].single_pattern); delay (2000); } void loop () // Hauptprogramm: Musteranzeige { for (int nn = begin_pats[state]; nn <= end_pats[state]; nn++) { writePattern (patterns[nn].single_pattern); // Muster werden geschrieben if (waitAndListen (patterns[nn].milli_sec)) break; // bei Tastendruck wird abgebrochen und } // sofort der nächste Ablauf angefangen } void writePattern (char *pattern) // Umsetzung eines Einzelmusters in Led-Anzeigen { for (int thisPin = 0; thisPin < PIN_COUNT; thisPin++) { if (pattern[thisPin] != ' ') digitalWrite (ledPin[thisPin], pattern[thisPin] == 'x' ? HIGH : LOW); } } int waitAndListen (long time) // Alle 50 Millisekunden wird der Taster abgefragt { long cnt = 0; long offset = 50; // in Millisekunden while (cnt < time) // time: maximaler Verbleib in diesem Unterprogramm in Millisekunden { cnt = cnt + offset; if (digitalRead (IN_PIN) == 0 && !pressed) // Taste gedrückt? { delay (10); // Entprellung: Taste immer noch gedrückt if (digitalRead (IN_PIN) == 0 && !pressed) // innerhalb von 10 Millisekunden? { state++; state %= NUM_OF_STATES; // Ja, gehe zum nächsten Muster pressed = true; return pressed; // gib pressed = true an loop weiter } } if (digitalRead (IN_PIN) == 1 && pressed) // pressed = true und Taste gelöst? { delay (10); if (digitalRead (IN_PIN) == 1 && pressed) // nach 10 Millisekunden immer noch? { pressed = false; // Zustand von pressed ändern } } delay (offset); // wenn nichts passiert ist, warte 50ms } return pressed; // gib Zustand von pressed an loop weiter }