Ardu? No!MTobjectsLes ensembles de boutonsMTanalogButtons ≫ Exemple 2: Serrure codée

MTanalogButtons: Exemple 1
Gestion par événements pour UNO, Nano, Mega

Serrure codée

Ce programme simule une serrure codée à 4 chiffres, avec remise à zéro en cas d'inactivité.

Exemple de programme complet

Ce programme se fait complètement sous interruption, et libère loop qui peut être utilisé pour faire autre chose.

// Simulation d'une serrure codée.
// J'utilise un keypad 20 touches. Pour que ce programme fonctionne, il faut
// tout adapter PIN, REFERENCE, BAUDS, TABLE_DES_SEUILS, code[4]

#include  // V1.1.1 Voir http://arduino.dansetrad.fr/MTobjects

// Il faut donner la broche pour la lecture analogique
const uint8_t PIN = A5; // Changer A5 en A0..A7 suivant le cas
//
// Il faut choisir la référence de tension à utiliser pour la conversion
// DEFAULT: pour Vcc
// INTERNAL: 1,1V pour Nano/Uno
// INTERNAL1V1: 1,1V pour Mega
// INTERNAL2V56: 2,56V pour Mega
// EXTERNAL: pour utiliser AREF
#define REFERENCE INTERNAL
//
// Il faut donner le taux de transfert de la console
#define BAUDS 115200 // 115200 conseillée, mais on peut mettre 9600
// Ne pas oublier de régler la console à 115200 bauds

const word TABLE_DES_SEUILS[] = {942, 838, 797, 709, 618, 571, 471, 369, 316, 203, 87, 28, 0}; // Valeurs des seuils de comparaisons

// Code:1789# soit touches N°12, 6, 5, 4
byte code[4] = {12, 6, 5, 4}; // N° des touches pour 1789
//
//   1  2  3
//   4  5  6
//   7  8  9
//   *  0  #



byte caracteresOK = 0; // Nombre de caractères justes déjà appuyés

const char touches[] = { // Correspondance pour l'affichage
    'X', // Correspond à pas d'appui
    '#','0','*', // La touche # renvoie 1...
    '9','8','7',
    '6','5','4',
    '3','2','1',
    };


void raz(void) // Appelé si il n'y a pas d'activité
{
  caracteresOK = 0; // On recommencera depuis le début
  Serial.println("/"); // "Effacement" de l'affichage
}
MTclock RemiseAZero(5000 milli_secondes, raz, 1 action_et_arret, MT_OFF); // Compte le temps d'inactivité



void nouvelleTouche(byte touche) // Appelé quand on appuie sur une touche
{
  switch (touche) // Gestion des touches appuyées
  {
    case 3: break; // Touche * ignorée
    case 1: // Touche #
      RemiseAZero.stop(); // Plus besoin de tester l'inactivité
      if (caracteresOK == 4) // Le code est bon
      {
        Serial.print("\nCode bon, mise sous tension de la gâche");
        delay(1000);
        Serial.println(" ... fin d'alimentation");
      }
      else Serial.println("\nCode incorrect");
      caracteresOK = 0; // On recommence depuis le début
      break;
    default: // Une touche numérique est appuyée
      RemiseAZero.start(); // Repart pour 5s avant la RAZ
      Serial.print(touches[touche]); // Affichage du caractère correspondant
      if (touche == code[caracteresOK]) // La touche est correcte
        caracteresOK++; // Prêt pour la touche suivante
      else caracteresOK = 0; // On recommence depuis le début
  }    
}

MTanalogButtons Keypad(PIN, TABLE_DES_SEUILS, nouvelleTouche); // Mise en place du keypad

void setup()
{
  Serial.begin(BAUDS);
  analogReference(REFERENCE); // Permet de choisir la référence de tension
}
  
void loop(){}