Salve e benvenuti a una continuazione della serie elegante illuminazione delle scale. Oggi espandere come il numero massimo di scale che il nostro controller può controllare da soli 16 a Fulminate 992 passi!
Così, anche i proprietari di una scala più lunga dovrebbero essere in grado di regolare facilmente il controllo per i loro scopi in base alle vostre esigenze e desideri.
Questa regolazione viene eseguita facilmente e comodamente regolando le variabili di programma "Overall_Stages" al numero desiderato di scale da 1 a 992.
Bene, uno o l'altro potrebbe chiedersi come raggiungo questo gran numero di uscite PWM a soli 20 uscite disponibili di un Nano V3 a-consegna A. Il segreto sta nei 6 bit di indirizzo del PCA9685. Ogni PCA9685 può fornire 16 canali PWM. Il layout della catena a margherita della scheda previene il caos dei cavi e consente ai fino a 62 controller di collegarsi comodamente.
Rivolgendosi binario alle schede, uno dei 62 indirizzi nell'intervallo da 40h a 7Eh può essere assegnato a un modulo che conta verso l'alto. Ciò si traduce nel massimo possibile 992 uscite con 16 uscite per modulo.
Il codice è stato scritto da me in modo che l'indirizzamento dei moduli è astratto dall'utente e viene calcolato automaticamente. È solo la somma totale delle scale da specificare in una variabile e un numero interessante di moduli da attaccare come catena margherita al bus I2C. Nel caso dei moduli, occorre prestare attenzione a un indirizzamento ascendente dei moduli.
Nell'immagine seguente è possibile vedere come i moduli devono essere collegati e indirizzati:
Per il nostro progetto attuale abbiamo bisogno di:
Numero |
Descrizione |
Nota |
2 |
Sensore di movimento |
|
fino a 62 |
Numero a seconda del numero di scale /16 |
|
1 |
|
|
1 |
Per la configurazione della breadboard |
|
fino a 992 |
Numero a seconda del numero di scale |
|
1 |
Alimentazione per LED/lampade per i gradini |
Massimo 24 volt |
Si prega di notare che il circuito non è stato testato con assemblaggio completo, ma solo con 2 moduli di tipo PCA9685. Un assemblaggio completo con 62 moduli è quindi Teoricamente Descritto. In pratica, devono essere prese in considerazione le lunghezze massime dei bus I2C, la sicurezza dei guasti, la trasmissione del segnale pulito, gli alimentatori di dimensioni sufficientemente grandi, i cavi, i collegamenti sicuri e altro ancora. Tutti i riferimenti a questo dalle parti precedenti si applicano in particolare nella parte odierna.
Ecco il codice aggiornato per la parte di oggi:
Codice di Tobias Kuch 2019 mailto:tobias.kuch@googlemail.com Codice della GPL 3.0 #include <Filo.H> # define PWM_Module_Base_Addr 0x40 (in questo 0x40) 10000000b L'ultimo bit del byte dell'indirizzo definisce l'operazione da eseguire. Se impostato su logico 1 0x41 modulo 2 ecc. Intervallo di indirizzi0x40 - 0x47 seleziona un'operazione di lettura mentre uno 0 logico seleziona un'operazione di scrittura. # define OE_Pin 8 Perno per l'abilitazione dell'uscita # define CPU_LED_Pin 13 # define PIRA_Pin 2 # define PIRB_Pin 3 # define Num_Stages_per_Module 16 # define Delay_Stages 5 # define Delay_ON_to_OFF 2 Delay_ON_to_OFF minimo in secondi Int Overall_Stages = 16; numero massimo di passi: 62 x 16 Int delay_per_Stage_in_ms = 200; Int Pwm_Channel = 0; Int Pwm_Channel_Brightness = 0; Bool Motion_Trigger_Down_to_Up = False; Bool Motion_Trigger_Up_to_Down = False; Bool On_Delay = False; Byte PWMModules = 0; Byte Fasi sinistra = 0; controllo interrupt Byte A60telSeconds24 = 0; Byte Secondi24; Pvr(TIMER1_COMPA_vect) { A60telSeconds24++; Se (A60telSeconds24 > 59) { A60telSeconds24 = 0; Secondi24++; Se (Secondi24 > 150) { Secondi24 = 0; } } } Vuoto ISR_PIR_A() { Bool PinState = digitalRead (Lettura digitale)(PIRA_Pin); Se (PinState) { Se (!(Motion_Trigger_Up_to_Down) E !(Motion_Trigger_Down_to_Up)) { digitalWrite (Scrittura digitale)(CPU_LED_Pin, alto); Motion_Trigger_Down_to_Up = Vero; } PIR A attivato } Altro { digitalWrite (Scrittura digitale)(CPU_LED_Pin, Basso); } } Vuoto ISR_PIR_B() { Bool PinState = digitalRead (Lettura digitale)(PIRB_Pin); Se (PinState) { Se (!(Motion_Trigger_Down_to_Up) E !(Motion_Trigger_Up_to_Down)) { digitalWrite (Scrittura digitale)(CPU_LED_Pin, alto); Motion_Trigger_Up_to_Down = Vero; } PIR B attivato } Altro { digitalWrite (Scrittura digitale)(CPU_LED_Pin, Basso); } } Vuoto Init_PWM_Module(Byte PWM_ModuleAddr) { PinMode (Modalità pin)(OE_Pin, Output); PinMode (Modalità pin)(CPU_LED_Pin, Output); digitalWrite (Scrittura digitale)(OE_Pin, alto); Pin di attivazione dell'uscita LOW attivo (OE). Filo.beginTransmission(PWM_ModuleAddr); Avviare il trasferimento dei dati Filo.Scrivere(0x00 (in questo 0x00)); // Filo.Scrivere(0x06 (in inglese)); Ripristino del software Filo.endTransmission(); Interrompi comunicazione - Invia bit di arresto Ritardo(400); Filo.beginTransmission(PWM_ModuleAddr); Avviare il trasferimento dei dati Filo.Scrivere(0x01 (in tissuta (in ti); Selezionare la modalità 2 Registro (Registro comandi) Filo.Scrivere(0x04 (in tissuta 0x0); Chip di configurazione: 0x04: uscita palo morto 0x00: Uscita di scarico aperta. Filo.endTransmission(); Interrompi comunicazione - Invia bit di arresto Filo.beginTransmission(PWM_ModuleAddr); Avviare il trasferimento dei dati Filo.Scrivere(0x00 (in questo 0x00)); Selezionare Modalità 1 Registro (Registro comandi) Filo.Scrivere(0x10 (in modo 0x10)); Configurare SleepMode Filo.endTransmission(); Interrompi comunicazione - Invia bit di arresto Filo.beginTransmission(PWM_ModuleAddr); Avviare il trasferimento dei dati Filo.Scrivere(0xFE (in modo 0xFE)); Seleziona PRE_SCALE registro Filo.Scrivere(0x03 (in tissuta (in ti); Impostare Prescaler. La frequenza PWM massima è 1526 Hz se il PRE_SCALEer l'operatore è impostato su "0x03h". Standard: 200 Hz Filo.endTransmission(); Interrompi comunicazione - Invia bit di arresto Filo.beginTransmission(PWM_ModuleAddr); Avviare il trasferimento dei dati Filo.Scrivere(0x00 (in questo 0x00)); Selezionare Modalità 1 Registro (Registro comandi) Filo.Scrivere(0xA1 (in modo 0xA1)); Configura chip: ERrlaube Tutti gli indirizzi I2C chiamata, utilizzare l'orologio interno, / Consenti funzione di incremento automatico Filo.endTransmission(); Interrompi comunicazione - Invia bit di arresto } Vuoto Init_PWM_Outputs(Byte PWM_ModuleAddr) { digitalWrite (Scrittura digitale)(OE_Pin, alto); Pin di attivazione dell'uscita LOW attivo (OE). Per ( Int Z = 0; Z < 16 + 1; Z++) { Filo.beginTransmission(PWM_ModuleAddr); Filo.Scrivere(Z * 4 + 6); Seleziona PWM_Channel_ON_L registro Filo.Scrivere(0x00 (in questo 0x00)); Valore per il registro sopra Filo.endTransmission(); Filo.beginTransmission(PWM_ModuleAddr); Filo.Scrivere(Z * 4 + 7); Seleziona PWM_Channel_ON_H registratore di cassa Filo.Scrivere(0x00 (in questo 0x00)); Valore per il registro sopra Filo.endTransmission(); Filo.beginTransmission(PWM_ModuleAddr); Filo.Scrivere(Z * 4 + 8); Seleziona PWM_Channel_OFF_L registrato Filo.Scrivere(0x00 (in questo 0x00)); Valore per il registro sopra Filo.endTransmission(); Filo.beginTransmission(PWM_ModuleAddr); Filo.Scrivere(Z * 4 + 9); Seleziona PWM_Channel_OFF_H registro Filo.Scrivere(0x00 (in questo 0x00)); Valore per il registro sopra Filo.endTransmission(); } digitalWrite (Scrittura digitale)(OE_Pin, Basso); Pin di attivazione dell'uscita LOW attivo (OE). } Vuoto Installazione() { Inializzazione Seriale.Iniziare(115200); PinMode (Modalità pin)(PIRA_Pin, Input); PinMode (Modalità pin)(PIRB_Pin, Input); Seriale.Iniziare(9600); Mentre (!Seriale) { ; attendere la connessione della porta seriale. Necessario per USB nativo } PWMModules = Overall_Stages / 16; Fasi sinistra = Overall_Stages % 16; Se (Fasi sinistra >= 1) { PWMModules++; } Filo.Iniziare(); Initalisia I2C Bus A4 (SDA), A5 (SCL) Per (Byte ModuleCount (Conteggio moduli) = 0; ModuleCount (Conteggio moduli) < PWMModules; ModuleCount (Conteggio moduli)++) { Init_PWM_Module(PWM_Module_Base_Addr + ModuleCount (Conteggio moduli)); Init_PWM_Outputs(PWM_Module_Base_Addr + ModuleCount (Conteggio moduli)); } noInterruzioni(); attachInterrupt (attachInterrupt)(0, ISR_PIR_A, Cambiare); attachInterrupt (attachInterrupt)(1, ISR_PIR_B, Cambiare); TCCR1A = 0x00 (in questo 0x00); TCCR1B = 0x02 (in tissuta 0x0; TCNT1 (in questo stato in stato di = 0; Inizializzare il registro con 0 OCR1A = 33353; Registro di confronto di output pre-documenti TIMSK1 |= (1 << CIE1A); Abilita interruzione confronto timer Interrompe(); } Vuoto Down_to_Up_ON() { Seriale.println("Down_to_Up_ON"); Byte Calc_Num_Stages_per_Module = Num_Stages_per_Module; Per (Byte ModuleCount (Conteggio moduli) = 0; ModuleCount (Conteggio moduli) < PWMModules; ModuleCount (Conteggio moduli)++) { Pwm_Channel = 0; Pwm_Channel_Brightness = 4095; Se ((Fasi sinistra >= 1) E (ModuleCount (Conteggio moduli) == PWMModules - 1)) { Calc_Num_Stages_per_Module = Fasi sinistra; } Altro { Calc_Num_Stages_per_Module = Num_Stages_per_Module; } Pwm_Channel = 0; Pwm_Channel_Brightness = 0; Mentre (Pwm_Channel < Calc_Num_Stages_per_Module + 1) { Filo.beginTransmission( PWM_Module_Base_Addr + ModuleCount (Conteggio moduli)); Filo.Scrivere(Pwm_Channel * 4 + 8); Seleziona PWM_Channel_0_OFF_L registro Filo.Scrivere((Byte)Pwm_Channel_Brightness & 0xff); Valore per il registro sopra Filo.endTransmission(); Filo.beginTransmission( PWM_Module_Base_Addr + ModuleCount (Conteggio moduli)); Filo.Scrivere(Pwm_Channel * 4 + 9); Seleziona PWM_Channel_0_OFF_H registro Filo.Scrivere((Pwm_Channel_Brightness >> 8)); Valore per il registro sopra Filo.endTransmission(); Se (Pwm_Channel_Brightness < 4095) { Pwm_Channel_Brightness = Pwm_Channel_Brightness + Delay_Stages; Se (Pwm_Channel_Brightness > 4095) { Pwm_Channel_Brightness = 4095; } } Altro Se ( Pwm_Channel < Num_Stages_per_Module + 1) { Pwm_Channel_Brightness = 0; Ritardo(delay_per_Stage_in_ms); Pwm_Channel++; } } } } Vuoto Up_to_DOWN_ON() { Seriale.println("Up_to_DOWN_ON"); Byte Calc_Num_Stages_per_Module = Num_Stages_per_Module; Int ModuleCount (Conteggio moduli) = PWMModules - 1; Mentre (ModuleCount (Conteggio moduli) >= 0) { Pwm_Channel_Brightness = 0; Se ((Fasi sinistra >= 1) E (ModuleCount (Conteggio moduli) == PWMModules - 1)) { Calc_Num_Stages_per_Module = Fasi sinistra; } Altro { Calc_Num_Stages_per_Module = Num_Stages_per_Module; } Pwm_Channel = Calc_Num_Stages_per_Module; Mentre (Pwm_Channel > -1) { Filo.beginTransmission( PWM_Module_Base_Addr + ModuleCount (Conteggio moduli)); Filo.Scrivere(Pwm_Channel * 4 + 8); Seleziona PWM_Channel_0_OFF_L registro Filo.Scrivere((Byte)Pwm_Channel_Brightness & 0xff); Valore per il registro sopra Filo.endTransmission(); Filo.beginTransmission(PWM_Module_Base_Addr + ModuleCount (Conteggio moduli)); Filo.Scrivere(Pwm_Channel * 4 + 9); Seleziona PWM_Channel_0_OFF_H registro Filo.Scrivere((Pwm_Channel_Brightness >> 8)); Valore per il registro sopra Filo.endTransmission(); Se (Pwm_Channel_Brightness < 4095) { Pwm_Channel_Brightness = Pwm_Channel_Brightness + Delay_Stages; Se (Pwm_Channel_Brightness > 4095) { Pwm_Channel_Brightness = 4095; } } Altro Se ( Pwm_Channel >= 0) { Pwm_Channel_Brightness = 0; Ritardo(delay_per_Stage_in_ms); Pwm_Channel--; Se ( Pwm_Channel < 0) { Pwm_Channel = 0; Pausa; } } } ModuleCount (Conteggio moduli) = ModuleCount (Conteggio moduli) - 1; } } Vuoto Down_to_Up_OFF() { Seriale.println("Down_to_Up_OFF"); Byte Calc_Num_Stages_per_Module = Num_Stages_per_Module; Per (Byte ModuleCount (Conteggio moduli) = 0; ModuleCount (Conteggio moduli) < PWMModules; ModuleCount (Conteggio moduli)++) { Pwm_Channel = 0; Pwm_Channel_Brightness = 4095; Se ((Fasi sinistra >= 1) E (ModuleCount (Conteggio moduli) == PWMModules - 1)) { Calc_Num_Stages_per_Module = Fasi sinistra; } Altro { Calc_Num_Stages_per_Module = Num_Stages_per_Module; } Mentre (Pwm_Channel < Calc_Num_Stages_per_Module + 1) { Filo.beginTransmission( PWM_Module_Base_Addr + ModuleCount (Conteggio moduli)); Filo.Scrivere(Pwm_Channel * 4 + 8); Seleziona PWM_Channel_0_OFF_L registro Filo.Scrivere((Byte)Pwm_Channel_Brightness & 0xff); Valore per il registro sopra Filo.endTransmission(); Filo.beginTransmission(PWM_Module_Base_Addr + ModuleCount (Conteggio moduli)); Filo.Scrivere(Pwm_Channel * 4 + 9); Seleziona PWM_Channel_0_OFF_H registro Filo.Scrivere((Pwm_Channel_Brightness >> 8)); Valore per il registro sopra Filo.endTransmission(); Se (Pwm_Channel_Brightness > 0) { Pwm_Channel_Brightness = Pwm_Channel_Brightness - Delay_Stages; Se (Pwm_Channel_Brightness < 0) { Pwm_Channel_Brightness = 0; } } Altro Se ( Pwm_Channel < Num_Stages_per_Module + 1) { Pwm_Channel_Brightness = 4095; Ritardo(delay_per_Stage_in_ms); Pwm_Channel++; } } } } Vuoto Up_to_DOWN_OFF() { Seriale.println("Up_to_DOWN_OFF"); Byte Calc_Num_Stages_per_Module = Num_Stages_per_Module; Int ModuleCount (Conteggio moduli) = PWMModules - 1; Mentre (ModuleCount (Conteggio moduli) >= 0) { Pwm_Channel_Brightness = 4095; Se ((Fasi sinistra >= 1) E (ModuleCount (Conteggio moduli) == PWMModules - 1)) { Calc_Num_Stages_per_Module = Fasi sinistra; } Altro { Calc_Num_Stages_per_Module = Num_Stages_per_Module; } Pwm_Channel = Calc_Num_Stages_per_Module; Mentre (Pwm_Channel > -1) { Filo.beginTransmission(PWM_Module_Base_Addr + ModuleCount (Conteggio moduli)); Filo.Scrivere(Pwm_Channel * 4 + 8); Seleziona PWM_Channel_0_OFF_L registro Filo.Scrivere((Byte)Pwm_Channel_Brightness & 0xff); Valore per il registro sopra Filo.endTransmission(); Filo.beginTransmission(PWM_Module_Base_Addr + ModuleCount (Conteggio moduli)); Filo.Scrivere(Pwm_Channel * 4 + 9); Seleziona PWM_Channel_0_OFF_H registro Filo.Scrivere((Pwm_Channel_Brightness >> 8)); Valore per il registro sopra Filo.endTransmission(); Se (Pwm_Channel_Brightness > 0) { Pwm_Channel_Brightness = Pwm_Channel_Brightness - Delay_Stages; Se (Pwm_Channel_Brightness < 0) { Pwm_Channel_Brightness = 0; } } Altro Se ( Pwm_Channel >= 0) { Pwm_Channel_Brightness = 4095; Ritardo(delay_per_Stage_in_ms); Pwm_Channel--; Se ( Pwm_Channel < 0) { Pwm_Channel = 0; Pausa; } } } ModuleCount (Conteggio moduli) = ModuleCount (Conteggio moduli) - 1; } } Vuoto Ciclo() { Se ((Motion_Trigger_Down_to_Up) E !(On_Delay) ) { Secondi24 = 0; On_Delay = Vero; Down_to_Up_ON(); } Se ((On_Delay) E (Secondi24 > Delay_ON_to_OFF) E (Motion_Trigger_Down_to_Up) ) { Down_to_Up_OFF(); Motion_Trigger_Down_to_Up = False; On_Delay = False; Secondi24 = 0; } Se ((Motion_Trigger_Up_to_Down) E !(On_Delay) ) { Secondi24 = 0; On_Delay = Vero; Up_to_DOWN_ON(); } Se ((On_Delay) E (Secondi24 > Delay_ON_to_OFF) E (Motion_Trigger_Up_to_Down)) { Up_to_DOWN_OFF(); Motion_Trigger_Up_to_Down = False; On_Delay = False; Secondi24 = 0; } }
Vi auguro un sacco di divertimento con la replica e fino alla prossima parte della serie. Come sempre, puoi trovare tutti i progetti precedenti nella pagina GitHub https://github.com/kuchto
10 commenti
Andreas Wolter
@Schische: die Helligkeit wird über die PWM geregelt. Der Parameter müsste daher Pwm_Channel_Brightness sein. Das Maximum wird auf 4095 festgelegt. Leider wurde keine Variable bzw. Konstante verwendet. Somit muss man den Grenzwert an mehreren Stellen ändern.
Grüße,
Andreas Wolter
AZ-Delivery Blog
Schische
Hallo,
super Anleitung! Ich habe die Steuerung bei mir im Haus nachgebaut und es funktioniert sehr gut. Eine Frage habe ich: die LED’s an den Stufen sind mir leider zu hell. Welche Parameter muss ich ändern, damit die Treiber nicht komplett durchschalten? Danke
Muharrem
@ Markus ich möchte dein Vorhaben auch realisieren. Könntest du mir bitte behilflich sein.
Ich bedanke mich im Voraus
Markus
Material:
xx ws2812b Leds (xx = Anzahl je nachdem wieviele man verbrauchen will), Strips oder einzelne
1 Arduino Nano
1 Bluetooth Modul HC-06
2 Bewegungsmelder HC-SR501
1 Lichtsensor
1 Netzteil 5V xx Ampere ( Je nachdem wie viele Leds man verbraucht)
Led Kabel 5 Adrig
Lötkolben und Zinn
Phantasie
Vorwort:
Überlegung war ein Treppenlicht zu bauen, was erkennt wenn oben oder unten jemand die Treppe benutzen möchte. Beim Bauen viel mir immer mehr ein was man machen könnte, so wurde es immer komplexer. So ist das Endergebnis mit Bluetooth mit dem Handy verbunden worden um Farben oder Effekte, sowie verschiedene Daten zu übermitteln. Ein Lichtsensor wurde verbaut, damit die Beleuchtung nicht andauernd anspringt, sondern nur wenn es dunkel genug ist.
Weitere Überlegungen:
Was brauche ich? In meiner zweiten Version habe ich Kabelkanäle genommen, da passte sogar der Nano und das BT Modul rein. Löcher für die Leds in der richtigen Lage der Stufen gebohrt und eingeklebt. Da im Nachhinein noch der Lichtsensor eingebaut wurde, muss ich durch den Kanal ein 5 adriges Led Kabel verlegen. Erste das 5V, Zweite GND, Dritte Datenkabel Leds, Vierte BW2, Fünfte der Lichtsensor. BW1 wird direkt an den nano gemacht.
Hab noch mehrere Versionen in laufe der Entwicklung erstellt, so hab ich auch welche mit Holzleisten gemacht, oder mit einer Fräse unten in den Treppenstufen eine Nut rein gefräst. Möglichkeiten sollte es genug geben. Man muss nur seine Phantasie spielen lassen.
Effekte wurden nach und nach eingebaut. Z.B. Wenn man die Treppe benutzt das die Treppen nach und nach der Richtung die man läuft angehen, und wenn man oben ankommt die langsam hinter sich ausgehen (sieht gut aus). Notbeleuchtung eingebaut, die die Treppe soweit beleuchten das man den Weg findet, man kann die Farbe der Beleuchtung ändern, die Zeiten etc. . Partybeleuchtung eingebaut. Es gibt auch hier noch etliche Möglichkeiten die einem einfallen. Die einzelnen Effekte konnte man dann mit einer App verändern oder ein oder ausschalten.
Meine nächsten Versionen, benutzen den Esp8266 (Wlan statt Bluetooth), so dass ich die Beleuchtung auch in meine Homeautomation per MQTT steuern kann. Dies ist aber noch in der Mache, das verschling doch ganz schön viel Zeit.
Ich weiß das einige nun wahrscheinlich den Code oder die App oder sonst was haben möchte. Ich habe damit aber so viel Zeit verbracht das ich das so nicht machen werde, bin aber bereit zu helfen wenn es im Eigenbau zu Fragen oder Problemen kommt.
Dirk
Hallo an alle,
ich komme hier mit einer vielleicht etwas peinlichen Frage weil ich mich vielleicht einfach nur verrechne. Aber ich bin mir unsicher über den Kabelquerschnitt bei der Stromversorgung für die Lampen. Ich möchte Led Ringe verwenden, die wollen 5 Volt und ziehen 0,24 A wenn ich das aus dem Datenblatt richtig lese. Wenn ich jetzt 16 (16 Stufen) Stück parallel mit der nötigen Leistung versorgen will, welchen Kabelquerschnitt braue ich ich dann ohne diese zu Überlasten ? Das sind dann ja schon knapp 20 Watt und das bei 3 Meter Leitungslänge. Will ja nicht die Treppe abfackeln. Oder sollte man mit mehreren Reihenschaltungen und mehr Volt arbeiten. Wäre sehr dankbar für einen Tipp.
Gruß, Dirk
Tobias
Hallo Georg,
Die Beleuchtung kommt sehr nahe an das Video, jedoch variiert die Ausschalt Sequenz der Treppe ein bisschen, da immer die nächste Treppenstufe erst dann anfängt, hoch oder herunterzudimmen, wenn die vorherige bereits Ihren Endzustand (aus oder ein) erreicht hat. Im Video passiert das augenscheinlich parallel in der Ausschalt Sequentz. Ich helfe, soweit es zeitlich im Rahmen bleibt, gerne weiter . Mailadresse: tobias.kuch@googlemail.com.
Gruß
Tobias
Tobias
Hallo Markus,
Könntest du dein tolles Projekt mit Code für Nano und Handyapp, Aufbauanleitung und Beschreibung dann nicht auch uns allen zur Verfügung stellen ? So hätten auch andere etwas davon
Gruß
Tobias
Uwe
Lieber Tobias, hallo AZ-Team,
zuerst Mal danke für die Beiträge und die Mühe damit. Nach den Kommentaren von Wolfgang und Thomas habe ich auch noch einige Ideen.
Zunächst einmal wäre es sinnvoll, bei Fortsetzungen einer Beitragsreihe die Kommentare zu konsolidieren. Es gibt Leser, die auch aus den Kommentaren vielleicht noch Ideen schöpfen können.
Aus den Fragen und Anregungen der Kommentatoren ist zu entnehmen, dass es auch andere Vorschläge gibt. Ich gehe davon aus, dass AZ diese auch gerne veröffentlichen würde, wenn man diese einreicht. Hier wäre vielleicht ein Hinweis angebracht, wie man das macht.
Nun ist der Interessenkreis hier sehr verschieden: AZ-Delivery lebt vom Vertrieb von Komponenten und nutzt die Beiträge dazu, Interesse für sein Portal zu wecken, Es gibt Leser, die sich für die Elektronik interessieren, die jedoch Nachhilfe bei der Programmerstellung benötigen, andere suchen einfach eine Idee zum Nachbauen. Wieder andere haben vielleicht mit Mechanik keinerlei Probleme, denen ist Strom jedoch ein Rätsel. Dazwischen sitzt der Autor und kann es keinem richtig Recht machen – eigentlich wollte er ja nur an seiner Idee teilhaben lassen.
Ich finde die hier vorgestellte Idee super (würde mir auch den Vorschlag von Markus ansehen wollen) – habe als Kybernetiker mit dem Verständnis von Automaten, Startbedingungen und Betrachtung (was wäre wenn…) keine Probleme. Nur habe ich mich nie mit der Programmentwicklung in der Tiefe beschäftigt. Für mich wäre es hilfreich, wenn im Code einige Kommentare drin wären, die das Verständnis des Codes für eine evtl Adaption erleichtern. Hierfür wäre ich sogar bereit, einen Obulus zu bezahlen. Die Anregung hier: vielleicht könnte man unter der Rubrik Literatur ein komplettes “Make” für ?? anbieten, dann mit ausführlichen Hinweisen zu VDE, Code, mechanischer Sicherheit etc?
Georg L.
Hallo Markus, kannst deine Lösung auch gerne teilen, dann können alle nachvollziehen, ob es einfacher ist. @Tobias, funktioniert die Beleuchtung dann wie im Video des ersten Teiles zu sehen?
Markus
Ich finde das alles zu umständlich, habe selber schon mehrere Treppenbeleuchtung gebaut und programmiert. Habe aber die WS2812 genommen, nano mit Bluetooth Verbindung (mit einer selbstgeschriebenden App um Veränderungen vor zu nehmen) , Mini IR Bewegungssensor PIR AM312. Das ganze läuft Problemlos.