[TUTO] Détection d’ouverture de porte et appuis sur touche « END »
Auteur
Message
KM3L0TT
Messages : 48 Département : 76
Sujet: [TUTO] Détection d’ouverture de porte et appuis sur touche « END » Mar 15 Jan 2019 - 13:31
Hello,
J’ai fait ce petit montage électronique à base d’arduino Nano (je l’avais sous la main) afin d’éviter D’appuyer sur le BP « END » à chaque fois qu’on ouvre la porte et à chaque fois qu’on la ferme.
Un fin de course détecte l’ouverture de la porte et simule une impulsion sur la touche « END » via le contact d’un relais relié sur votre KLZ ou clone LedWiz MEGA. Une led « service » clignote également afin de nous indiquer que nous somme en mode service.
Voici une petite vidéo de mon prototype. (Ça ressemble à rien mais ça fonctionne bien)
Le code du programme :
Code:
/* Détection d'ouverture de la porte du PinCAB
V 1.0 : 15 janvier 2019 by KM3L0TT
Ce programme permet la détection de l'ouverture ou de la fermeture de la porte du PinCAB afin de d'entrer ou de sortir du mode "Service" dans certaines tables. Cabler la sortie du du contact NO du relais sur la PIN de la touche "END" de votre KL25Z ou Clone LedWiz Arduino
Description brève du programme : Lecture du contact de porte SI OUVERTE Activation d'une impulsion sur le relais Clignotement des LEDs "Interne" et "Service" SI FERMEE Activation d'une impulsion sur le relais Eteindre les LEDs "Interne" et "Service"
D2 : Entrée "Fin de course Porte - Contact NO" D3 : Sortie "Relais" D4 : Sortie LED "Service" D13 : Sortie LED "Interne" */
// Déclaration de constantes qui ne changeront pas dans le proramme : const int Contact = 2; // Entrée Digitale à laquelle est attaché le contact de fin de course const int LEDInterne = 13; // Sortie Digitale à laquelle est attaché la LED "Interne" (13 sur les cartes Arduino) const int LEDService = 3; // Sortie Digitale à laquelle est attaché la LED "Service" const int Relais = 4; // Sortie Digitale à laquelle est attaché le relais
// Déclaration de constantes qui changeront dans le proramme : int EtatContact = 0; // Etat actuel du contact de fin de course int DernierEtatContact = 0; // Dernier état du contact de fin de course
byte EtatLED = LOW; unsigned long DateDernierChangement = 0;
void setup() { // Initialiser la PIN du contact de fin de course en tant qu'entrée : pinMode(Contact, INPUT_PULLUP); // Activation de la résistance Pull-Up interne // Initialiser les PINs des LEDs et de relais en tant que sorties : pinMode(LEDInterne, OUTPUT); // Led "Interne" pinMode(LEDService, OUTPUT); // Les "Service" pinMode(Relais, OUTPUT); // Relais // Initialiser la communication série pour débug : Serial.begin(9600); // Vitesse = 9600 baud }
void loop() { // Enregistre l'état du contact de porte dans "EtatContact" EtatContact = digitalRead(Contact); // Lire la PIN d'entrée du fin de course // Comparer l'état actuel du contact de fin de course avec son dernier état if (EtatContact != DernierEtatContact){ // SI l'état du fin de course a changé, on vérifie la condition suivante : if (EtatContact == HIGH) { // SI l'état actuel du fin de course est "OUVERT" : Serial.println("Porte ouverte"); // On affiche l'état de la porte sur la liaison série digitalWrite(Relais, HIGH); // Activer la sortie "Relais" delay(100); // Attendre 100ms digitalWrite(Relais, LOW); // Désactiver la sortie "Relais" } else { // SINON l'état actuel du fin de course est donc "FERMEE" : Serial.println("Porte fermee"); // On affiche l'état de la porte sur la liaison série digitalWrite(Relais, HIGH); // Activer la sortie "Relais" delay(100); // Attendre 100ms digitalWrite(Relais, LOW); // Désactiver la sortie "Relais" digitalWrite(LEDInterne, LOW); // Désactiver la sortie "LED Interne" digitalWrite(LEDService, LOW); // Désactiver la sortie "LED "Service" } // Delais pour éviter les rebonds et rester dans un état inverssé delay(200); // Attendre 200 ms avant de recomparer l'état du fin de course en début de programme } // Enregistre l'état actuel du fin de course en tant que dernier état pour la prochaine exécution de la boucle du programme DernierEtatContact = EtatContact;
// Appel du sous programme pour faire clignoter les LEDs "Interne" et "Service" flashLED(); }
void flashLED() { unsigned long DateCourante = millis(); // Déclaration "DateCourante" et récupération de la valeur en ms depuis le début du programme unsigned long intervalle = DateCourante - DateDernierChangement; // Déclaration "Intervalle" et calcul de l'intervalle entre le dernier changement de la date courante
if (EtatContact == HIGH && EtatLED == HIGH && intervalle > 100) { // SI Contact Porte = Fermée ET EtatLED = 1 ET 100ms se sont écoulées EtatLED = LOW; // Etat des LED = 0 car elles sont allumées Serial.println("LED 'Service' OFF"); // On affiche l'état de la LED sur la liaison série digitalWrite(LEDInterne, EtatLED); // Désactiver la sortie "LED Interne" digitalWrite(LEDService, EtatLED); // Désactiver la sortie "LED Service" DateDernierChangement = DateCourante; // Enregistre la valeur du dernier changement dans la date courante pour le futur calcul } else if (EtatContact == HIGH && EtatLED == LOW && intervalle > 300) { // SI Contact Porte = Ouvert ET EtatLED = 1 ET 300ms se sont écoulées Serial.println("LED 'Service' ON"); // On affiche l'état de la LED sur la liaison série EtatLED = HIGH; // Etat des LED = 1 car elles sont éteintes digitalWrite(LEDInterne, EtatLED); // Activer la sortie "LED Interne" digitalWrite(LEDService, EtatLED); // Activer la sortie "LED Service" DateDernierChangement = DateCourante; // Enregistre la valeur du dernier changement dans la date courante pour le futur calcul } }
Si vous avez une solution plus simple, hésitez pas ! Je suis parti sur l'arduino Nano car je l'avais sous la main...
KM3L0TT.
[TUTO] Détection d’ouverture de porte et appuis sur touche « END »