Eine elegante automatische Treppenbeleuchtung (Teil4) - AZ-Delivery

Bonjour, bienvenue à l 'avant - dernière partie de la série "l' éclairage automatique élégant des escaliers".

 

Aujourd'hui, nous élargissons nos contrôles et nos résistances photosensibles en tant que capteurs de luminosité.À partir de la valeur de luminosité (qui peut être ajustée par le paramètre de la « limite de Luminosité solaire » et à partir de laquelle les nombres plus élevés représentent une luminosité plus élevée), l 'automatisation des escaliers sera interrompue et les escaliers ne s' allumeront qu' à la tombée de la nuit.Grâce à l'utilisation de capteurs LDR et non I2C, le système dans son ensemble n'est plus sensible aux interférences extérieures.

Une autre amélioration mineure de cette version permet de définir le temps d 'exécution entre l' ouverture et la fermeture en deux étapes, respectivement, par le paramètre Delay - Stages on et Delay - stages off.Un résultat satisfaisant peut être obtenu, par exemple, en choisissant un paramètre permettant de désactiver chaque étape d 'un paramètre supérieur à celui utilisé pour l' ouverture.


Le diagramme ci - dessous montre comment on ouvre le LDR et la prérésistance:

Circuit de photorésine

 

En ce qui concerne notre projet d'aujourd'hui, nous devons:

Nombre

Note

Attention!

2

Pierre Module HC - sr501 - type Pir

Mouvement

- 62.

Commande de modulation de largeur d 'impulsion à 12 bits pour canal PCA 9685 - 16

Nombre d 'escaliers par escalier

1

Nano - v3

 

1

Adaptateur de puissance mb102

Construction de panneau

A 992

Irf520 module d 'entraînement MOS 0 - 24V 5a

Par l'escalier.

1

Source d 'alimentation en del / lampe pour étage

Max 24 volts

1

Dix contre dix.

 

1

Lidar

Photorésine

 

Toutes les informations figurant dans les sections précédentes s'appliquent également à la partie d'aujourd'hui.

Après ajustement et ajout personnalisés du RDR, le Code peut être téléchargé:

 

"35; y compris <Câble électrique.Heure>

\ 35; définitions Base de module de modulation de largeur d 'impulsion 0x40. / / 100000b dernière définition de l 'octet d' adresse à exécuter.Lorsque vous êtes configuré pour le module logique 1 - 0x41, classe 2...Adresse: 0x40 - 0x47 
/ / sélectionnez le processus de lecture et la logique 0 sélectionne l 'opération d' écriture.
\ 35; définitions Aiguille  8                 / / démarrage de sortie 
\ 35; définitions Guide de del 13            / / la plaque intérieure est connectée à la broche 13 (pour la mise en page)
\ 35; définitions Piqûre 2
\ 35; définitions Aiguille de tissu 3
\ 35; définitions Nombre d 'étapes par module 16
\ 35; définitions Guide LDR Type A2                / / pied de tube analogique pour mesurer la luminosité.Résistance LDR
\ 35; définitions Livre
\ 35; définitions Champ d'application 50

/ / paramètres de fonctionnement réglables (constantes)

Paysage intérieur Retardateur = 10;          / / "délai d 'attente minimum" désordonné (s)
Paysage intérieur La scène est partout. =  8;         / / maximum: 62 x 16 = 992
Paysage intérieur Retard par stage = 100;
Paysage intérieur Bordure de Luminosité solaire = 600; / / limitation automatique de la luminosité
échanger Phase de retard = 20;
échanger Phase de fermeture retardée = 20;


/ / variables globales
Paysage intérieur Canal de modulation de largeur d 'impulsion = 0;
Paysage intérieur Luminosité = 0;
Bourg Action de la gâchette = Faux;
Bourg Action de la gâchette = Faux;
Bourg Lui et le retard = Faux;
Bourg Sunshine State = Vraiment?;
Bourg Commande de lumière = Vraiment?;
échanger Modulation de largeur d 'impulsion = 0;
échanger Côté gauche de la scène = 0;
/ / contrôle d 'interruption
Instable échanger 60 autres 24 = 0;
Instable échanger 24 secondes.;

Information, surveillance and reconnaissance(Vecteur de comparaison)
{   60 autres 24++;   Si (60 autres 24 > 59)   {     60 autres 24 = 0;     24 secondes.++;     Si (24 secondes. > 150)     {       24 secondes. = 0;     }   }
}

Vide Analyse ISR - Pir()
{   Bourg Aiguille = Lecture numérique(Piqûre);   Si (Aiguille)   {     Si (!(Action de la gâchette) Et !(Action de la gâchette))     {       écriture numérique(Guide de del, Haut);       Action de la gâchette = Vraiment?;     } / / PIR - a trigger   } Heure de départ prévue   {     écriture numérique(Guide de del, Bas);   }
}

Vide ISR - PIR - B()
{   Bourg Aiguille = Lecture numérique(Aiguille de tissu);   Si (Aiguille)   {     Si (!(Action de la gâchette) Et !(Action de la gâchette))     {       écriture numérique(Guide de del, Haut);       Action de la gâchette = Vraiment?;     } / / PIR B déclenchement   } Heure de départ prévue   {     écriture numérique(Guide de del, Bas);   }
}

Vide Module de modulation de largeur d 'impulsion initiale(échanger Module de modulation de largeur d 'impulsion)
{   écriture numérique(Aiguille, Haut); / / activer la broche d 'activation à faible sortie (OE).   Câble électrique.Allez.(Module de modulation de largeur d 'impulsion); / / démarrage de la transmission de données   Câble électrique.Ecrire(0x00.);                       //   Câble électrique.Ecrire(0x06.);                       Logiciel de remplacement   Câble électrique.End Drive();                 / / Stop communication - stop de transmission   Retarder(400);   Câble électrique.Allez.(Module de modulation de largeur d 'impulsion); / / démarrage de la transmission de données   Câble électrique.Ecrire(0x01.);                       / / sélectionner un registre en mode 2 (registre de commande)   Câble électrique.Ecrire(0x04.);                       Configuration Chip: 0x04: Dead pole output 0x00: Open Leakage output.   Câble électrique.End Drive();                 / / Stop communication - stop de transmission   Câble électrique.Allez.(Module de modulation de largeur d 'impulsion); / / démarrage de la transmission de données   Câble électrique.Ecrire(0x00.);                      / / sélectionner un registre en mode 1 (registre de commande)   Câble électrique.Ecrire(0x10.);                      Configuration du mode sommeil   Câble électrique.End Drive();                / / Stop communication - stop de transmission   Câble électrique.Allez.(Module de modulation de largeur d 'impulsion); / / démarrage de la transmission de données   Câble électrique.Ecrire(Type 0xfe);                       / / sélectionner un registre pré - amplificateur (registre de commande)   Câble électrique.Ecrire(0x03.);                       Définissez un prédéterminé de fréquence.Lorsque le Contrôleur preu - scaleer est défini comme "0x03h", la fréquence maximale de PWM est de 1526 Hz.Norme: 200 Hz   Câble électrique.End Drive();                 / / Stop communication - stop de transmission   Câble électrique.Allez.(Module de modulation de largeur d 'impulsion); / / démarrage de la transmission de données   Câble électrique.Ecrire(0x00.);                       / / sélectionner un registre en mode 1 (registre de commande)   Câble électrique.Ecrire(0xa1.);                       Puce de configuration: tous les droits d 'accès à l' adresse I2C, à l 'aide d' une horloge interne, / / allow auto - increment   Câble électrique.End Drive();                 / / Stop communication - stop de transmission
}


Vide Pulse Modulation Output Initiative(échanger Module de modulation de largeur d 'impulsion)
{   écriture numérique(Aiguille, Haut); / / activer la broche d 'activation à faible sortie (OE).   Pour ( Paysage intérieur Avoir = 0; Avoir < 16 + 1; Avoir++)   {     Câble électrique.Allez.(Module de modulation de largeur d 'impulsion);     Câble électrique.Ecrire(Avoir * 4 + 6);      / / sélectionner l 'ouverture d' un canal de modulation de largeur d 'impulsion     Câble électrique.Ecrire(0x00.);                     / / valeur du Registre     Câble électrique.End Drive();     Câble électrique.Allez.(Module de modulation de largeur d 'impulsion);     Câble électrique.Ecrire(Avoir * 4 + 7);      / / sélection d 'un registre d' ouverture / d 'heure de canal de modulation de largeur d' impulsion     Câble électrique.Ecrire(0x00.);                     / / valeur du Registre     Câble électrique.End Drive();     Câble électrique.Allez.(Module de modulation de largeur d 'impulsion);     Câble électrique.Ecrire(Avoir * 4 + 8);   / / sélection d 'un canal de modulation de largeur d' impulsion pour fermer un registre l     Câble électrique.Ecrire(0x00.);        / / valeur du Registre     Câble électrique.End Drive();     Câble électrique.Allez.(Module de modulation de largeur d 'impulsion);     Câble électrique.Ecrire(Avoir * 4 + 9);  / / sélectionner le canal PWM pour fermer le registre H     Câble électrique.Ecrire(0x00.);             / / valeur du Registre     Câble électrique.End Drive();   }   écriture numérique(Aiguille, Bas); / / activer la broche d 'activation à faible sortie (OE).
}

Vide Set()
{   / / initialisation   Télécharger.Allez.(9600);   Mode pinmode(Piqûre, Input);   Mode pinmode(Aiguille de tissu, Input);   Mode pinmode(Aiguille, Output);   Mode pinmode(Guide de del, Output);   Mode pinmode(Guide LDR, Input);   Modulation de largeur d 'impulsion = La scène est partout. / 16;   Côté gauche de la scène = (La scène est partout. % 16) - 1;   Si (Côté gauche de la scène >= 1) {     Modulation de largeur d 'impulsion++;   }   Câble électrique.Allez.(); / bus I2C initialisé A4 (SDA), A5 (SCL)   Pour (échanger Comptage modulaire = 0; Comptage modulaire < Modulation de largeur d 'impulsion; Comptage modulaire++)   {     Module de modulation de largeur d 'impulsion initiale(Base de module de modulation de largeur d 'impulsion + Comptage modulaire);     Pulse Modulation Output Initiative(Base de module de modulation de largeur d 'impulsion + Comptage modulaire);   }   Sans rupture();   Offensive Interference(0, Analyse ISR - Pir, Changer);   Offensive Interference(1, ISR - PIR - B, Changer);   Embrayage à couple variable = 0x00.;   Tccr1b = 0x02.;   NT1. = 0;      / / utiliser un registre d 'initialisation   Reconnaissance optique de caractères =  33353;      / / Prepared Output Comparison Register   Temps |= (1 << Association 1A);  / / désactivation de la comparaison des horloges d 'activation   Interruption();   Télécharger.Imprimer(Type F("Initialisation terminée."));
}

Bourg état du jour ()
{   Paysage intérieur Valeur de capteur = 0;   Bourg Valeur de retour = Vraiment?;   Valeur de capteur = Simulation(Guide LDR);
35; si elle est définie Livre   Télécharger.Imprimer(Type F("état de la journée:));   Télécharger.Imprimer(Valeur de capteur);
"35; fin   Si (Valeur de capteur > Bordure de Luminosité solaire)   {     Si ((Sunshine State) Et (Valeur de capteur > Bordure de Luminosité solaire + Champ d'application))     {       Valeur de retour = Faux;       Sunshine State = Faux;     } Heure de départ prévue Si (!(Sunshine State))     {       Valeur de retour = Faux;       Sunshine State = Faux;     }
35; si elle est définie Livre     Télécharger.Imprimer(Type F(Fermer));
"35; fin   } Heure de départ prévue   {     Si ((Sunshine State) Et (Valeur de capteur > Bordure de Luminosité solaire - Champ d'application))     {       Valeur de retour = Vraiment?;       Sunshine State = Vraiment?;     } Heure de départ prévue Si (!(Sunshine State))     {       Valeur de retour = Vraiment?;       Sunshine State = Vraiment?;     }
35; si elle est définie Livre     Télécharger.Imprimer(Type F("Lui."));
"35; fin   }   Retour Valeur de retour;
}

Vide De bas en haut()
{
35; si elle est définie Livre   Télécharger.Imprimer(Type F(De bas en haut));
"35; fin   échanger Calcul du nombre d 'étapes de chaque module = Nombre d 'étapes par module;   Pour (échanger Comptage modulaire = 0; Comptage modulaire < Modulation de largeur d 'impulsion; Comptage modulaire++)   {     Canal de modulation de largeur d 'impulsion = 0;     Luminosité = 4095;     Si ((Côté gauche de la scène >= 1) Et (Comptage modulaire == Modulation de largeur d 'impulsion - 1))     {       Calcul du nombre d 'étapes de chaque module = Côté gauche de la scène;     }     Heure de départ prévue     {       Calcul du nombre d 'étapes de chaque module = Nombre d 'étapes par module;     }     Canal de modulation de largeur d 'impulsion = 0;     Luminosité = 0;     Bien que (Canal de modulation de largeur d 'impulsion < Calcul du nombre d 'étapes de chaque module + 1)     {       Câble électrique.Allez.( Base de module de modulation de largeur d 'impulsion + Comptage modulaire);       Câble électrique.Ecrire(Canal de modulation de largeur d 'impulsion * 4 + 8);   / / sélection d 'un canal de modulation de largeur d' impulsion       Câble électrique.Ecrire((échanger)Luminosité & Type 0xff);        / / valeur du Registre       Câble électrique.End Drive();       Câble électrique.Allez.( Base de module de modulation de largeur d 'impulsion + Comptage modulaire);       Câble électrique.Ecrire(Canal de modulation de largeur d 'impulsion * 4 + 9);  / / sélection d 'un canal de modulation de largeur d' impulsion       Câble électrique.Ecrire((Luminosité >> 8));             / / valeur du Registre       Câble électrique.End Drive();       Si (Luminosité < 4095)       {         Luminosité = Luminosité + Phase de retard;         Si (Luminosité > 4095) {           Luminosité = 4095;         }       } Heure de départ prévue Si ( Canal de modulation de largeur d 'impulsion < Nombre d 'étapes par module + 1)       {         Luminosité = 0;         Retarder(Retard par stage);         Canal de modulation de largeur d 'impulsion++;       }     }   }
}

Vide De haut en bas()
{
35; si elle est définie Livre   Télécharger.Imprimer(Type F(Ascendant et descendant.));
"35; fin   échanger Calcul du nombre d 'étapes de chaque module = Nombre d 'étapes par module;   Paysage intérieur Comptage modulaire = Modulation de largeur d 'impulsion - 1;   Bien que (Comptage modulaire >= 0)   {     Luminosité = 0;     Si ((Côté gauche de la scène >= 1) Et (Comptage modulaire == Modulation de largeur d 'impulsion - 1))     {       Calcul du nombre d 'étapes de chaque module =  Côté gauche de la scène;     }     Heure de départ prévue     {       Calcul du nombre d 'étapes de chaque module = Nombre d 'étapes par module;     }     Canal de modulation de largeur d 'impulsion = Calcul du nombre d 'étapes de chaque module;     Bien que (Canal de modulation de largeur d 'impulsion > -1)     {       Câble électrique.Allez.( Base de module de modulation de largeur d 'impulsion + Comptage modulaire);       Câble électrique.Ecrire(Canal de modulation de largeur d 'impulsion * 4 + 8);   / / sélection d 'un canal de modulation de largeur d' impulsion       Câble électrique.Ecrire((échanger)Luminosité & Type 0xff);        / / valeur du Registre       Câble électrique.End Drive();       Câble électrique.Allez.(Base de module de modulation de largeur d 'impulsion + Comptage modulaire);       Câble électrique.Ecrire(Canal de modulation de largeur d 'impulsion * 4 + 9);  / / sélection d 'un canal de modulation de largeur d' impulsion       Câble électrique.Ecrire((Luminosité >> 8));             / / valeur du Registre       Câble électrique.End Drive();       Si (Luminosité < 4095)       {         Luminosité = Luminosité + Phase de retard;         Si (Luminosité > 4095) {           Luminosité = 4095;         }       } Heure de départ prévue Si ( Canal de modulation de largeur d 'impulsion >= 0)       {         Luminosité = 0;         Retarder(Retard par stage);         Canal de modulation de largeur d 'impulsion--;         Si ( Canal de modulation de largeur d 'impulsion < 0)         {           Canal de modulation de largeur d 'impulsion = 0;           Rompre;         }       }     }     Comptage modulaire = Comptage modulaire - 1;   }
}


Vide De bas en haut()
{
35; si elle est définie Livre   Télécharger.Imprimer(Type F("De bas en haut en bas."));
"35; fin   échanger Calcul du nombre d 'étapes de chaque module = Nombre d 'étapes par module;   Pour (échanger Comptage modulaire = 0; Comptage modulaire < Modulation de largeur d 'impulsion; Comptage modulaire++)   {     Canal de modulation de largeur d 'impulsion = 0;     Luminosité = 4095;     Si ((Côté gauche de la scène >= 1) Et (Comptage modulaire == Modulation de largeur d 'impulsion - 1))     {       Calcul du nombre d 'étapes de chaque module = Côté gauche de la scène;     }     Heure de départ prévue     {       Calcul du nombre d 'étapes de chaque module = Nombre d 'étapes par module;     }     Bien que (Canal de modulation de largeur d 'impulsion < Calcul du nombre d 'étapes de chaque module + 1)     {       Câble électrique.Allez.( Base de module de modulation de largeur d 'impulsion + Comptage modulaire);       Câble électrique.Ecrire(Canal de modulation de largeur d 'impulsion * 4 + 8);   / / sélection d 'un canal de modulation de largeur d' impulsion       Câble électrique.Ecrire((échanger)Luminosité & Type 0xff);        / / valeur du Registre       Câble électrique.End Drive();       Câble électrique.Allez.(Base de module de modulation de largeur d 'impulsion + Comptage modulaire);       Câble électrique.Ecrire(Canal de modulation de largeur d 'impulsion * 4 + 9);  / / sélection d 'un canal de modulation de largeur d' impulsion       Câble électrique.Ecrire((Luminosité >> 8));             / / valeur du Registre       Câble électrique.End Drive();       Si (Luminosité > 0)       {         Luminosité = Luminosité - Phase de fermeture retardée;         Si (Luminosité < 0) {           Luminosité = 0;         }       } Heure de départ prévue Si ( Canal de modulation de largeur d 'impulsion < Nombre d 'étapes par module + 1)       {         Luminosité = 4095;         Retarder(Retard par stage);         Canal de modulation de largeur d 'impulsion++;       }     }   }
}


Vide Descendre()
{
35; si elle est définie Livre   Télécharger.Imprimer(Type F(Ascendant et descendant.));
"35; fin   échanger Calcul du nombre d 'étapes de chaque module = Nombre d 'étapes par module;   Paysage intérieur Comptage modulaire = Modulation de largeur d 'impulsion - 1;   Bien que (Comptage modulaire >= 0)   {     Luminosité = 4095;     Si ((Côté gauche de la scène >= 1) Et (Comptage modulaire == Modulation de largeur d 'impulsion - 1))     {       Calcul du nombre d 'étapes de chaque module = Côté gauche de la scène;     }     Heure de départ prévue     {       Calcul du nombre d 'étapes de chaque module = Nombre d 'étapes par module;     }     Canal de modulation de largeur d 'impulsion = Calcul du nombre d 'étapes de chaque module;     Bien que (Canal de modulation de largeur d 'impulsion > -1)     {       Câble électrique.Allez.(Base de module de modulation de largeur d 'impulsion + Comptage modulaire);       Câble électrique.Ecrire(Canal de modulation de largeur d 'impulsion * 4 + 8);   / / sélection d 'un canal de modulation de largeur d' impulsion       Câble électrique.Ecrire((échanger)Luminosité & Type 0xff);        / / valeur du Registre       Câble électrique.End Drive();       Câble électrique.Allez.(Base de module de modulation de largeur d 'impulsion + Comptage modulaire);       Câble électrique.Ecrire(Canal de modulation de largeur d 'impulsion * 4 + 9);  / / sélection d 'un canal de modulation de largeur d' impulsion       Câble électrique.Ecrire((Luminosité >> 8));             / / valeur du Registre       Câble électrique.End Drive();       Si (Luminosité > 0)       {         Luminosité = Luminosité - Phase de fermeture retardée;         Si (Luminosité < 0) {           Luminosité = 0;         }       } Heure de départ prévue Si ( Canal de modulation de largeur d 'impulsion >= 0)       {         Luminosité =  4095;         Retarder(Retard par stage);         Canal de modulation de largeur d 'impulsion--;         Si ( Canal de modulation de largeur d 'impulsion < 0)         {           Canal de modulation de largeur d 'impulsion = 0;           Rompre;         }       }     }     Comptage modulaire = Comptage modulaire - 1;   }
}

Vide Phase de commande d 'éclairage ()
{   Si ((Action de la gâchette) Et !(Lui et le retard))   {     Commande de lumière = état du jour();     Si (Commande de lumière)     {       24 secondes. = 0;       Lui et le retard = Vraiment?;       De bas en haut();     } Heure de départ prévue {       Action de la gâchette = Faux;     }   }   Si ((Lui et le retard) Et (24 secondes. > Retardateur) Et (Action de la gâchette) )   {     De bas en haut();     Action de la gâchette = Faux;     Lui et le retard = Faux;     24 secondes. = 0;   }   Si ((Action de la gâchette) Et !(Lui et le retard))   {     Commande de lumière = état du jour();     Si (Commande de lumière)     {       24 secondes. = 0;       Lui et le retard = Vraiment?;       De haut en bas();     } Heure de départ prévue {       Action de la gâchette = Faux;     }   }   Si ((Lui et le retard) Et (24 secondes. > Retardateur) Et (Action de la gâchette))   {     Descendre();     Action de la gâchette = Faux;     Lui et le retard = Faux;     24 secondes. = 0;   }
}

Vide Run()
{   Phase de commande d 'éclairage ();

}

 

Pour diagnostiquer une erreur, on peut utiliser une interface en série de la structure 9600, qui fournit des informations sur l 'état actuel:

Sortie sur un moniteur série

Je vous souhaite de vous amuser jusqu 'à la fin de la série.

Comme d 'habitude, vous pouvez trouver tous les articles précédents sur la page github https://github.com/kuchto

 

 

Für arduinoProjekte für fortgeschritteneSensoren

1 commentaire

Arnie

Arnie

Servus an alle Treppenbeleuchter,
wer den neuen Code so übernimmt:
- auf 8 Stufen eingestellt
- Ausschaltzeit beträgt 10 sec
- die Überblendungen sind sehr flott
- ich habe einen LDR von 3,9 kohm eingesetzt

Laisser un commentaire

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

Articles de blog recommandés

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery