Een elegante trap automatische belichting (Teil2)

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.

 

 

Für arduinoProjekte für fortgeschritteneSensoren

6 Kommentare

Peter Wenk

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

Maik

@Thomas
Realisiere das doch mit einer separaten Steuerung, dann kannst Du dir den Flur nach deinen Wünschen ausleuchten.

Strotty

Strotty

Hallo,

ich bekomme bei ISR folgende Fehlermeldung:
exit status 1
expected unqualified-id before string constant
kann mir jemand einen Tipp geben?

Thomas

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

Markus

Was ist wenn ich mir auf der hälfte der Treppe einfällt ich muss noch mal runter ?

Wolfgang Hauf

Wolfgang Hauf

Hi,
du hast in der ersten Zeile die “#” vergessen !!

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert