Loading icon
Alarme DIY

On va voir une chose simple : la rĂ©alisation d’une alarme fait maison 🙂

  • Tu as le bon mot de passe une LED s’allume
  • Et si c’est pas bon, une autre LED s’allume et en plus un buzzer pour faire du bruit 🙂

Vous ne passerez pas !

Comme le projet est simple on va complexifier un peu 🙂

On va faire en sorte qu’après 3 tentatives, le système se bloque. On ajoute aussi un bouton afin de rĂ©initialiser le tout pour dĂ©bloquer le système. Ici c’est un bouton mais « ce bouton » peut prendre d’autres formes : par exemple dans un vrai système d’alarme on pourrait avoir une tĂ©lĂ©commande qui arrĂŞte notre alarme et/ou le faire via un SMS.

Prérequis du projet

Le principe

Il faut rĂ©flĂ©chir au projet avant de commencer. Personnellement, je dĂ©bute par rĂ©aliser le projet sur papier et d’Ă©crire ce qu’il doit se passer :

  • L’Ă©cran doit nous proposer de rentrer le code (dans l’exemple le moniteur sĂ©rie)
  • On doit pouvoir taper sur le clavier afin de rentrer le code
  • Il faut limiter le nombre de tentative
  • Si on dĂ©passe le nombre de tentative : il n’est plus possible de rentrer un code et l’alarme se dĂ©clenche (un buzzer dans notre cas) et la led rouge clignote
  • Si le code n’est pas correct, une led rouge s’allume et on garde en mĂ©moire la tentative pour pouvoir l’incrĂ©menter
  • Si le code est correct, une led verte s’allume et rĂ©initialise le nombre de tentative
  • Il faut un bouton permettant de remettre Ă  0 tout le code (ça permettra de dĂ©bloquer le système et surtout d’Ă©teindre le buzzer)

Le code

Voici le Sketch entier qui ressemble énormément à celui du premier article sur le keypad. Il est ici pour les retardataires 🙂

#include <Keypad.h>

/**
   On précise le nombre de ligne et de colonne
*/
const byte ROWS = 4;
const byte COLS = 4;

/**
   Il faut créer un tableau afin de représenter notre clavier
*/
char keyboard[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

/**
   Ici on initilise les PINS de l'ARDUINO
*/
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};

/**
   On utilise notre librairie pour déclarer le clavier
   et on lui donne un nom captainKeypad
*/
Keypad captainKeypad = Keypad(makeKeymap(keyboard), rowPins, colPins, ROWS, COLS);


/**
   Maintenant on va préparer les éléments pour le mot de passe
*/

/**
   Le mot de passe et sa longueur
   On utilise des constantes car les 2 valeurs lĂ  ne doivent jamais bouger !
*/
const String captainPasswordHigh = "22*"; // Le mot de passe
const int passwordLength = captainPasswordHigh.length(); // La longueur du mot de passe (3 caractères pour notre exemple) la fonction length() donne la taille de la chaîne de caractères

String userPassword; // On prépare la variable qui va conserver ce que l'utilisateur va taper

bool passwordIsGood; // Variable boolean : true ou false pour dire si le mot de passe est bon ou non
char currentKey; // La valeur que l'utilisateur va taper

int testPassword = 0; // Nombre de tentative de l'utilisateur
int limitTest = 3; // Maximum de tentative possible

/**
   on termine en préparant nos 2 leds
*/
int ledSuccess = 13;
int ledError = 11;

/**
   Et on pense au bouton :)
*/
const int buttonPin = 12;

/**
  Sans oublier notre buzzer
*/
const int buzzer = 10;

void setup() {
  Serial.begin(9600);

  /**
     On initialise les Leds en OUTPUT car on va leur envoyer des valeurs pour les allumer ou non
  */
  pinMode(ledSuccess, OUTPUT);
  pinMode(ledError, OUTPUT);

  /**
     Et le bouton en INPUT car on va lire la donnée
  */
  pinMode(buttonPin, INPUT);

  /**
    Le buzzer est lui aussi un OUTPUT car on donne ou retire du courant
  */
  pinMode(buzzer, OUTPUT);

  // un message pour informer ce qu'on doit faire
  Serial.println("Entrer le mot de passe de Captain Arduino :");
}

void loop() {
  /**
     On débute par lire le bouton
     Clique ? ou pas clique ?
     Au clique on reset nos données
  */
  if (digitalRead(buttonPin) == HIGH) {
    Serial.println("RĂ©initialisation !");
    userPassword = "";
    testPassword = 0;
    digitalWrite(buzzer, LOW); // On éteint ce satané buzzer :D
    return;
  }

  /**
     Est-ce qu'on a atteint la limite de teste
     Si oui, on affiche un message et on fait clignoter la LED ledError (dans la vidéo : la LED rouge)
  */
  if (testPassword == limitTest) {
    Serial.println("Verrouillage du système, déclenchement de l'alarme !");
    digitalWrite(buzzer, HIGH);
    digitalWrite(ledError, HIGH);
    delay(300);
    digitalWrite(ledError, LOW);
    delay(300);
    return; // Le return sert à bloquer le script, on retourne à chaque fois en haut de la boucle et de ce fait la suite n'est plus exécuté
  }

  /**
     On récupère la valeur du clavier et on l'ajoute à notre variable
     L'ajout dans le Serial est juste lĂ  afin de visualiser ce qu'il se passe
  */
  currentKey = captainKeypad.getKey();
  if (currentKey != NO_KEY) {
    userPassword += currentKey;
    Serial.println(userPassword);
  }

  /**
     Si la longueur de mot de passe de l'utilisateur est Ă©gale Ă  la longueur de notre mot de passe on rentre dans la boucle
     Sinon, on repart en haut de la boucle
     la fonction length() permet d'avoir la taille du chaîne de caractères
  */
  if (userPassword.length() == passwordLength) {
    /*
       On incrémente la variable : le nombre de fois qu'on a tenté un mot de passe
       Cette syntaxe testPassword++ est identique Ă  celle-ci : testPassword = testPassword + 1;
    */
    testPassword++;

    /**
       La fonction equalsIgnoreCase() permet de savoir si le string qu'on teste (ici le mot de passe de l'utilisateur userPassword) est Ă©gale Ă  notre mot de passe
       Cette fonction est insensible Ă  la casse

       Si on est bon, victoire :) LED verte signalant qu'on peut entrer
       On pourrait imaginer que cela désactive l'alarme
    */
    if (captainPasswordHigh.equalsIgnoreCase(userPassword)) {
      Serial.println("Correct");
      digitalWrite(ledSuccess, HIGH);
      delay(2000);
      digitalWrite(ledSuccess, LOW);
      testPassword = 0; // on pense Ă  reset le nombre de test
    }
    else {
      /**
         Si le mot de passe est faux
         On a la LED rouge et on affiche un texte
         Et tant qu'on a pas atteint le nombre maximum de tentative, on affiche un second message
      */
      Serial.println("Incorrect");
      if (testPassword < 3) {
        Serial.println("Entrer le mot de passe de Captain Arduino :");
      }
      digitalWrite(ledError, HIGH);
      delay(2000);
      digitalWrite(ledError, LOW);
    }

    /**
       Après une tentative de mot de passe il faut reset la variable
    */
    userPassword = "";
  }
}

J’ai commentĂ© un maximum le code afin qu’il soit le plus simple possible mais si besoin de complĂ©ment, n’hĂ©sitez pas et laissez une question en commentaire.

RĂ©sultat

TĂ©lĂ©chargement du Sketch de l’Alarme DIY

Améliorations possibles ?

La réponse est OUI 🙂

Pour notre projet, je rajoute des LEDs afin d’avoir quelque chose de visuelle et facilement comprĂ©hensible mais elles ne sont pas nĂ©cessaires.

  • On pourrait par exemple supprimer le bouton et gĂ©rer la rĂ©initialisation du système via le WIFI avec un ESP8266 ou via un SMS avec un module GSM (peut-ĂŞtre un article en prĂ©vision ?)
  • Il serait bon que le bon code arrĂŞte le buzzer (dans notre exemple ce n’est pas le cas)
  • Il faudrait choisir 2 boutons du clavier pour dĂ©finir un « OK » et un « ANNULE » afin d’augmenter la sĂ©curitĂ© car lĂ  dans notre cas : automatiquement dès qu’on a mis le nombre de caractère suffisant cela compare le code. En ajoutant un bouton « OK » la personne ne pourra pas savoir si le code comprend : 2, 10, 20, etc. caractères. Et surtout, le clavier n’a pas de bouton « OK » donc dĂ©jĂ  juste avec ceci, un intrus de saura pas que le « A » du clavier (par exemple) signifie « OK » dans votre code
  • etc.

Si cet article vous a plu, n’hĂ©sitez pas Ă  laisser un commentaire, noter et partager l’article.

0
J'aimerais avoir votre avis, merci de commenter.x