// ***************************************************** // *** Serrure de GN version 1.0 // *** Marcelin Delcour, 01-2017 // *** mathkuma (_@_) gmail (_._) com // ***************************************************** #include //on definit les etats possible de la serrure #define FERMEE 0 // serrure fermée #define OUVERTE 1 // serrure ouverte #define BLOQUEE 2 // la serrure est bloquée pendant X secondes // mot de passe par defaut : 1234 char code[4]={'1','2','3','4'}; // nombre d'erreur de code autorisées avant bloquage int erreurMax = 3; // delai pendant lequel la serrure sera bloquee, en secondes int bloqueeDelai = 10; // on definit les variables du clavier const byte ROWS = 4; //four rows const byte COLS = 4; //four columns char keys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'#','0','#','D'} }; byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // on definit les 2 LED int ledVerte = 11; int ledRouge = 12; bool etatLed = false; // on definit le buzzer int buzzerPin = 10; // initialisation des variables des etats int SerrureSatut=FERMEE; int SerrureStatusPrecedent=FERMEE; int MauvaisCodeCpt=0; int PaniqueCpt=0; bool codeOK = false; char temp[4]={'0','0','0','0'}; void setup() { // on initialise la sortie serie pour debug Serial.begin(9600); // LED pinMode(ledVerte, OUTPUT); pinMode(ledRouge, OUTPUT); majLed(ledVerte, LOW); majLed(ledRouge, HIGH); // buzzer pinMode(buzzerPin, OUTPUT); // le setup est termine, on commence ! Serial.println("C'est parti !!"); beep(); } void loop() { // on traite selon le etat de la serrure switch (SerrureSatut) { case FERMEE: // serrure fermee fermee(); break; case OUVERTE: // serrure ouverte ouverte(); break; case BLOQUEE: // serrure en mode bloquee bloquee(); break; default: // nothing break; } char key = keypad.getKey(); // si une touche du clavier est pressee, on traite si la serrure nest pas deja bloquee if (key && SerrureSatut!=BLOQUEE) { beep(); // si autre chose qu'un # est presse, on met à jour le code temporaire if (key != '#') { temp[0] = temp[1]; temp[1] = temp[2]; temp[2] = temp[3]; temp[3] = key; Serial.print("nouveau code: "); Serial.print(temp[0]); Serial.print(temp[1]); Serial.print(temp[2]); Serial.println(temp[3]); } else // un # a ete presse, on compare avec le code de la serrure { codeOK=true; for (int i=0;i<4;i++) { if (temp[i] != code[i]) { codeOK=false; } } // cas ou le code entre est le bon if (codeOK) { delay(100); beep(); SerrureSatut=!SerrureSatut; MauvaisCodeCpt=0; temp[0] = 0; temp[1] = 0; temp[2] = 0; temp[3] = 0; // on affiche l etat de la serrure if (SerrureSatut==0) { Serial.println("Serrure fermee"); } else { Serial.println("Serrure ouverte"); } } // cas ou le code entre est faux else { longBeep(); MauvaisCodeCpt+=1; blinkLed(); // si en plus il y a eu plus de erreurMax essais faux, on bloque la serrure if (MauvaisCodeCpt>=erreurMax) { SerrureStatusPrecedent=SerrureSatut; SerrureSatut=BLOQUEE; PaniqueCpt=0; Serial.println("Serrure en mode bloquee"); } } // on indique si le code est vrai ou faux if (codeOK==0) { Serial.println("code FAUX"); } else { Serial.println("code OK"); } } Serial.println(""); } delay(5); } void fermee() { majLed(ledVerte, LOW); majLed(ledRouge, HIGH); } void ouverte() { majLed(ledVerte, HIGH); majLed(ledRouge, LOW); } void bloquee() { etatLed=!etatLed; majLed(ledVerte, etatLed); majLed(ledRouge, !etatLed); PaniqueCpt+=1; delay(100); if (PaniqueCpt>(bloqueeDelai*10)) { SerrureSatut=SerrureStatusPrecedent; MauvaisCodeCpt=0; PaniqueCpt=0; } } void blinkLed() { for (int i=0;i<5;i++) { majLed(ledVerte, HIGH); majLed(ledRouge, LOW); delay(150); majLed(ledVerte, LOW); majLed(ledRouge, HIGH); delay(150); } } void majLed(int led, int etat) { digitalWrite(led, etat); } void beep() { tone(buzzerPin, 1000, 50); } void longBeep() { // 1 seconde tone(buzzerPin, 500, 1000); }