Éclairage automatique de l'escalier automatique (Part2)

Bienvenue dans la deuxième partie de notre série "contrôle élégant de la lumière d’escalier". Comme toujours dans la série de projets, les parties suivantes sont sur l’amélioration ou l’extension de la fonction. Dans la partie d’aujourd’hui, nous améliorons d’abord la fonction.

Fondamentalement, nos escaliers vont lentement du bas vers le haut, si vous y entrez de haut en bas ou vice versa, de bas en haut. Cependant, il serait mieux si nos escaliers allumé exactement dans la direction comme une lumière en cours d’exécution, dans lequel nous entrons dans les escaliers, puis lentement éteindre à nouveau.

C’est précisément ce que cet élargissement doit être dans la partie d’aujourd’hui de la série. La lumière de l’escalier suit nos pas dès que nous entrons dans les escaliers, quelle que soit la direction.

Les paramètres et le circuit peuvent être de la première partie de la série être repris. Il s’agit d’une extension logicielle pure.

 

#define Num_Stages 15
#define Delay_Stages 10
#define Delay_ON_to_OFF 5

 

Num_Stages

Définit le nombre d’escaliers à éclairer (maximum 16, comptant de 0 à commencer. Valeur maximale: 15)

Delay_Stages

Période de fondu pour chaque étape d’escalier - 'gt; plus la valeur est petite, plus la période est longue, plus c’est lent.

Delay_ON_to_OFF

Période qui passe en laissant les escaliers dans l’état "sur".

 

Une fois que les valeurs ont été personnalisées selon vos propres préférences, le code étendu peut être téléchargé sur l’Arduino :

 

 

2019 Tobias Kuch GPL 3.0
Inclure <Fil.H (en)>

#define PWM_Module_Base_Addr 0x40 1000000b Le dernier morceau de l’adresse byte définit l’opération à effectuer. Lorsqu’il est réglé à la logique 1 0x41 module 2
sélectionne une opération de lecture tandis qu’un 0 logique sélectionne une opération d’écriture.
#define OE_Pin  8           Pin pour l’activation de sortie
#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 en secondes
#define delay_per_Stage_in_ms 200

Int Pwm_Channel = 0;
Int Pwm_Channel_Brightness = 0;

Bool Motion_Trigger_Down_to_Up = Faux;
Bool Motion_Trigger_Up_to_Down = Faux;
Bool On_Delay = Faux;

interrompre le contrôle
Octet A60telSecondes24 = 0;
Octet Seconds24;

Isr (Isr)(TIMER1_COMPA_vect)
{   A60telSecondes24++;   Si (A60telSecondes24 > 59)   {     A60telSecondes24 = 0;     Seconds24++;     Si (Seconds24 > 150)     {       Seconds24 = 0;     }   }
}

Vide ISR_PIR_A()
{   Bool PinState (En) = digitalRead (en)(PIRA_Pin);   Si (PinState (En))   {     Si (!(Motion_Trigger_Up_to_Down) Et !(Motion_Trigger_Down_to_Up))     {       digitalWrite (en)(CPU_LED_Pin, Haute);       Motion_Trigger_Down_to_Up = Vrai;     } PIR A déclenché   } Autre   {     digitalWrite (en)(CPU_LED_Pin, Faible);   }
}

Vide ISR_PIR_B()
{   Bool PinState (En) = digitalRead (en)(PIRB_Pin);   Si (PinState (En))   {     Si (!(Motion_Trigger_Down_to_Up) Et !(Motion_Trigger_Up_to_Down))     {       digitalWrite (en)(CPU_LED_Pin, Haute);       Motion_Trigger_Up_to_Down = Vrai;     } PIR B déclenché   } Autre   {     digitalWrite (en)(CPU_LED_Pin, Faible);   }
}

Vide Init_PWM_Module(Octet PWM_ModuleAddr)
{   pinMode(OE_Pin, Sortie);   pinMode(CPU_LED_Pin, Sortie);   digitalWrite (en)(OE_Pin, Haute); Épingle d’activation de sortie LOW active (OE).   Fil.commenceTransmission(PWM_ModuleAddr); Initier le transfert de données   Fil.Écrire(0x00);                       //   Fil.Écrire(0x06);                       Réinitialisation logicielle   Fil.endTransmission();                 Stop Communication - Envoyer Stop Bit   Retard(400);   Fil.commenceTransmission(PWM_ModuleAddr); Initier le transfert de données   Fil.Écrire(0x01 (en));                       Sélectionnez Mode 2 Registre (Registre de commande)   Fil.Écrire(0x04);                       Configurer Chip: 0x04: sortie de poteau mort 0x00: Sortie de vidange ouverte.   Fil.endTransmission();                 Stop Communication - Envoyer Stop Bit   Fil.commenceTransmission(PWM_ModuleAddr); Initier le transfert de données   Fil.Écrire(0x00);                      Sélectionnez Mode 1 Registre (Registre de commande)   Fil.Écrire(0x10);                      Configurer SleepMode   Fil.endTransmission();                Stop Communication - Envoyer Stop Bit   Fil.commenceTransmission(PWM_ModuleAddr); Initier le transfert de données   Fil.Écrire(0xFE (en));                       Sélectionnez PRE_SCALE inscrivez-vous   Fil.Écrire(0x03);                       Réglez Prescaler. La fréquence maximale pwM est de 1526 Hz si le PRE_SCALEer l’opérateur est réglé à "0x03h". Standard: 200 Hz   Fil.endTransmission();                 Stop Communication - Envoyer Stop Bit   Fil.commenceTransmission(PWM_ModuleAddr); Initier le transfert de données   Fil.Écrire(0x00);                       Sélectionnez Mode 1 Registre (Registre de commande)   Fil.Écrire(0xA1 (en));                       Configurer Chip: ERrlaube All Call I2C adresses, utiliser l’horloge interne, / Autoriser la fonction d’incrément automatique   Fil.endTransmission();                 Stop Communication - Envoyer Stop Bit
}


Vide Init_PWM_Outputs(Octet PWM_ModuleAddr)
{   digitalWrite (en)(OE_Pin, Haute); Épingle d’activation de sortie LOW active (OE).   Pour ( Int Z = 0; Z < 16 + 1; Z++)   {     Fil.commenceTransmission(PWM_ModuleAddr);     Fil.Écrire(Z * 4 + 6);      Sélectionnez PWM_Channel_ON_L inscrivez-vous     Fil.Écrire(0x00);                     Valeur pour le registre ci-dessus     Fil.endTransmission();     Fil.commenceTransmission(PWM_ModuleAddr);     Fil.Écrire(Z * 4 + 7);      Sélectionnez PWM_Channel_ON_H inscrivez-vous     Fil.Écrire(0x00);                     Valeur pour le registre ci-dessus     Fil.endTransmission();     Fil.commenceTransmission(PWM_ModuleAddr);     Fil.Écrire(Z * 4 + 8);   Sélectionnez PWM_Channel_OFF_L inscrivez-vous     Fil.Écrire(0x00);        Valeur pour le registre ci-dessus     Fil.endTransmission();     Fil.commenceTransmission(PWM_ModuleAddr);     Fil.Écrire(Z * 4 + 9);  Sélectionnez PWM_Channel_OFF_H inscrivez-vous     Fil.Écrire(0x00);             Valeur pour le registre ci-dessus     Fil.endTransmission();   }   digitalWrite (en)(OE_Pin, Faible); Épingle d’activation de sortie LOW active (OE).
}

Vide Configuration()
{   Initalisation   Série.Commencer(9600);   pinMode(PIRA_Pin, Entrée);   pinMode(PIRB_Pin, Entrée);   Série.Commencer(9600);   Fil.Commencer(); Initalisia I2C Bus A4 (SDA), A5 (SCL)   Init_PWM_Module(PWM_Module_Base_Addr);   Init_PWM_Outputs(PWM_Module_Base_Addr);   noInterrupts();   attacherInterrupt(0, ISR_PIR_A, changement);   attacherInterrupt(1, ISR_PIR_B, changement);   TCCR1A (EN) = 0x00;   TCCR1B (EN) = 0x02;   TCNT1 (en) = 0;      Inscription initiale avec 0   OCR1A =  33353;      Pré-documents Output Compare Register   TIMSK1 (en) |= (1 << OCIE1A);  Activez Timer Compare Interrupt   Interrompt();
}

Vide Down_to_Up_ON()
{   Pwm_Channel = 0;   Pwm_Channel_Brightness = 0;   Tandis que (Pwm_Channel < Num_Stages + 1)   {     Fil.commenceTransmission( PWM_Module_Base_Addr);     Fil.Écrire(Pwm_Channel * 4 + 8);   Sélectionnez PWM_Channel_0_OFF_L inscrivez-vous     Fil.Écrire((Octet)Pwm_Channel_Brightness & 0xff);        Valeur pour le registre ci-dessus     Fil.endTransmission();     Fil.commenceTransmission( PWM_Module_Base_Addr);     Fil.Écrire(Pwm_Channel * 4 + 9);  Sélectionnez PWM_Channel_0_OFF_H inscrivez-vous     Fil.Écrire((Pwm_Channel_Brightness >> 8));             Valeur pour le registre ci-dessus     Fil.endTransmission();     Si (Pwm_Channel_Brightness < 4095)     {       Pwm_Channel_Brightness = Pwm_Channel_Brightness + Delay_Stages;       Si (Pwm_Channel_Brightness > 4095) {         Pwm_Channel_Brightness = 4095;       }     } Autre Si ( Pwm_Channel < Num_Stages + 1)     {       Pwm_Channel_Brightness = 0;       Retard(delay_per_Stage_in_ms);       Pwm_Channel++;     }   }
}

Vide Down_to_Up_OFF()
{   Pwm_Channel = 0;   Pwm_Channel_Brightness = 4095;   Tandis que (Pwm_Channel < Num_Stages + 1)   {     Fil.commenceTransmission( PWM_Module_Base_Addr);     Fil.Écrire(Pwm_Channel * 4 + 8);   Sélectionnez PWM_Channel_0_OFF_L inscrivez-vous     Fil.Écrire((Octet)Pwm_Channel_Brightness & 0xff);        Valeur pour le registre ci-dessus     Fil.endTransmission();     Fil.commenceTransmission(PWM_Module_Base_Addr);     Fil.Écrire(Pwm_Channel * 4 + 9);  Sélectionnez PWM_Channel_0_OFF_H inscrivez-vous     Fil.Écrire((Pwm_Channel_Brightness >> 8));             Valeur pour le registre ci-dessus     Fil.endTransmission();     Si (Pwm_Channel_Brightness > 0)     {       Pwm_Channel_Brightness = Pwm_Channel_Brightness - Delay_Stages;       Si (Pwm_Channel_Brightness < 0) {         Pwm_Channel_Brightness = 0;       }     } Autre Si ( Pwm_Channel < Num_Stages + 1)     {       Pwm_Channel_Brightness = 4095;       Retard(delay_per_Stage_in_ms);       Pwm_Channel++;     }   }
}

Vide Up_to_DOWN_ON()
{   Pwm_Channel = Num_Stages;   Pwm_Channel_Brightness = 0;   Tandis que (Pwm_Channel > -1)   {     Fil.commenceTransmission( PWM_Module_Base_Addr);     Fil.Écrire(Pwm_Channel * 4 + 8);   Sélectionnez PWM_Channel_0_OFF_L inscrivez-vous     Fil.Écrire((Octet)Pwm_Channel_Brightness & 0xff);        Valeur pour le registre ci-dessus     Fil.endTransmission();     Fil.commenceTransmission(PWM_Module_Base_Addr);     Fil.Écrire(Pwm_Channel * 4 + 9);  Sélectionnez PWM_Channel_0_OFF_H inscrivez-vous     Fil.Écrire((Pwm_Channel_Brightness >> 8));             Valeur pour le registre ci-dessus     Fil.endTransmission();     Si (Pwm_Channel_Brightness < 4095)     {       Pwm_Channel_Brightness = Pwm_Channel_Brightness + Delay_Stages;       Si (Pwm_Channel_Brightness > 4095) {         Pwm_Channel_Brightness = 4095;       }     } Autre Si ( Pwm_Channel >= 0)     {       Pwm_Channel_Brightness = 0;       Retard(delay_per_Stage_in_ms);       Pwm_Channel--;       Si ( Pwm_Channel < 0)       {         Pwm_Channel = 0;         Pause;       }     }   }
}



Vide Up_to_DOWN_OFF()
{   Pwm_Channel = Num_Stages;   Pwm_Channel_Brightness = 4095;   Tandis que (Pwm_Channel > -1)   {     Fil.commenceTransmission(PWM_Module_Base_Addr);     Fil.Écrire(Pwm_Channel * 4 + 8);   Sélectionnez PWM_Channel_0_OFF_L inscrivez-vous     Fil.Écrire((Octet)Pwm_Channel_Brightness & 0xff);        Valeur pour le registre ci-dessus     Fil.endTransmission();     Fil.commenceTransmission(PWM_Module_Base_Addr);     Fil.Écrire(Pwm_Channel * 4 + 9);  Sélectionnez PWM_Channel_0_OFF_H inscrivez-vous     Fil.Écrire((Pwm_Channel_Brightness >> 8));             Valeur pour le registre ci-dessus     Fil.endTransmission();     Si (Pwm_Channel_Brightness > 0)     {       Pwm_Channel_Brightness = Pwm_Channel_Brightness - Delay_Stages;       Si (Pwm_Channel_Brightness < 0) {         Pwm_Channel_Brightness = 0;       }     } Autre Si ( Pwm_Channel >= 0)     {       Pwm_Channel_Brightness =  4095;       Retard(delay_per_Stage_in_ms);       Pwm_Channel--;       Si ( Pwm_Channel < 0)       {         Pwm_Channel = 0;         Pause;       }     }   }
}





Vide Boucle()
{   Si ((Motion_Trigger_Down_to_Up) Et !(On_Delay) )   {     Seconds24 = 0;     On_Delay = Vrai;     Down_to_Up_ON();   }   Si ((On_Delay) Et (Seconds24 > Delay_ON_to_OFF) Et (Motion_Trigger_Down_to_Up) )   {     Down_to_Up_OFF();     Motion_Trigger_Down_to_Up = Faux;     On_Delay = Faux;     Seconds24 = 0;   }   Si ((Motion_Trigger_Up_to_Down) Et !(On_Delay) )   {     Seconds24 = 0;     On_Delay = Vrai;     Up_to_DOWN_ON();   }   Si ((On_Delay) Et (Seconds24 > Delay_ON_to_OFF) Et (Motion_Trigger_Up_to_Down))   {     Up_to_DOWN_OFF();     Motion_Trigger_Up_to_Down = Faux;     On_Delay = Faux;     Seconds24 = 0;   }
}

 

 

Je vous souhaite beaucoup de plaisir à reconstruire ce projet et jusqu’à la prochaine partie.

 

 

Pour arduinoProjets pour avancéCapteurs

6 commentaires

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 !!

Laisser un commentaire

Tous les commentaires sont modérés avant d'être publiés

Messages de blogs recommandés

  1. Installez maintenant ESP32 via l'administrateur de la carte
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA-Over the Air-ESP Programmation par WiFi