Pincab Passion
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.



 
AccueilAccueil  MumbleMumble  WIPs Team PP  RechercherRechercher  S'enregistrerS'enregistrer  ConnexionConnexion  Dons  








 

 [TUTO] Détection d’ouverture de porte et appuis sur touche « END »

Aller en bas 
AuteurMessage
KM3L0TT



Messages : 43
Département : 76

[TUTO] Détection d’ouverture de porte et appuis sur touche « END » Empty
MessageSujet: [TUTO] Détection d’ouverture de porte et appuis sur touche « END »   [TUTO] Détection d’ouverture de porte et appuis sur touche « END » EmptyMar 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.
Revenir en haut Aller en bas
 
[TUTO] Détection d’ouverture de porte et appuis sur touche « END »
Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Pincab Passion :: Pincab :: Tutoriels :: [TUTOS] Toys & Accessoires-
Sauter vers: