Outils pour utilisateurs


Code-secret pour sonnette à base d'Arduino

Présentation :

L'idée est simple. Lorsque je sors sans clef, j'utilise un code “sonnette” pour que ma femme n'ait pas à décrocher l'interphone. La sonnette, via un montage à base d'Arduino reconnait le code “sonnette” et active la gâche électrique. Ma femme n'a plus à se déplacer.

L' arduino “écoute” la sonnette, reconnait le code, et m'ouvre en déclenchant la gâche .

Pré-requis :

Matériel:

  • quelques composants électroniques (relai, résistances, et un régulateur )

Logiciel:

  • Aucun

Etat d'avancement du projet :

[99 %]

Que dire : la réference du relais est fausse j' utilise un TR5V msz . la diode a ses bornes protège l'arduino des surtensions à la coupure du relais, c'est une diode dite de roue libre. Voila a quoi ça ressemble . Sur le bornier de l'interphone, avec un multimètre j' ai repéré une masse, un fils 0V qui passe à +12v en sonnerie, cette paire va sur J1. Et un +12v qui est transmis sur un autre par le biais du bouton poussoir de commande de gâche-électrique, cette paire va sur J2.

Écoute

Lorsque l'on appui sur la sonnette, un signal +12v est transmit a l'interphone, qui l'interprète en sonnerie . En plaçant un optocoupleur et une résistance, le signal est récupéré en +5v sur l'arduino au travers d'une résistance .

Reconnaissance du code

Chaque impulsion est représenté par une variable qui contient le temps écoulé . En faisant la différence entre les variables on obtient les intervalles et on peut les comparer. Exemple : p1=43210 p2=43215 p3=43220 intervalle1= p2-p1= 5sec intervalle2= p3-p2= 10sec

Commande de la gâche

La gâche électrique est commandée par un bouton poussoir, il suffit d'installer un relais en parallèle a celui-ci.

Remarque :

Après 4sec sans coup de sonnette les compteur repartent a zéro. Un régulateur 5v permet de s'alimenter dans l'interphone.

sonnette.pde v1.0 12/2011

sonnettev1_0.pde
  //Zebulon55 -*- code secret pour sonnette -*-
  unsigned long time[]={0,0,0,0,0}; // heure de sonnerie, 1,2,3,4 et 5
  unsigned long tps[]={0,0,0,0}; // delai entre les sonneries
  unsigned long ref1=0;  // reference de comparaison
  unsigned long ref2=0;  // reference de comparaison
  int i=0;   // compteur de sonnerie
  const int sonnettePin = 2;     // n° de la pin sonnette
  const int relaiPin =  13;      // n° de la pin relais
  int sonnetteState = 0;         // variable etat de la sonnette
 
  void setup() {
    // initialise relaiPin comme une sortie
    pinMode(relaiPin, OUTPUT);      
    // initialise sonnettePin comme une entrée
    pinMode(sonnettePin, INPUT);     
  }
 
  void loop(){
    // lecture de la sonnette
    sonnetteState = digitalRead(sonnettePin);
 
    if (sonnetteState == HIGH) { // si la sonnette est active
          i=i++; //plus 1 au compteur de sonnerie
          if (i==6){ // si compteur de sonnerie est a 6
            i=0; // remise a zero du compteur
          }
          else{  //sinon
            time[i]=millis();// Mettre dans time[numero de sonnerie]
            //l' heure en milliseconde
            delay(100);//attend 0,1 sec
          }
    }
    if (millis()>=time[i]+4000){ //si l' heure est superieur 
    //ou egale a l'heure de la derniere sonnerie plus 4000
      i=0;// remise a zero du compteur
    }
    if (i==5){ //si c'est la cinquiéme sonnerie
      tps[0]=time[2]-time[1];  //calcule des intervales
      tps[1]=time[3]-time[2];  //entre deux sonneries
      tps[2]=time[4]-time[3];
      tps[3]=time[5]-time[4];
      ref1 = tps[0]+tps[1]+tps[2]+tps[3]; //calcule du temps total
      ref2 = ref1/5;  //ref2= 1/5 du temps total
      ref1 = ref1/3.3;  //ref1= 1/3,3 du temps total
      if (tps[0]>=ref1){ // si 1er interval est superieur ou egal a ref1
        if (tps[1]<=ref2){ // si 2éme interval est inferieur ou egal a ref2
          if (tps[2]<=ref2){ //si 3éme interval est inferieur ou egal a ref2
            if(tps[3]>=ref1){ //si 4éme interval est superieur ou egal a ref1
              digitalWrite(relaiPin, HIGH); //met la relaiPin a l' etat haut
              delay (1500); //attend 1,5 sec
              digitalWrite(relaiPin, LOW);//met la relaiPin a l' etat bas
            }
          }
        }
      }
    }
  }