Welkom bij het tweede deel van onze serie "elegante trap light control". Zoals altijd, in het project rijen in de volgorde van delen van een verbetering of uitbreiding van de functie. In deze paragraaf geven we eerst het verbeteren van de functie.
Kortom, onze trap gaat iedere langzaam van onder naar boven, als men gaat van boven naar beneden, of andersom, van beneden naar boven. Het zou mooi zijn, maar als onze trap rechtsaf in de richting van als een lopend licht, waarin we gaan de trap op en dan langzaam wordt uitgeschakeld.
Deze uitbreiding het hoort te gaan in het huidige deel van de serie. De trap licht volgt onze stappen, zo snel als wij de trap op, ongeacht de richting.
De parameters en kan de schakeling van het eerste deel van de serie zal worden geaccepteerd. Het is een puur software-uitbreiding.
#definiëren Num_Stages 15
#define Delay_Stages 10
#define Delay_ON_to_OFF 5
Num_Stages |
Definieert het aantal verlichte trap (met een maximum van 16, 0 anzählend te starten. Maximale waarde: 15) |
Delay_Stages |
Fade-tijd voor elke stap -> hoe kleiner de waarde hoe groter de periode, des te langzamer. |
Delay_ON_to_OFF |
periode van tijd verstrijkt, de trap in de Status "op" zal blijven. |
Nadat de waarden van de voorkeuren zijn aangepast, de geavanceerde Code op de Arduino te worden geüpload:
// 2019 Tobias Kuch GPL 3.0 zijn <Draad.h> #define PWM_Module_Base_Addr 0x40 //10000000b de laatste Bits van Het adres bytes definiëren van de Operatie te worden uitgevoerd. Wanneer dit is ingesteld op logica 1 0x41 module 2 //is een lees-bewerking selecteert, terwijl een logische 0, een bewerking selecteert. #definiëren OE_Pin 8 // Pin voor Output Enable #define CPU_LED_Pin 13 #define PIRA_Pin 2 #define PIRB_Pin 3 #define Num_Stages 15 #define Delay_Stages 5 #define Delay_ON_to_OFF 30 // Minimum Delay_ON_to_OFF in Seconden #define delay_per_Stage_in_ms 200 int Pwm_Channel = 0; int Pwm_Channel_Brightness = 0; bool Motion_Trigger_Down_to_Up = valse; bool Motion_Trigger_Up_to_Down = valse; bool On_Delay = false; // interrupt Control byte A60telSeconds24 = 0; byte Seconds24; ISR(TIMER1_COMPA_vect) { A60telSeconds24++; als (A60telSeconds24 > 59) { A60telSeconds24 = 0; Seconds24++; als (Seconds24 > 150) { Seconds24 = 0; } } } void ISR_PIR_A() { bool PinState = digitalRead(PIRA_Pin); als (PinState) { als (!(Motion_Trigger_Up_to_Down) en !(Motion_Trigger_Down_to_Up)) { digitalWrite(CPU_LED_Pin, HOGE); Motion_Trigger_Down_to_Up = true; } // PIR geactiveerd } anders { digitalWrite(CPU_LED_Pin, LAGE); } } void ISR_PIR_B() { bool PinState = digitalRead(PIRB_Pin); als (PinState) { als (!(Motion_Trigger_Down_to_Up) en !(Motion_Trigger_Up_to_Down)) { digitalWrite(CPU_LED_Pin, HOGE); Motion_Trigger_Up_to_Down = true; } // PIR wordt geactiveerd B } anders { digitalWrite(CPU_LED_Pin, LAGE); } } void Init_PWM_Module(byte PWM_ModuleAddr) { pinMode(OE_Pin, OUTPUT); pinMode(CPU_LED_Pin, OUTPUT); digitalWrite(OE_Pin, HIGH); // Active LOW Output enable Pin (OE). Draad.begintrans missie(PWM_ModuleAddr); // gegevensoverdracht starten Draad.schrijven(0x00); // Draad.schrijven(0x06); // Software-Reset Draad.laatste missie(); // Stop communicatie - Stuur Stop Beetje vertraging(400); Draad.begintrans missie(PWM_ModuleAddr); // gegevensoverdracht starten Draad.schrijven(0x01); // voor het Selecteren van de Modus 2 Registreren (Opdracht Register) Draad.schrijven(0x04); // configureren Chip: 0x04: totempaal output 0x00: Open-drain uitgang. Draad.laatste missie(); // Stop communicatie - Stuur Stop Bit Draad.begintrans missie(PWM_ModuleAddr); // gegevensoverdracht starten Draad.schrijven(0x00); // voor het Selecteren van de Modus 1 Register (Opdracht Register) Draad.schrijven(0x10); // Configureer SleepMode Draad.endTransmission(); // Stop communicatie - stuur stopbit Draad.beginVerzending(PWM_ModuleAddr); // Start gegevensoverdracht Draad.schrijven(0xFE); // Kies PRE_SCALE register (Command Register) Draad.schrijven(0x03); // Prescaler instellen. De maximale PWM-frequentie is 1526 Hz als de PRE_SCALEer regsiter is ingesteld op "0x03h". Standaard: 200 Hz Draad.endTransmission(); // Stop communicatie - stuur stopbit Draad.beginVerzending(PWM_ModuleAddr); // Start gegevensoverdracht Draad.schrijven(0x00); // Selecteer modus 1 register (commandoregister) Draad.schrijven(0xA1); // Chip configureren: sta alle Call I2C-adressen toe, gebruik interne klok, // Functie Auto Increment toestaan Draad.endTransmission(); // Stop communicatie - stuur stopbit } nietig Init_PWM_Uitvoer(byte PWM_ModuleAddr) { digitalWrite(OE_Pin, HOOG); // Actieve LAGE uitgangsactiveringspen (OE). voor ( int bijv. = 0; bijv. < 16 + 1; bijv.++) { Draad.beginVerzending(PWM_ModuleAddr); Draad.schrijven(bijv. * 4 + 6); // Kies PWM_Channel_ON_L register Draad.schrijven(0x00); // waarde voor het bovenstaande Registreren Draad.endTransmission(); Draad.beginVerzending(PWM_ModuleAddr); Draad.schrijven(bijv. * 4 + 7); // Kies PWM_Channel_ON_H register Draad.schrijven(0x00); // waarde voor het bovenstaande Registreren Draad.endTransmission(); Draad.beginVerzending(PWM_ModuleAddr); Draad.schrijven(bijv. * 4 + 8); // Kies PWM_Channel_OFF_L register Draad.schrijven(0x00); // waarde voor het bovenstaande Registreren Draad.endTransmission(); Draad.beginVerzending(PWM_ModuleAddr); Draad.schrijven(bijv. * 4 + 9); // Kies PWM_Channel_OFF_H register Draad.schrijven(0x00); // waarde voor het bovenstaande Registreren Draad.endTransmission(); } digitalWrite(OE_Pin, LAAG); // Actieve LAGE uitgangsactiveringspen (OE). } nietig instellen() { // initialisatie Serie.beginnen(9600); pinMode(PIRA_Pin, INGANG); pinMode(PIRB_Pin, INGANG); Serie.beginnen(9600); Draad.beginnen(); // Initialiseer I2C Bus A4 (SDA), A5 (SCL) Init_PWM_Module(PWM_Module_Base_Addr); Init_PWM_Uitvoer(PWM_Module_Base_Addr); onderbreekt(); attachInterrupt(0, ISR_PIR_A, VERANDERING); attachInterrupt(1, ISR_PIR_B, VERANDERING); TCCR1A = 0x00; TCCR1B = 0x02; TCNT1 = 0; // initialiseer register met 0 OCR1A = 33353; // output toewijzen vergelijken register TIMSK1 |= (1 << OCIE1A); // Activeer timer vergelijken onderbreken onderbreekt(); } nietig Down_to_Up_ON() { Pwm_Channel = 0; Pwm_Channel_Brightness = 0; terwijl (Pwm_Channel < Num_Stages + 1) { Draad.beginVerzending( PWM_Module_Base_Addr); Draad.schrijven(Pwm_Channel * 4 + 8); // Kies PWM_Channel_0_OFF_L register Draad.schrijven((byte)Pwm_Channel_Brightness & 0xFF); // waarde voor het bovenstaande Registreren Draad.endTransmission(); Draad.beginVerzending( PWM_Module_Base_Addr); Draad.schrijven(Pwm_Channel * 4 + 9); // Kies PWM_Channel_0_OFF_H register Draad.schrijven((Pwm_Channel_Brightness >> 8)); // waarde voor het bovenstaande Registreren Draad.endTransmission(); als (Pwm_Channel_Brightness < 4095) { Pwm_Channel_Brightness = Pwm_Channel_Brightness + Vertraging_Stages; als (Pwm_Channel_Brightness > 4095) { Pwm_Channel_Brightness = 4095; } } anders als ( Pwm_Channel < Num_Stages + 1) { Pwm_Channel_Brightness = 0; vertraging(delay_per_Stage_in_ms); Pwm_Channel++; } } } nietig Down_to_Up_OFF() { Pwm_Channel = 0; Pwm_Channel_Brightness = 4095; terwijl (Pwm_Channel < Num_Stages + 1) { Draad.beginVerzending( PWM_Module_Base_Addr); Draad.schrijven(Pwm_Channel * 4 + 8); // Kies PWM_Channel_0_OFF_L register Draad.schrijven((byte)Pwm_Channel_Brightness & 0xFF); // waarde voor het bovenstaande Registreren Draad.endTransmission(); Draad.beginVerzending(PWM_Module_Base_Addr); Draad.schrijven(Pwm_Channel * 4 + 9); // Kies PWM_Channel_0_OFF_H register Draad.schrijven((Pwm_Channel_Brightness >> 8)); // waarde voor het bovenstaande Registreren Draad.endTransmission(); als (Pwm_Channel_Brightness > 0) { Pwm_Channel_Brightness = Pwm_Channel_Brightness - Vertraging_Stages; als (Pwm_Channel_Brightness < 0) { Pwm_Channel_Brightness = 0; } } anders als ( Pwm_Channel < Num_Stages + 1) { Pwm_Channel_Brightness = 4095; vertraging(delay_per_Stage_in_ms); Pwm_Channel++; } } } nietig Up_to_DOWN_ON() { Pwm_Channel = Num_Stages; Pwm_Channel_Brightness = 0; terwijl (Pwm_Channel > -1) { Draad.beginVerzending( PWM_Module_Base_Addr); Draad.schrijven(Pwm_Channel * 4 + 8); // Wähle PWM_Channel_0_OFF_L register Draad.schrijven((byte)Pwm_Channel_Brightness & 0xFF); // Wert für o.g. Registreren Draad.endTransmission(); Draad.beginVerzending(PWM_Module_Base_Addr); Draad.schrijven(Pwm_Channel * 4 + 9); // Wähle PWM_Channel_0_OFF_H register Draad.schrijven((Pwm_Channel_Brightness >> 8)); // Wert für o.g. Registreren Draad.endTransmission(); als (Pwm_Channel_Brightness < 4095) { Pwm_Channel_Brightness = Pwm_Channel_Brightness + Vertraging_Stages; als (Pwm_Channel_Brightness > 4095) { Pwm_Channel_Brightness = 4095; } } anders als ( Pwm_Channel >= 0) { Pwm_Channel_Brightness = 0; vertraging(delay_per_Stage_in_ms); Pwm_Channel--; als ( Pwm_Channel < 0) { Pwm_Channel = 0; breken; } } } } nietig Up_to_DOWN_OFF() { Pwm_Channel = Num_Stages; Pwm_Channel_Brightness = 4095; terwijl (Pwm_Channel > -1) { Draad.beginVerzending(PWM_Module_Base_Addr); Draad.schrijven(Pwm_Channel * 4 + 8); // Wähle PWM_Channel_0_OFF_L register Draad.schrijven((byte)Pwm_Channel_Brightness & 0xFF); // Wert für o.g. Registreren Draad.endTransmission(); Draad.beginVerzending(PWM_Module_Base_Addr); Draad.schrijven(Pwm_Channel * 4 + 9); // Wähle PWM_Channel_0_OFF_H register Draad.schrijven((Pwm_Channel_Brightness >> 8)); // Wert für o.g. Registreren Draad.endTransmission(); als (Pwm_Channel_Brightness > 0) { Pwm_Channel_Brightness = Pwm_Channel_Brightness - Vertraging_Stages; als (Pwm_Channel_Brightness < 0) { Pwm_Channel_Brightness = 0; } } anders als ( Pwm_Channel >= 0) { Pwm_Channel_Brightness = 4095; vertraging(delay_per_Stage_in_ms); Pwm_Channel--; als ( Pwm_Channel < 0) { Pwm_Channel = 0; breken; } } } } nietig lus() { als ((Motion_Trigger_Down_to_Up) en !(Met vertraging) ) { Seconden24 = 0; Met vertraging = waar; Down_to_Up_ON(); } als ((Met vertraging) en (Seconden24 > Delay_ON_to_OFF) en (Motion_Trigger_Down_to_Up) ) { Down_to_Up_OFF(); Motion_Trigger_Down_to_Up = fout; Met vertraging = fout; Seconden24 = 0; } als ((Motion_Trigger_Up_to_Down) en !(Met vertraging) ) { Seconden24 = 0; Met vertraging = waar; Up_to_DOWN_ON(); } als ((Met vertraging) en (Seconden24 > Delay_ON_to_OFF) en (Motion_Trigger_Up_to_Down)) { Up_to_DOWN_OFF(); Motion_Trigger_Up_to_Down = fout; Met vertraging = fout; Seconden24 = 0; } }
Ich wünsche viel Spaß beim Nachbauen dieses Projektes und bis zum nächsten Teil.
6 Reacties
Peter Wenk
Hallo Freunde im Blog,
ich habe mir die Treppenbeleuchtung auf dem Steckbrett nachgebaut und es funktioniert wunderbar.
Jetzt würde ich gern die helligkeit aller leds reduzieren. Es müsste doch über die PWM Taktung funktionieren also nicht mit 100% sondern nach wunsch nur 50% Taktung.
Kann mir einer helfen wie ich den Skretch umschreiben muss?
Würde mich über Hilfe freuen.
LG
Peter
Maik
@Thomas
Realisiere das doch mit einer separaten Steuerung, dann kannst Du dir den Flur nach deinen Wünschen ausleuchten.
Strotty
Hallo,
ich bekomme bei ISR folgende Fehlermeldung:
exit status 1
expected unqualified-id before string constant
kann mir jemand einen Tipp geben?
Thomas
Das Treppenlicht ist eine wirklich tolle Idee, mit der ich schon viele Jahre liebäugele. Aber wie es immer so ist, das, was man sucht, findet man dann doch in der Form nicht und sich zu kompletter Eigenentwicklung aufzuraffen bleibt bei mir meist auf der Strecke. Ich habe nun auch mit dem Kommentar bis zum 2. Teil gewartet, da mir im 1. Teil die Beschränkung auf die eine „Einschaltrichtung“ auffiel und die erwartungsgemäß nun ergänzt wurde. Jetzt würde ich gerne meine Idee anbringen, die mit dem Rettungsdienst-Kommentar von Wolfgang konform geht:
Unser Flur im 1. OG ist nachts erbärmlich dunkel und auf dem Weg durch den Flur auch ohne Treppenbenutzung wäre es super, wenn eben am oberen Ende der Treppe die Beleuchtung der obersten Stufe mit einem zusätzlichen (dritten) Sensor verbunden wäre, der eben nur die eine Stufe schaltet, wenn sich jemand oben im Flur bewegt. Damit hat man dann nachts ausreichend Orientierung im Flur und es ist als Funktion abgegrenzt von der Treppenbenutzung. Aber die Stufe sollte trotzdem wie in der beschriebenen Lösung integriert bleiben.
Ein Ausschalten am Ende des „Treppenganges“ wäre für mich nicht sinnvoll, da es wegen mehrerer Bewohner und Hund zwangsläufig zu Situation kommen wird, wo jemand dann im Dunklen auf der Treppe steht.
Markus
Was ist wenn ich mir auf der hälfte der Treppe einfällt ich muss noch mal runter ?
Wolfgang Hauf
Hi,
du hast in der ersten Zeile die “#” vergessen !!