Airsoft Krispies

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

Bonjour à tous et bienvenue

-50%
Le deal à ne pas rater :
Trottinette électrique OCEAN DRIVE A9 avec clignotants
299.99 € 599.99 €
Voir le deal

+3
Naudnaud
pic-pac
freeman83
7 participants

    bombe arduino by freeman83

    freeman83
    freeman83
    boulon d'argent
    boulon d'argent


    Messages : 1234
    Date d'inscription : 23/06/2012
    Age : 45
    Localisation : Rougiers / Var

    bombe arduino by freeman83 Empty bombe arduino by freeman83

    Message par freeman83 Jeu 8 Mai - 0:24

    donc voila on y est, j'ai craqué je me suis pris un arduino dans le but de faire une bombe.

    liste du matériel:
    -arduino uno R3
    -ecran LCD 16*2
    -clavier matriciel 16 touches
    -un buzzer piezzo (recup sur une alarme de fenêtre)
    -deux micro bouton poussoirs
    -une prise usb mâle/femelle
    -un composant 74hc595n
    -une mallette fait maison


    et quelques bricoles que je rajouterais au fur et a mesure du tuto.

    petite explication sur le composant 74hc595n: c'est un "shift register" qui permet en utilisant 3 broche de l'arduino de disposer de 8 sorties et qui peut être étendu "en cascade" quasiment a l'infini en branchant simplement les composant les un sur les autres via une sortie dédié. idéal pour faire des cascades de LED ou un "cube de LED".

    description de la bombe:

    la bombe possède un compte a rebours activé par code, désactivé par code et avec un code administrateur pour changer les paramètres du menu (temps, code armement et code désarmement, code admin)
    (merci PIC-PAC)

    la mallette étant fermé et possédant un contacteur d'ouverture et un contacteur de déplacement,il faut insérer la clé usb pour l'ouvrir ou la déplacer sous peine de déclencher l'explosion représenté par une sonnerie (buzzer).
    une fois ouverte il faut appuyer sur une touche pour entrer le code de désarmement.

    l'écran LCD est branché sur le 74hc595n pour libérer des sorties pour les contacteurs et éventuellement des LED pour la suite.

    mais j'ai un problème, le code fonctionne mais je n'arrive pas a faire fonctionner les contacteurs ni la clé usb j'ai l'impression que l'arduino ne les détectent pas, ou alors le code est pas complet!!!!!! si quelqu'un pouvais jeter un oeil au code peut être verrait-il ce que je n'ai pas su voir! au niveau des branchement j'ai branché les boutons poussoirs comme sur le tuto d' "openclassroom"


    Code:

    -/*programme bombe airsoft avec compte a rebours
    *contacteurs anti-soulevement et anti ouverture
    *et prise piratage, activation et desactivation par code.
    *programme trouvé sur different sites et modifié par Freeman83
    *merci a PIC-PAC du forum krispies et a lorrio du forum openclassroom
    */

    // Déclaration de la librairie :
    #include <LiquidCrystal.h>
    #include <Keypad.h> // inclusion de la librairie pour clavier matriciel
    #include <ShiftLCD.h>
    ShiftLCD lcd(10, 12, 11);

    /* initialise la librairie en précisant les sorties utilisées
    * Les connexions sont les suivantes :
    * 74HC595 broche 8 connecté a la masse
    * 74HC595 broche 10 connecté au +5v
    * 74HC595 broche 11 connecté a la broche 12 de l'arduino R3
    * 74HC595 broche 12 connecté a la broche 11 de l'arduino R3
    * 74HC595 broche 13 connecté a la masse
    * 74HC595 broche 14 connecté a la broche 10 de l'arduino R3
    * 74HC595 broche 16 connecté au +5v
    * 74HC595 broches 4 et 5 sont deux sorties possibles, broche 9 n'est pas utilisé
    * LCD broche RS connectée à la broche    QH/7 du 74HC595
    * LCD broche Enable connecté à la broche QG/6 du 74HC595
    * LCD broche D4 connectée à la broche    QD/3  du 74HC595
    * LCD broche D5 connectée à la broche    QC/2  du 74HC595
    * LCD broche D6 connectée à la broche    QB/1  du 74HC595
    * LCD broche D7 connectée à la broche    QA/15 du 74HC595
    * LCD broche R/W connectée à la masse
    * LCD broche D0, D1, D2, D3 connecté à la masse
    * Potentiomètre 10K :une broche à +5V l’autre à la masse
    * celle du milieu à la broche LCD VO
    * clavier broche C4 connectée a la broche 2
    * clavier broche C3 connectée a la broche 3
    * clavier broche C2 connectée a la broche 4
    * clavier broche C1 connectée a la broche 5
    * clavier broche L4 connectée a la broche A2
    * clavier broche L3 connectée a la broche A3
    * clavier broche L2 connectée a la broche A4
    * clavier broche L1 connectée a la broche A5
    *contacteur couvercle connecté a la broche 6 de l'arduino R3
    *contacteur déplacement connecté a la broche 7 de l'arduino R3
    *clé USB connecté a la broche 8 de l'arduino R3
    *buzzer connecté a la broche 13 de l'arduino R3
    */


    //--- Constantes utilisées avec le clavier 4x4
    const byte LIGNES = 4; // 4 lignes
    const byte COLONNES = 4; //4 colonnes

    //--- Définition des touches
    char touches[LIGNES][COLONNES] = {
      {'1','2','3','A'},
      {'4','5','6','B'},
      {'7','8','9','C'},
      {'*','0','#','D'}
    };

    int contacteur_couvercle = 6;
    int contacteur_deplacement = 7;
    int cle_usb = 8;
    int speakerpin = 13;
    int L1 = A5;
    int L2 = A4;
    int L3 = A3;
    int L4 = A2;
    int C1 = 5;
    int C2 = 4;
    int C3 = 3;
    int C4 = 2;

    // tableaux de lignes et colonnes
    byte BrochesLignes[LIGNES] = {L1, L2, L3, L4}; //connexions utilisées pour les broches de lignes du clavier
    byte BrochesColonnes[COLONNES] = {C1, C2, C3, C4}; //connexions utilisées pour les broches de colonnes du clavier


    Keypad keypad = Keypad( makeKeymap(touches), BrochesLignes, BrochesColonnes, LIGNES, COLONNES );

    //Defini tous les etats de la bombe
    #define READY 0
    #define ARMED 1
    #define DISARMED 2
    #define DETONATED 3
    #define speakerPin 13
    int etat1; //etat du contacteur couvercle
    int etat2; //etat du contacteur deplacement
    int etat3; //etat de la cle usb
    int second=30, minute=1, hour=0; // declare time variables
    int bombState=0; //0 = Ready, 1 = Armed, 2 = Disarmed, 3 = detonated
    int repeat=0;//flag to prevent repeat of getArmCode();
    int repeatAdm=0; //flag to prevent repeat of getAadminCode();
    int repeatDisarm=0;//flag to prevent repeat of getDisarmCode();
    int repeatBuzzer=0;//flag to prevent buzzer from running multiple times.
    int repeatTimerEdit=0;//flag to prevent repeat of timer edit function
    int blinkArmed = 0;  // flag for blink text
    int blinkDisarmed = 0;  // flag to blink disarmed msg
    int nbBlinkDisarmed = 6;  // flag for number of blink disarmed msg (real number of blink = nbBlinkDisarmed / 2)
    long previousTime = 0;//holds previous time in ms
    long previousDelay = 0;//holds previous time in ms since buzzer was active
    long interval = 60000;//60 second delay

    char hour_str[4]; // For Convert int in char
    char minute_str[4]; // For Convert int in char
    char second_str[4]; // For Convert int in char
    char timeInt_str[0];  // For Convert int in char
    char newcode_str[0];
    char newarmcode_str[0];
    char newdisarmcode_str[0];


    char ArmCode[] = "123456";//code pour armer la bombe
    char disarmCode[] = "123456";//code pour desarmer la bombe
    char adminCode[] = "AD9514";//code administrateur pour entrer dans le menu

    char ENTER_KEY = '#';
    char CANCEL_KEY = '*';//stores the cancel key variable.
    char timeSetKey = '*';//touche a presser pour entrer le code.



    void setup()
    {lcd.begin(16, 2);
                    lcd.clear();
                    lcd.setCursor(1, 0 );
                    lcd.print( "Bombe  Factice" );
                    lcd.setCursor( 3, 1 );
                    lcd.print( "BY FREEMAN" );
                    delay(3000);
                    lcd.clear();
                    lcd.setCursor( 1, 0 );
                    lcd.print( "Bombe  Factice" );
                    lcd.setCursor( 3, 1 );
                    lcd.print( "GOOD  GAME" );
                    delay(3000);
                    lcd.clear();
                    
      ////backlightOn();
      //blinkCursor();
      //stopVscroll();
      
      pinMode(speakerPin, OUTPUT);//definir l'etat de broche de sortie pour le buzzer
      pinMode(contacteur_couvercle, INPUT); //definir l'etat de la broche pour le contacteur couvercle.
      pinMode(contacteur_deplacement, INPUT); //definir l'etat de la broche pour le contacteur deplacement.
      pinMode(cle_usb, INPUT); //definir l'etat de la broche pour la clé usb.
      
      
    }





    void loop()

    {
      

     switch (bombState) {
    lcd.clear();
                    
        /***********************************************************
         *Ready state prepares bomb, waits for arm code to be input
         *
         ************************************************************/
      case READY:
        int resultOfGetArmCode;
        lcd.clear();
        lcd.setCursor(0, 0 );
        delay(100);
        //showCursor();
        //blinkCursor();

        lcd.print("Enter ArmCode :"); //Notification du statut.
        digitalWrite(speakerPin, HIGH);
        resultOfGetArmCode = getArmCode();

        if (resultOfGetArmCode == 1) {
          lcd.clear();
          lcd.setCursor(0, 0 );
          delay(100);
          lcd.print("Correct");
          delay(500);
          lcd.clear();
          bombState = ARMED; //debut du compte a rebours

        }//Close getArmCode(); = true

        if (resultOfGetArmCode == 0) {  //si le code est faux, l'ecran affiche "incorrect"
          tryAgainMsg();        

       }// Close getArmCode(); = false.

        break;

        /**************************************************
         *Armed state. Countdown starts, waits for pushbutton to be pressed.
         *If button is pressed, wait for code from keypad.
         ***************************************************/

      case ARMED:
        {  
          char disarmKey = keypad.getKey();
          
          
        etat1 = digitalRead(contacteur_couvercle);
        etat2 = digitalRead(contacteur_deplacement);
        etat3 = digitalRead(cle_usb);
        
       
           if (etat3 == LOW) { //si la cle usb est inseré les contacteurs couvercle et deplacement sont consideré comme appuyé
           etat1 = LOW;
           etat2 = LOW;
          }   
              
            if (etat1 == HIGH)
            bombState = DETONATED; //si le contacteur couvercle est relaché la bombe explose
          

           if (etat2 == HIGH)
           bombState = DETONATED; //si le contacteur de deplacement est relaché la bombe explose
             

          if (disarmKey == '#') {
           char reslutOfDisarm;
            lcd.clear();    
            lcd.setCursor(0, 0 );

            delay(100);
            lcd.print("Enter DisarmCode"); //si la touche de desarmement # est pressée, l'utilisateur peux entrer le code.
            reslutOfDisarm = getDisarmCode();

            if (reslutOfDisarm == true) {  
              lcd.clear();
              bombState = DISARMED; //la bombe passe a l'etat desarmé.
              break;
            } //close getDisarmCode(); = True


            if (reslutOfDisarm == false) {
              tryAgainMsg();

              if (second >= 15) {
                second = second - 15;
              }

             else {
                if (minute == 0 && hour == 0) {
                  second=1; //detonate.
                }
                if (minute > 0) {
                  second = 60 - (15 - second);
                  minute = minute - 1;
               }

                if (hour > 0 && minute == 0) {
                  second = 60 - (15 - second);
                  minute = 59;
                  hour = hour - 1 ;
                }
              }    
            } //close getDisarmCode(); = false  
         } //close if

        }
        countdown(); //si la touche de desarmement # n'est pas pressée, continue le compte a rebours.

        break;

        /**************************************************************
         *DISARMED. Counter stopped, displays "bomb disarmed"
         *
         **************************************************************/

      case DISARMED:
        int blinkDisarmFlag;
        blinkDisarmFlag = 0;
        
        //hideCursor();

        for (nbBlinkDisarmed; nbBlinkDisarmed > 0; nbBlinkDisarmed--){  // blink msg
          if (blinkDisarmFlag == 1){  
            lcd.setCursor(1, 0 );
            lcd.print("BOMBE DESARMEE"); //indique le statut bombe desarmée.
            lcd.setCursor(1, 1 );
            lcd.print("GOOD JOB TEAM");
            delay(5000);
            lcd.clear();
            lcd.setCursor(1, 0 );
            lcd.print("GOOD JOB TEAM"); //bomb has been disarmed, inform user.
            lcd.setCursor(1, 1 );
            lcd.print("BOMBE DESARMEE");
            delay(5000);
          

      asm volatile ("  jmp 0");
           blinkDisarmFlag = 0;
            
          }
          else{
            lcd.clear();
            delay(1000);        
            blinkDisarmFlag = 1;
          }  
        } // end blink
        break;

        /*******************************************************
         *Detonated. activate buzzer for 8 beeps, then 1 long.
         *Print "Have A Nice Day. to LCD.
         ********************************************************/

      case DETONATED:
        if (repeatBuzzer == 0) { //make sure buzzer for loop has not already been run.

          digitalWrite(speakerpin, LOW);//declencher le buzzer
          lcd.clear();
          lcd.setCursor(3, 0 );
          lcd.print("EXPLOSION"); //loop message informing user of bomb detonation.
          //lcd.setCursor(0, 1 );
          //lcd.print("Have A Nice Day"); //loop message informing user of bomb detonation.
          delay(5000);//attendre 5 secondes
          digitalWrite(speakerpin, HIGH);//arreter le buzzer
          repeatBuzzer = 1;//set flag to prevent code from looping again.
        }

        else {
          //lcd.setCursor(0, 0 );
          //lcd.print("EXPLOSION"); //loop message informing user of bomb detonation.
          lcd.setCursor(1, 1 );
          lcd.print("Have A Nice Day"); //loop message informing user of bomb detonation.
          delay(9000);
          

      asm volatile ("  jmp 0");

       }

      }//closes switch
    }//closes loop
    /*void software_Reset()
    {
    }*/
    /***********************************************************
     * Main countdown timer                                     *
     *                 countdown()                              *
     ************************************************************/
    void countdown(){

     static unsigned long lastTick = 0; // set up a local variable to hold the last time we decremented one second
      static unsigned long currentMillis = 0;
      // (static variables are initialized once and keep their values between function calls)

      // decrement one second every 1000 milliseconds
      if (second > 0) {
        if (millis() - lastTick >= 1000) {
          lastTick = millis();
          second--;
          serialOutput();
        }
      }

      // decrement one minute every 60 seconds
      if (minute > 0) {
        if (second <= 0) {
          minute--;
          second = 60; // reset seconds to 60

        }
      }

      // decrement one hour every 60 minutes
      if (hour > 0) {
        if (minute <= 0) {
          hour--;
          minute = 60; // reset minutes to 60
        }//closes if
      }//closes if


      //the code below beeps the siren once every minute.
      currentMillis = millis();
      if (currentMillis - previousTime > interval)
      {
        previousTime = currentMillis;
        previousDelay = currentMillis;

        digitalWrite(speakerPin, LOW);//turn on buzzer
      }

      if (currentMillis - previousDelay > 100) {//100ms chirp duration
        digitalWrite(speakerPin, HIGH);//turn off buzzer
      }
    } //close countdown();


    /***********************************************************************
     *                          getArmCode();                               *
     *  Grabs the code to arm the bomb from the keypad.                     *
     *                                                                      *
     ************************************************************************/
    boolean getArmCode(){
      // returns true when all PW keys are pressed in sequence
      // returns false when number of keys in pW pressed but don't exactly match the PW
      // CANCEL_KEY erases all previous digits input
      int count=0;  // how many keys we have
      int matchCount=0;  // how many keys match
      lcd.setCursor(0, 1 );

      if(repeat == 0){

        for(count=0, matchCount=0; count < sizeof(ArmCode)-1; count++){
          char key;
          char key_str[0];  // Define as string

          do{
            key = keypad.getKey();
            delay (100);
          }
          while(key == '\0');

          key_str[0] = key;
          lcd.print(key_str);

          if (key == timeSetKey && repeatTimerEdit == 0){
    // ***************** MOD HERE *********************   ============> Random codes for arm & disarm    
           timerSet();
            return 2;
         }      

         if(key == ArmCode[count]) {
            matchCount++;
          }

          else if(key == CANCEL_KEY){
            count=0;
            matchCount=0;
            return 0;
          }
        }//close for loop
     }//close repeat flag check

      // here when the same number of keys pressed as characters in the PW
      if(matchCount == count) {
        repeat=1;
        return 1;
      }

      else {
        return 0;
      }
    }//close getArmCode();


    /**********************************************************************
     *                   getDisarmCode();                                  *
     *    Gets disarm code from keypad.                                    *
     *                                                                     *
     ***********************************************************************/
    boolean getDisarmCode(){

      // returns true when all PW keys are pressed in sequence
      // returns false when number of keys in pW pressed but don't exactly match the PW
      // CANCEL_KEY erases all previous digits input

      int count=0;  // how many keys we have
      int matchCount=0;  // how many keys match
      long disarmTime = millis()+9000L;//7000 instead of 15000 b/c of added delays making total 30s

      lcd.setCursor(0, 1 );
      //showCursor();
      //blinkCursor();

      if(repeatDisarm == 0){

        for(count=0, matchCount=0; count < sizeof(disarmCode)-1; count++){
          char key;
          char key_str[0];  // Define as string

          do{
            if(disarmTime < millis()){ //if 15 seconds have passed, bail out
              break;
            }

            key = keypad.getKey();
           delay (100);      
         }
          while(key == '\0');

          key_str[0] = key;
          lcd.print(key_str);

          if(key == disarmCode[count]) {
            matchCount++;
          }

          else if(key == CANCEL_KEY){
            count=0;
            matchCount=0;
            return false;
          }

          if(disarmTime < millis()) {
            return false;
            break;
         }

        }// close for loop
      } //close repeat flag check

        // here when the same number of keys pressed as characters in the PW
      if(matchCount == count) {
        repeatDisarm=1;
        return true;
      }
      else {
        return false;

      }
    }//close getDisarmCode();


    /**********************************************************************
     *                   getAdminCode();                                  *
     *    Gets admin code from keypad.                                    *
     *                                                                     *
     ***********************************************************************/
    boolean getAdminCode(){

      // returns true when all PW keys are pressed in sequence
      // returns false when number of keys in pW pressed but don't exactly match the PW
      // CANCEL_KEY erases all previous digits input

      int count=0;  // how many keys we have
      int matchCount=0;  // how many keys match

      lcd.setCursor(0, 1 );


      for(count=0, matchCount=0; count < sizeof(adminCode)-1; count++){
        char key;
        char key_str[0];  // Define as string

        do{
          key = keypad.getKey();
          delay (100);
        }
        while(key == '\0');

    //    itoa(key, key_str,10);
        key_str[0] = key;
        lcd.print(key_str);
      //  lcd.print(itoa(key, key_str,16));


        if(key == adminCode[count]) {
          matchCount++;
        }

        else if(key == CANCEL_KEY){
          count=0;
          matchCount=0;
          return false;
        }

      }// close for loop

      // here when the same number of keys pressed as characters in the PW
      if(matchCount == count) {
        return true;
      }
      else{
        return false;
      }
      // Do nothing if pwd is false / Parent function send tryAgin msg
    }//close getAdminCode();


    /*********************************************************************
     *                        Timer edit function                         *
     *                                                                    *
     *                                                                    *
     **********************************************************************/
    void timerSet(){
      lcd.clear();
      lcd.print("Enter AdminCode");
      char resultOfGetAdmCode;

      resultOfGetAdmCode = getAdminCode();

      if (resultOfGetAdmCode == true){
        char timeInt;
        char newcode;
        char newarmcode;
        char newdisarmcode;
        char menupage;
        int newadmincode;
        lcd.clear();  
        lcd.setCursor(0, 0 );
        lcd.print("1.Admin 2.Time");
        lcd.setCursor(0, 1 );
        lcd.print("3.Arm 4.Disarm");
        do{
          menupage = keypad.getKey();
        }
        while(menupage == '\0' || menupage == '*' || menupage == '0' || menupage > 52);
        
        switch(menupage) {
          case '1': // Edit admin code
            lcd.clear();
            lcd.setCursor(0, 0 );
            lcd.print("new admin code :");
            lcd.setCursor(0, 1 );
            do{
               newcode = keypad.getKey();
               delay (100);
            }
           while(newcode == '\0');
           newcode_str[0] = newcode;
           lcd.print(newcode_str);
           adminCode[0] = newcode_str[0];
           newadmincode = (newcode - '0') * 10;//get first digit and convert to int
           do{
           newcode = keypad.getKey();
           delay (100);
            }
            while(newcode == '\0');
            newcode_str[0] = newcode;
            lcd.print(newcode_str);
            adminCode[1] = newcode_str[0];
            newadmincode = (newcode - '0') + newadmincode;//get second digit.
            do{
           newcode = keypad.getKey();
           delay (100);
            }
            while(newcode == '\0');
            newcode_str[0] = newcode;
            lcd.print(newcode_str);
            adminCode[2] = newcode_str[0];
            newadmincode = (newcode - '0') + newadmincode;//get 3rd digit.
            do{
           newcode = keypad.getKey();
           delay (100);
            }
            while(newcode == '\0');
            newcode_str[0] = newcode;
            lcd.print(newcode_str);
            adminCode[3] = newcode_str[0];
            newadmincode = (newcode - '0') + newadmincode;//get 4th digit.
            do{
           newcode = keypad.getKey();
           delay (100);
            }
            while(newcode == '\0');
            newcode_str[0] = newcode;
            lcd.print(newcode_str);
            adminCode[4] = newcode_str[0];
            newadmincode = (newcode - '0') + newadmincode;//get 5th digit.
            do{
           newcode = keypad.getKey();
           delay (100);
            }
            while(newcode == '\0');
            newcode_str[0] = newcode;
            lcd.print(newcode_str);
            adminCode[5] = newcode_str[0];
            newadmincode = (newcode - '0') + newadmincode;//get 6th digit.
          
             //newcode = 'L';
     
           
             lcd.clear();
              
              lcd.setCursor(0, 0 );
              lcd.print("NEW ADMINCODE");
              lcd.setCursor(0, 1 );
              lcd.print(adminCode);
              delay(5000);
              lcd.clear();
            
            break;
            
            case '3': // Edit armcode
            lcd.clear();
            lcd.setCursor(0, 0 );
            lcd.print("new armcode :");
            lcd.setCursor(0, 1 );
            do{
               newarmcode = keypad.getKey();
               delay (100);
            }
           while(newarmcode == '\0');
           newarmcode_str[0] = newarmcode;
           lcd.print(newarmcode_str);
           ArmCode[0] = newarmcode_str[0];
           newarmcode = (newarmcode - '0') * 10;//get first digit and convert to int
           do{
           newarmcode = keypad.getKey();
           delay (100);
            }
            while(newarmcode == '\0');
            newarmcode_str[0] = newarmcode;
            lcd.print(newarmcode_str);
            ArmCode[1] = newarmcode_str[0];
            newarmcode = (newarmcode - '0') + newarmcode;//get second digit.
            do{
           newarmcode = keypad.getKey();delay (100);
            }
            while(newarmcode == '\0');
            newarmcode_str[0] = newarmcode;
            lcd.print(newarmcode_str);
            ArmCode[2] = newarmcode_str[0];
            newarmcode = (newarmcode - '0') + newarmcode;//get 3rd digit.
            do{
           newarmcode = keypad.getKey();
           delay (100);
            }
            while(newarmcode == '\0');
            newarmcode_str[0] = newarmcode;
            lcd.print(newarmcode_str);
            ArmCode[3] = newarmcode_str[0];
            newarmcode = (newarmcode - '0') + newarmcode;//get 4th digit.
            do{
           newarmcode = keypad.getKey();
           delay (100);
            }
            while(newarmcode == '\0');
            newarmcode_str[0] = newarmcode;
            lcd.print(newarmcode_str);
            ArmCode[4] = newarmcode_str[0];
            newarmcode = (newarmcode - '0') + newarmcode;//get 5th digit.
            do{
           newarmcode = keypad.getKey();
           delay (100);
            }
            while(newarmcode == '\0');
            newarmcode_str[0] = newarmcode;
            lcd.print(newarmcode_str);
            ArmCode[5] = newarmcode_str[0];
            newarmcode = (newarmcode - '0') + newarmcode;//get 6th digit.
          
             //newcode = 'L';
     
           
             lcd.clear();
              
              lcd.setCursor(0, 0 );
              lcd.print("NEW ARMCODE");
              lcd.setCursor(0, 1 );
              lcd.print(ArmCode);
              delay(5000);
              lcd.clear();
            
            break;
            
            case '4': // Edit disarmcode
            lcd.clear();
            lcd.setCursor(0, 0 );
            lcd.print("new disarmcode :");
            lcd.setCursor(0, 1 );
            do{
               newdisarmcode = keypad.getKey();
            delay (100);
          }
           while(newdisarmcode == '\0');
           newdisarmcode_str[0] = newdisarmcode;
           lcd.print(newdisarmcode_str);
           disarmCode[0] = newdisarmcode_str[0];
           newdisarmcode = (newdisarmcode - '0') * 10;//get first digit and convert to int
           do{
           newdisarmcode = keypad.getKey();
           delay (100);
            }
            while(newdisarmcode == '\0');
            newdisarmcode_str[0] = newdisarmcode;
            lcd.print(newdisarmcode_str);
            disarmCode[1] = newdisarmcode_str[0];
            newdisarmcode = (newdisarmcode - '0') + newdisarmcode;//get second digit.
            do{
           newdisarmcode = keypad.getKey();
           delay (100);
            }
            while(newdisarmcode == '\0');
            newdisarmcode_str[0] = newdisarmcode;
            lcd.print(newdisarmcode_str);
            disarmCode[2] = newdisarmcode_str[0];
            newdisarmcode = (newdisarmcode - '0') + newdisarmcode;//get 3rd digit.
            do{
           newdisarmcode = keypad.getKey();
           delay (100);
            }
            while(newdisarmcode == '\0');
            newdisarmcode_str[0] = newdisarmcode;
            lcd.print(newdisarmcode_str);
            disarmCode[3] = newdisarmcode_str[0];
            newdisarmcode = (newdisarmcode - '0') + newdisarmcode;//get 4th digit.
            do{
           newdisarmcode = keypad.getKey();
           delay (100);
            }
            while(newdisarmcode == '\0');
            newdisarmcode_str[0] = newdisarmcode;
            lcd.print(newdisarmcode_str);
            disarmCode[4] = newdisarmcode_str[0];
            newdisarmcode = (newdisarmcode - '0') + newdisarmcode;//get 5th digit.
            do{
           newdisarmcode = keypad.getKey();
           delay (100);
            }
            while(newdisarmcode == '\0');
            newdisarmcode_str[0] = newdisarmcode;
            lcd.print(newdisarmcode_str);
            disarmCode[5] = newdisarmcode_str[0];
            newdisarmcode = (newdisarmcode - '0') + newdisarmcode;//get 6th digit.
          
             //newcode = 'L';
     

            lcd.clear();
              
              lcd.setCursor(0, 0 );
              lcd.print("NEW DISARMCODE");
              lcd.setCursor(0, 1 );
              lcd.print(disarmCode);
              delay(5000);
              lcd.clear();
            
            break;
            
          case '2': // Timer
            lcd.clear();
           lcd.print("Enter xx Hours");
            lcd.setCursor(0, 1 );
            do{
               timeInt = keypad.getKey();
            }
            while(timeInt == '\0' || timeInt < '0' || timeInt > '6');
            timeInt_str[0] = timeInt;
            lcd.print(timeInt_str);
      
            hour = (timeInt - '0') * 10;//get first digit and convert to int
            do{
            timeInt = keypad.getKey();
            }
            while(timeInt == '\0');
            timeInt_str[0] = timeInt;
            lcd.print(timeInt_str);
        
            hour = (timeInt - '0') + hour;//get second digit.
            delay(800);
              lcd.clear();
              timeInt = 'L';
              // ------------------------------------------------------------------
              lcd.print("Enter xx Minutes");
              lcd.setCursor(0, 1 );
              do{
                timeInt = keypad.getKey();
              }
              while(timeInt == '\0' || timeInt < '0' || timeInt > '6');
              timeInt_str[0] = timeInt;
              lcd.print(timeInt_str);
          
              while (timeInt < '0' || timeInt > '6'){
                timeInt = keypad.getKey();
              }
              minute = (timeInt - '0') * 10;//get first digit and convert to int
              do{
                timeInt = keypad.getKey();
              }
              while(timeInt == '\0');
              minute = (timeInt - '0') + minute;//get second digit.
              timeInt_str[0] = timeInt;
              lcd.print(timeInt_str);
              delay(800);  
             lcd.clear();
              timeInt = 'L';
              // ------------------------------------------------------------------
              lcd.print("Enter xx Seconds");
              lcd.setCursor(0, 1 );
              do{
                timeInt = keypad.getKey();
              }
              while(timeInt == '\0' || timeInt < '0' || timeInt > '6');
              timeInt_str[0] = timeInt;
              lcd.print(timeInt_str);
          
              while (timeInt < '0' || timeInt > '6'){
                timeInt = keypad.getKey();
              }
              second = (timeInt - '0') * 10;//get first digit and convert to int
              do{
                timeInt = keypad.getKey();
              }
              while(timeInt == '\0');
              second = (timeInt - '0') + second;//get second digit.
              timeInt_str[0] = timeInt;
              lcd.print(timeInt_str);
              delay(800);    
              lcd.clear();
              timeInt = 'L';
              lcd.print("Time set :");
              lcd.setCursor(0, 1 );
              itoa (hour, hour_str, 10);
              itoa (minute, minute_str, 10);
              itoa (second, second_str, 10);
              lcd.print(hour_str);
              lcd.print(":");
              lcd.print(minute_str);
              lcd.print(":");
              lcd.print(second_str);
             delay(2000);  
             // ---------------------- Put randomize here --------------------------
              repeatTimerEdit = 1;
            }//end of getAdminCode == true
          
            if(resultOfGetAdmCode == false){
             tryAgainMsg();
             // Do nothing if pwd is false / Parent function send tryAgin msg
            
           }
            lcd.clear();
          }//end of timer edit function
    }



    /****************************************************************
     *                     serialOutput();                           *
     *    prints the values of the timer over the serial connection  *
     *         and onto the LCD                                      *
     *****************************************************************/
    void serialOutput() {

      
      itoa (hour, hour_str, 10);
      itoa (minute, minute_str, 10);
      itoa (second, second_str, 10);
      

      if(bombState != DISARMED){
      
       lcd.setCursor(0, 0 );
        delay(20);
        if (blinkArmed == 0){
          lcd.print("!!   ARMED    !!");
          blinkArmed=1;
        }
        else {
          lcd.print("!!            !!");
          blinkArmed=0;      
        }
        lcd.setCursor(0, 1 );
        
        lcd.print("Time = ");
        if (hour <=9) {
        lcd.print("0");
        lcd.print(hour_str); // the hour, sent to the screen in decimal format
        }
        else{
        lcd.print(hour_str);
       }
        lcd.print(":"); // a colon between the hour and the minute
        if (minute <=9) {
        lcd.print("0");
        lcd.print(minute_str); // the minute, sent to the screen in decimal format
        }
        else{
        lcd.print(minute_str);
        }
        lcd.print(":"); // a colon between the minute and the second
        if (second <=9) {
        lcd.print("0");
        lcd.print(second_str); // the minute, sent to the screen in decimal format
        }
        else{
          lcd.print(second_str);
        }
        //termination condition
      }
      if (second == 0 && minute == 0 && hour == 0) {
        lcd.clear();
        
        bombState = DETONATED; //clear LCD and set bomb state to "detonated" when timer runs out
      }

      if (bombState == DISARMED) {
        lcd.clear();
     }
    }//close serialOutput();


    void tryAgainMsg(){
      lcd.clear();
      //hideCursor();
      delay(100);        
      lcd.print("T");
      delay(150);
      lcd.print("r");
      delay(150);
      lcd.print("y");
      delay(150);        
      lcd.print(" ");
      delay(150);
      lcd.print("a");
      delay(150);          
     lcd.print("g");
      delay(150);
      lcd.print("a");
      delay(150);          
     lcd.print("i");
      delay(150);
      lcd.print("n");
      delay(150);
      lcd.print(" ");
      delay(150);
      lcd.print("!");
      delay(1000);  
    }

    void incorrectMsg(){
      lcd.clear();
      
      delay(100);        
      lcd.print("I");
      delay(350);
      lcd.print("n");
      delay(350);
      lcd.print("c");
      delay(350);        
      lcd.print("o");
      delay(350);
      lcd.print("r");
      delay(350);          
     lcd.print("r");
      delay(350);
      lcd.print("e");
      delay(350);          
     lcd.print("c");
      delay(350);
      lcd.print("t");
      delay(1000);  
    }
    //END of bomb program.

    voici le schéma de montage

    bombe arduino by freeman83 Shema_11

    et voici quelques photos pour commencer, le clavier matriciel, l'écran lcd (caractères blanc sur fond bleu), et sont potard de réglage pour la luminosité, les deux micro switchs servant de contacteurs (couvercle et déplacement)

    bombe arduino by freeman83 Dsc03110

    l'arduino uno rev 3 et tout ses branchements.

    bombe arduino by freeman83 Dsc03111

    la plaquette de montage (3*7cm) avec la rangée de masse en A et B, la rangé de +5v en N, les pattes 9 à 16 du shift register en R, les pattes 1 à 8 en U, les rangés Q et V sont pour les branchement de fils.

    bombe arduino by freeman83 Dsc03112

    et enfin l'ensemble alimenté.......(oui je sais c'est le boxon dans les fils mais une fois que ce sera dans la boite on s'en fou)

    bombe arduino by freeman83 Dsc03113

    pour l'instant je n'ai pas encore monté le buzzer je veut d'abord que le reste fonctionne histoire de me prendre la tête que sur une chose à la fois.
    j'ai fait une vidéo mais elle est pas très nette et pas complète, j'en referais une un peu plus tard plus nette et avec tout les modes de fonctionnement.

    EDIT: ajout de quelques photos, du code mis a jour et du schéma mis a jour.

    j'ai toujours un problème avec la clé de piratage je n'arrive pas à la faire reconnaitre par l'arduino et du coup elle ne fonctionne pas. mais je travaille dessus.

    je vais aussi commencer l'aménagement de la mallette et l'installation de tout les éléments dans la mallette et  je posterais encore des photos.

    edit: j'ai résolut le problème de la clé usb, (petite rectification du code) mais maintenant je me retrouve avec un des deux switch qui ne marche plus (le contacteur de déplacement) et la je sèche. je remet a jour le code en même temps.

    edit: problème résolut, le pin de mon fil était trop court et ne faisait pas contact avec la broche de l'arduino. je me penche maintenant sur le branchement du buzzer.

    edit du 17 sept: j'ai enfin reçu le buzzer 110 db que j'ai commandé sur DX, pas encore testé mais le programme fonctionne très bien, et le buzzer actuel est fonctionnel, j'ai commencé le montage dans la boite, et même rajouté une led bleu sur le circuit du buzzer pour marquer les bips que j'ai rajouté, (merci droop). j'essayerais de faire de belles photos ce week-end, quand je monterais le buzzer.


    Dernière édition par freeman83 le Mer 17 Sep - 19:25, édité 10 fois
    pic-pac
    pic-pac
    ecrou or
    ecrou or


    Messages : 663
    Date d'inscription : 20/06/2011
    Age : 42
    Localisation : Issoire (63)

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par pic-pac Jeu 8 Mai - 16:47

    cool vivement les photos!!!!!!
    pic-pac
    pic-pac
    ecrou or
    ecrou or


    Messages : 663
    Date d'inscription : 20/06/2011
    Age : 42
    Localisation : Issoire (63)

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par pic-pac Jeu 8 Mai - 16:48

    je jetterais un coup d’œil sur ton code dès que j'aurais un peu de temps
    droopaille
    droopaille
    boulon platine
    boulon platine


    Messages : 2621
    Date d'inscription : 03/04/2011
    Age : 49
    Localisation : Vitré (35)

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par droopaille Dim 11 Mai - 20:05

    bah elle est où la vidéo ?


    _________________
    Toutes mes créations
    freeman83
    freeman83
    boulon d'argent
    boulon d'argent


    Messages : 1234
    Date d'inscription : 23/06/2012
    Age : 45
    Localisation : Rougiers / Var

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par freeman83 Lun 12 Mai - 20:06

    alors pas de vidéo pour l'instant je suis en train de réaliser le montage définitif, je ferais la vidéo après car j'avais pas tous les éléments pour la faire avant.

    je dois retravailler un peu le shéma avant de le poster j'ai détecté une erreur et ça serai con de le poster ainsi, car j'ai encore un souci avec le buzzer.

    quand au code j'ai demandé un peu d'aide sur le forum "openclassroom" et il est maintenant fonctionnel, mais je dois le tester avec le montage définitif.

    encore un peu de patience, je travaille beaucoup en ce moment, je rentre assez tard et la petite famille passe avant donc il me reste que peu de temps pour travailler sur le projet, mais ce weekend j'ai avancé un peu sur la mallette. bientôt les photos.
    freeman83
    freeman83
    boulon d'argent
    boulon d'argent


    Messages : 1234
    Date d'inscription : 23/06/2012
    Age : 45
    Localisation : Rougiers / Var

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par freeman83 Mar 27 Mai - 21:04

    bon alors quelques nouvelles de l'avancement du smilblick...
    le code fonctionne bien et j'ai presque fini le montage j'attends juste les plaquettes pour pouvoir souder tout les fils et composants dessus, mais tout est prêt. j'ai réussi a récupérer une carte mère d'ordi portable pour avoir la prise usb femelle, mais j'ai encore un petit problème avec la clé usb.
    bientôt les photos et j'essayerais de faire une vidéo et de la poster, (jamais fais ça moi!!!!!!)
    je travaille encore sur la mallette au niveau de la fixation de la prise usb et du contacteur de déplacement.
    droopaille
    droopaille
    boulon platine
    boulon platine


    Messages : 2621
    Date d'inscription : 03/04/2011
    Age : 49
    Localisation : Vitré (35)

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par droopaille Dim 1 Juin - 11:09

    bah ? elle est où la vidéo ???


    _________________
    Toutes mes créations
    freeman83
    freeman83
    boulon d'argent
    boulon d'argent


    Messages : 1234
    Date d'inscription : 23/06/2012
    Age : 45
    Localisation : Rougiers / Var

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par freeman83 Dim 1 Juin - 11:22

    j'ai pas encore eu le temps de la faire. je travaillais sur le shema que je met donc dans le premier post pour faciliter la lecture. j'attend les plaquettes de montage pour y souder tout mes éléments, et il me reste un petit soucis avec la clé usb mais je ferais la vidéo sans juste pour la démo. faudrai aussi que je vois comment on fait pour poster une vidéo car je l'ai jamais fais...mais après avoir fais le shema et le code ça devrais pas être un problème.
    droopaille
    droopaille
    boulon platine
    boulon platine


    Messages : 2621
    Date d'inscription : 03/04/2011
    Age : 49
    Localisation : Vitré (35)

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par droopaille Dim 1 Juin - 13:16

    bien joué pour le cablage de l'écran via le chéplukoi, t'économise des entrées
    ça marche bien ?


    _________________
    Toutes mes créations
    freeman83
    freeman83
    boulon d'argent
    boulon d'argent


    Messages : 1234
    Date d'inscription : 23/06/2012
    Age : 45
    Localisation : Rougiers / Var

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par freeman83 Dim 1 Juin - 19:42

    au top, surtout quand tu vois que ça coute moins de 2€. pour la programmation tu ajoute le "shift lcd" au même titre que ton clavier ou que ton écran.et l'avantage c'est que tu utilise que 3 broches pour ton écran.


    Dernière édition par freeman83 le Dim 1 Juin - 20:09, édité 1 fois
    droopaille
    droopaille
    boulon platine
    boulon platine


    Messages : 2621
    Date d'inscription : 03/04/2011
    Age : 49
    Localisation : Vitré (35)

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par droopaille Dim 1 Juin - 19:59

    c'est ça ton truc ?
    "un composant 74hc595n"


    _________________
    Toutes mes créations
    freeman83
    freeman83
    boulon d'argent
    boulon d'argent


    Messages : 1234
    Date d'inscription : 23/06/2012
    Age : 45
    Localisation : Rougiers / Var

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par freeman83 Dim 1 Juin - 20:05

    exact
    http://hackspark.fr/fr/74hc595-shift-register-dip.html
    le site ou j'ai commandé mes plaquettes de montage. très fiable.
    l'explication du fonctionnement et les liens pour les téléchargements.
    http://www.zem.fr/tag/74hc595/
    freeman83
    freeman83
    boulon d'argent
    boulon d'argent


    Messages : 1234
    Date d'inscription : 23/06/2012
    Age : 45
    Localisation : Rougiers / Var

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par freeman83 Lun 9 Juin - 2:05

    ajout de photos
    pic-pac
    pic-pac
    ecrou or
    ecrou or


    Messages : 663
    Date d'inscription : 20/06/2011
    Age : 42
    Localisation : Issoire (63)

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par pic-pac Lun 9 Juin - 7:23

    Beau boulot, le boxon dans les fils c'est tout le temps, moi maintenant pour j'utilise des vieilles nappes de lecteurs de disquettes comme ça les fils sont regroupés et c'est un peu plus propre mais c'est pas mal surtout pour une premiere
    freeman83
    freeman83
    boulon d'argent
    boulon d'argent


    Messages : 1234
    Date d'inscription : 23/06/2012
    Age : 45
    Localisation : Rougiers / Var

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par freeman83 Mar 10 Juin - 21:14

    pas bête du tout le coup des nappes d'ordi mais je peut pas en avoir facilement, il a fallut que j'aille dans une boutique pour récuperer une carte mère de portable pour avoir la prise usb femelle. mais je demanderais si ils ont des vielles nappe.
    pic-pac
    pic-pac
    ecrou or
    ecrou or


    Messages : 663
    Date d'inscription : 20/06/2011
    Age : 42
    Localisation : Issoire (63)

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par pic-pac Mar 10 Juin - 21:19

    Il faut des nappes lecteurs disquette, sur les brocantes ou par des amis tu peux surement en trouver ou alors regarde sur le boncoin
    freeman83
    freeman83
    boulon d'argent
    boulon d'argent


    Messages : 1234
    Date d'inscription : 23/06/2012
    Age : 45
    Localisation : Rougiers / Var

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par freeman83 Mer 17 Sep - 19:40

    mise à jour du premier post.

    avis aux experts, sur une carte uno peut-on utiliser les sorties A0,A1,et 1,2(tx,rx) pour piloter un 74hc595n, il m'en faut que trois mais je sais pas si on peut les coupler, et j'arrive pas a trouver sur le net. j'ai en projet de rajouter des leds dans la boite et de faire une variation d'intensité pour faire un effet lumineux.
    pic-pac
    pic-pac
    ecrou or
    ecrou or


    Messages : 663
    Date d'inscription : 20/06/2011
    Age : 42
    Localisation : Issoire (63)

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par pic-pac Mer 17 Sep - 20:59

    pas mal beau boulot
    droopaille
    droopaille
    boulon platine
    boulon platine


    Messages : 2621
    Date d'inscription : 03/04/2011
    Age : 49
    Localisation : Vitré (35)

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par droopaille Mer 17 Sep - 23:46

    tx et rx sont utilisables en entrée/sortie numérique classique mais ça peut créer des bugs
    mon buzzer qui est le le RX fait un bip quand je branche la carte sur alim usb (normal, c'est le canal du port usb, de même je peux pas laisser câblé le buzzer si je veux uploarder un programme, ça le fait pas avec juste l'atmega)


    _________________
    Toutes mes créations
    Naudnaud
    Naudnaud
    ecrou argent
    ecrou argent


    Messages : 405
    Date d'inscription : 30/08/2011
    Age : 33
    Localisation : Metabief

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par Naudnaud Jeu 18 Sep - 5:11

    Pourquoi ne pas simplement prendre un arduino mega ?
    niveau entrée/sortie, il en as vraiment beaucoup ^^
    freeman83
    freeman83
    boulon d'argent
    boulon d'argent


    Messages : 1234
    Date d'inscription : 23/06/2012
    Age : 45
    Localisation : Rougiers / Var

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par freeman83 Jeu 18 Sep - 21:31

    problème résolut, je ne vais pas utiliser tx et rx, du coup je vais mettre clock et data en commun avec le premier 74hc595n et j'utilise juste une sortie pour le latch. me reste a faire le montage et les tests, et a faire le code pour cette partie la.
    avatar
    vince62


    Messages : 6
    Date d'inscription : 02/04/2015

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par vince62 Jeu 2 Avr - 18:25

    Bonjour, je cherche à réaliser votre bombe arduino, et je rencontre un problème sur le code "copié dessous", je précise que je n'y connais rien du tous.
    J'ai toujours une erreur avec shiftlcd.h

    Pouvez vous m'expliquer s'il vous plait.

    Code:


    -/*programme bombe airsoft avec compte a rebours
    *contacteurs anti-soulevement et anti ouverture
    *et prise piratage, activation et desactivation par code.
    *programme trouvé sur different sites et modifié par Freeman83
    *merci a PIC-PAC du forum krispies et a lorrio du forum openclassroom
    */

    // Déclaration de la librairie :
    #include <LiquidCrystal.h>
    #include <Keypad.h> // inclusion de la librairie pour clavier matriciel
    #include <ShiftLCD.h>
    ShiftLCD lcd(10, 12, 11);

    /* initialise la librairie en précisant les sorties utilisées
    * Les connexions sont les suivantes :
    * 74HC595 broche 8 connecté a la masse
    * 74HC595 broche 10 connecté au +5v
    * 74HC595 broche 11 connecté a la broche 12 de l'arduino R3
    * 74HC595 broche 12 connecté a la broche 11 de l'arduino R3
    * 74HC595 broche 13 connecté a la masse
    * 74HC595 broche 14 connecté a la broche 10 de l'arduino R3
    * 74HC595 broche 16 connecté au +5v
    * 74HC595 broches 4 et 5 sont deux sorties possibles, broche 9 n'est pas utilisé
    * LCD broche RS connectée à la broche    QH/7 du 74HC595
    * LCD broche Enable connecté à la broche QG/6 du 74HC595
    * LCD broche D4 connectée à la broche    QD/3  du 74HC595
    * LCD broche D5 connectée à la broche    QC/2  du 74HC595
    * LCD broche D6 connectée à la broche    QB/1  du 74HC595
    * LCD broche D7 connectée à la broche    QA/15 du 74HC595
    * LCD broche R/W connectée à la masse
    * LCD broche D0, D1, D2, D3 connecté à la masse
    * Potentiomètre 10K :une broche à +5V l’autre à la masse
    * celle du milieu à la broche LCD VO 
    * clavier broche C4 connectée a la broche 2 
    * clavier broche C3 connectée a la broche 3
    * clavier broche C2 connectée a la broche 4
    * clavier broche C1 connectée a la broche 5
    * clavier broche L4 connectée a la broche A2
    * clavier broche L3 connectée a la broche A3
    * clavier broche L2 connectée a la broche A4
    * clavier broche L1 connectée a la broche A5
    *contacteur couvercle connecté a la broche 6 de l'arduino R3
    *contacteur déplacement connecté a la broche 7 de l'arduino R3
    *clé USB connecté a la broche 8 de l'arduino R3
    *buzzer connecté a la broche 13 de l'arduino R3
    */


    //--- Constantes utilisées avec le clavier 4x4
    const byte LIGNES = 4; // 4 lignes
    const byte COLONNES = 4; //4 colonnes

    //--- Définition des touches 
    char touches[LIGNES][COLONNES] = {
      {'1','2','3','A'},
      {'4','5','6','B'},
      {'7','8','9','C'},
      {'*','0','#','D'}
    };

    int contacteur_couvercle = 6;
    int contacteur_deplacement = 7;
    int cle_usb = 8;
    int speakerpin = 13;
    int L1 = A5;
    int L2 = A4;
    int L3 = A3;
    int L4 = A2;
    int C1 = 5;
    int C2 = 4;
    int C3 = 3;
    int C4 = 2;

    // tableaux de lignes et colonnes
    byte BrochesLignes[LIGNES] = {L1, L2, L3, L4}; //connexions utilisées pour les broches de lignes du clavier
    byte BrochesColonnes[COLONNES] = {C1, C2, C3, C4}; //connexions utilisées pour les broches de colonnes du clavier


    Keypad keypad = Keypad( makeKeymap(touches), BrochesLignes, BrochesColonnes, LIGNES, COLONNES );

    //Defini tous les etats de la bombe 
    #define READY 0
    #define ARMED 1
    #define DISARMED 2
    #define DETONATED 3
    #define speakerPin 13
    int etat1; //etat du contacteur couvercle
    int etat2; //etat du contacteur deplacement
    int etat3; //etat de la cle usb
    int second=30, minute=1, hour=0; // declare time variables
    int bombState=0; //0 = Ready, 1 = Armed, 2 = Disarmed, 3 = detonated
    int repeat=0;//flag to prevent repeat of getArmCode();
    int repeatAdm=0; //flag to prevent repeat of getAadminCode();
    int repeatDisarm=0;//flag to prevent repeat of getDisarmCode();
    int repeatBuzzer=0;//flag to prevent buzzer from running multiple times.
    int repeatTimerEdit=0;//flag to prevent repeat of timer edit function
    int blinkArmed = 0;  // flag for blink text
    int blinkDisarmed = 0;  // flag to blink disarmed msg
    int nbBlinkDisarmed = 6;  // flag for number of blink disarmed msg (real number of blink = nbBlinkDisarmed / 2)
    long previousTime = 0;//holds previous time in ms
    long previousDelay = 0;//holds previous time in ms since buzzer was active
    long interval = 60000;//60 second delay

    char hour_str[4]; // For Convert int in char
    char minute_str[4]; // For Convert int in char
    char second_str[4]; // For Convert int in char
    char timeInt_str[0];  // For Convert int in char
    char newcode_str[0];
    char newarmcode_str[0];
    char newdisarmcode_str[0];


    char ArmCode[] = "123456";//code pour armer la bombe
    char disarmCode[] = "123456";//code pour desarmer la bombe
    char adminCode[] = "AD9514";//code administrateur pour entrer dans le menu

    char ENTER_KEY = '#';
    char CANCEL_KEY = '*';//stores the cancel key variable.
    char timeSetKey = '*';//touche a presser pour entrer le code.



    void setup()
    {lcd.begin(16, 2);
                    lcd.clear();
                    lcd.setCursor(1, 0 );
                    lcd.print( "Bombe  Factice" );
                    lcd.setCursor( 3, 1 );
                    lcd.print( "BY FREEMAN" );
                    delay(3000);
                    lcd.clear();
                    lcd.setCursor( 1, 0 );
                    lcd.print( "Bombe  Factice" );
                    lcd.setCursor( 3, 1 );
                    lcd.print( "GOOD  GAME" );
                    delay(3000);
                    lcd.clear();
                    
      ////backlightOn();
      //blinkCursor();
      //stopVscroll();
      
      pinMode(speakerPin, OUTPUT);//definir l'etat de broche de sortie pour le buzzer
      pinMode(contacteur_couvercle, INPUT); //definir l'etat de la broche pour le contacteur couvercle.
      pinMode(contacteur_deplacement, INPUT); //definir l'etat de la broche pour le contacteur deplacement.
      pinMode(cle_usb, INPUT); //definir l'etat de la broche pour la clé usb.
      
      
    }





    void loop()

    {
       

     switch (bombState) {
    lcd.clear();
                    
        /***********************************************************
         *Ready state prepares bomb, waits for arm code to be input
         *
         ************************************************************/
      case READY:
        int resultOfGetArmCode;
        lcd.clear();
        lcd.setCursor(0, 0 );
        delay(100);
        //showCursor();
        //blinkCursor();

        lcd.print("Enter ArmCode :"); //Notification du statut.
        digitalWrite(speakerPin, HIGH);
        resultOfGetArmCode = getArmCode();

        if (resultOfGetArmCode == 1) {
          lcd.clear();
          lcd.setCursor(0, 0 );
          delay(100);
          lcd.print("Correct");
          delay(500);
          lcd.clear();
          bombState = ARMED; //debut du compte a rebours

        }//Close getArmCode(); = true

        if (resultOfGetArmCode == 0) {  //si le code est faux, l'ecran affiche "incorrect"
          tryAgainMsg();        

       }// Close getArmCode(); = false.

        break;

        /**************************************************
         *Armed state. Countdown starts, waits for pushbutton to be pressed.
         *If button is pressed, wait for code from keypad.
         ***************************************************/

      case ARMED:
        {  
          char disarmKey = keypad.getKey();
          
          
        etat1 = digitalRead(contacteur_couvercle);
        etat2 = digitalRead(contacteur_deplacement);
        etat3 = digitalRead(cle_usb);
         
        
           if (etat3 == LOW) { //si la cle usb est inseré les contacteurs couvercle et deplacement sont consideré comme appuyé
           etat1 = LOW;
           etat2 = LOW;
          }   
              
            if (etat1 == HIGH)
            bombState = DETONATED; //si le contacteur couvercle est relaché la bombe explose
           

           if (etat2 == HIGH)
           bombState = DETONATED; //si le contacteur de deplacement est relaché la bombe explose
             

          if (disarmKey == '#') {
           char reslutOfDisarm;
            lcd.clear();   
            lcd.setCursor(0, 0 );

            delay(100);
            lcd.print("Enter DisarmCode"); //si la touche de desarmement # est pressée, l'utilisateur peux entrer le code.
            reslutOfDisarm = getDisarmCode();

            if (reslutOfDisarm == true) { 
              lcd.clear();
              bombState = DISARMED; //la bombe passe a l'etat desarmé.
              break;
            } //close getDisarmCode(); = True


            if (reslutOfDisarm == false) {
              tryAgainMsg();

              if (second >= 15) {
                second = second - 15;
              }

             else {
                if (minute == 0 && hour == 0) {
                  second=1; //detonate.
                }
                if (minute > 0) {
                  second = 60 - (15 - second);
                  minute = minute - 1;
               }

                if (hour > 0 && minute == 0) {
                  second = 60 - (15 - second);
                  minute = 59;
                  hour = hour - 1 ;
                }
              }    
            } //close getDisarmCode(); = false 
         } //close if

        }
        countdown(); //si la touche de desarmement # n'est pas pressée, continue le compte a rebours.

        break;

        /**************************************************************
         *DISARMED. Counter stopped, displays "bomb disarmed"
         *
         **************************************************************/

      case DISARMED:
        int blinkDisarmFlag;
        blinkDisarmFlag = 0;
        
        //hideCursor();

        for (nbBlinkDisarmed; nbBlinkDisarmed > 0; nbBlinkDisarmed--){  // blink msg
          if (blinkDisarmFlag == 1){ 
            lcd.setCursor(1, 0 );
            lcd.print("BOMBE DESARMEE"); //indique le statut bombe desarmée.
            lcd.setCursor(1, 1 );
            lcd.print("GOOD JOB TEAM");
            delay(5000);
            lcd.clear();
            lcd.setCursor(1, 0 );
            lcd.print("GOOD JOB TEAM"); //bomb has been disarmed, inform user.
            lcd.setCursor(1, 1 );
            lcd.print("BOMBE DESARMEE");
            delay(5000);
          

      asm volatile ("  jmp 0");
           blinkDisarmFlag = 0;
            
          }
          else{
            lcd.clear();
            delay(1000);       
            blinkDisarmFlag = 1;
          }  
        } // end blink
        break;

        /*******************************************************
         *Detonated. activate buzzer for 8 beeps, then 1 long.
         *Print "Have A Nice Day. to LCD.
         ********************************************************/

      case DETONATED:
        if (repeatBuzzer == 0) { //make sure buzzer for loop has not already been run.

          digitalWrite(speakerpin, LOW);//declencher le buzzer
          lcd.clear();
          lcd.setCursor(3, 0 );
          lcd.print("EXPLOSION"); //loop message informing user of bomb detonation.
          //lcd.setCursor(0, 1 );
          //lcd.print("Have A Nice Day"); //loop message informing user of bomb detonation.
          delay(5000);//attendre 5 secondes
          digitalWrite(speakerpin, HIGH);//arreter le buzzer
          repeatBuzzer = 1;//set flag to prevent code from looping again.
        }

        else {
          //lcd.setCursor(0, 0 );
          //lcd.print("EXPLOSION"); //loop message informing user of bomb detonation.
          lcd.setCursor(1, 1 );
          lcd.print("Have A Nice Day"); //loop message informing user of bomb detonation.
          delay(9000);
          

      asm volatile ("  jmp 0");

       }

      }//closes switch
    }//closes loop
    /*void software_Reset()
    {
    }*/
    /***********************************************************
     * Main countdown timer                                     *
     *                 countdown()                              *
     ************************************************************/
    void countdown(){

     static unsigned long lastTick = 0; // set up a local variable to hold the last time we decremented one second
      static unsigned long currentMillis = 0;
      // (static variables are initialized once and keep their values between function calls)

      // decrement one second every 1000 milliseconds
      if (second > 0) {
        if (millis() - lastTick >= 1000) {
          lastTick = millis();
          second--;
          serialOutput();
        }
      }

      // decrement one minute every 60 seconds
      if (minute > 0) {
        if (second <= 0) {
          minute--;
          second = 60; // reset seconds to 60

        }
      }

      // decrement one hour every 60 minutes
      if (hour > 0) {
        if (minute <= 0) {
          hour--;
          minute = 60; // reset minutes to 60
        }//closes if
      }//closes if


      //the code below beeps the siren once every minute.
      currentMillis = millis();
      if (currentMillis - previousTime > interval)
      {
        previousTime = currentMillis;
        previousDelay = currentMillis;

        digitalWrite(speakerPin, LOW);//turn on buzzer
      }

      if (currentMillis - previousDelay > 100) {//100ms chirp duration
        digitalWrite(speakerPin, HIGH);//turn off buzzer
      }
    } //close countdown();


    /***********************************************************************
     *                          getArmCode();                               *
     *  Grabs the code to arm the bomb from the keypad.                     *
     *                                                                      *
     ************************************************************************/
    boolean getArmCode(){
      // returns true when all PW keys are pressed in sequence
      // returns false when number of keys in pW pressed but don't exactly match the PW
      // CANCEL_KEY erases all previous digits input
      int count=0;  // how many keys we have
      int matchCount=0;  // how many keys match
      lcd.setCursor(0, 1 );

      if(repeat == 0){

        for(count=0, matchCount=0; count < sizeof(ArmCode)-1; count++){
          char key;
          char key_str[0];  // Define as string

          do{
            key = keypad.getKey();
            delay (100);
          }
          while(key == '\0');

          key_str[0] = key;
          lcd.print(key_str);

          if (key == timeSetKey && repeatTimerEdit == 0){
    // ***************** MOD HERE *********************   ============> Random codes for arm & disarm    
           timerSet();
            return 2;
         }      

         if(key == ArmCode[count]) {
            matchCount++;
          }

          else if(key == CANCEL_KEY){
            count=0;
            matchCount=0;
            return 0;
          }
        }//close for loop
     }//close repeat flag check

      // here when the same number of keys pressed as characters in the PW
      if(matchCount == count) {
        repeat=1;
        return 1;
      }

      else {
        return 0;
      }
    }//close getArmCode();


    /**********************************************************************
     *                   getDisarmCode();                                  *
     *    Gets disarm code from keypad.                                    *
     *                                                                     *
     ***********************************************************************/
    boolean getDisarmCode(){

      // returns true when all PW keys are pressed in sequence
      // returns false when number of keys in pW pressed but don't exactly match the PW
      // CANCEL_KEY erases all previous digits input

      int count=0;  // how many keys we have
      int matchCount=0;  // how many keys match
      long disarmTime = millis()+9000L;//7000 instead of 15000 b/c of added delays making total 30s

      lcd.setCursor(0, 1 );
      //showCursor();
      //blinkCursor();

      if(repeatDisarm == 0){

        for(count=0, matchCount=0; count < sizeof(disarmCode)-1; count++){
          char key;
          char key_str[0];  // Define as string

          do{
            if(disarmTime < millis()){ //if 15 seconds have passed, bail out
              break;
            }

            key = keypad.getKey();
           delay (100);     
         }
          while(key == '\0');

          key_str[0] = key;
          lcd.print(key_str);

          if(key == disarmCode[count]) {
            matchCount++;
          }

          else if(key == CANCEL_KEY){
            count=0;
            matchCount=0;
            return false;
          }

          if(disarmTime < millis()) {
            return false;
            break;
         }

        }// close for loop
      } //close repeat flag check

        // here when the same number of keys pressed as characters in the PW
      if(matchCount == count) {
        repeatDisarm=1;
        return true;
      }
      else {
        return false;

      }
    }//close getDisarmCode();


    /**********************************************************************
     *                   getAdminCode();                                  *
     *    Gets admin code from keypad.                                    *
     *                                                                     *
     ***********************************************************************/
    boolean getAdminCode(){

      // returns true when all PW keys are pressed in sequence
      // returns false when number of keys in pW pressed but don't exactly match the PW
      // CANCEL_KEY erases all previous digits input

      int count=0;  // how many keys we have
      int matchCount=0;  // how many keys match

      lcd.setCursor(0, 1 );


      for(count=0, matchCount=0; count < sizeof(adminCode)-1; count++){
        char key;
        char key_str[0];  // Define as string

        do{
          key = keypad.getKey();
          delay (100);
        }
        while(key == '\0');

    //    itoa(key, key_str,10);
        key_str[0] = key;
        lcd.print(key_str);
      //  lcd.print(itoa(key, key_str,16));


        if(key == adminCode[count]) {
          matchCount++;
        }

        else if(key == CANCEL_KEY){
          count=0;
          matchCount=0;
          return false;
        }

      }// close for loop

      // here when the same number of keys pressed as characters in the PW
      if(matchCount == count) {
        return true;
      }
      else{
        return false;
      }
      // Do nothing if pwd is false / Parent function send tryAgin msg
    }//close getAdminCode();


    /*********************************************************************
     *                        Timer edit function                         *
     *                                                                    *
     *                                                                    *
     **********************************************************************/
    void timerSet(){
      lcd.clear();
      lcd.print("Enter AdminCode");
      char resultOfGetAdmCode;

      resultOfGetAdmCode = getAdminCode();

      if (resultOfGetAdmCode == true){
        char timeInt;
        char newcode;
        char newarmcode;
        char newdisarmcode;
        char menupage;
        int newadmincode;
        lcd.clear(); 
        lcd.setCursor(0, 0 );
        lcd.print("1.Admin 2.Time");
        lcd.setCursor(0, 1 );
        lcd.print("3.Arm 4.Disarm");
        do{
          menupage = keypad.getKey();
        }
        while(menupage == '\0' || menupage == '*' || menupage == '0' || menupage > 52);
        
        switch(menupage) {
          case '1': // Edit admin code
            lcd.clear();
            lcd.setCursor(0, 0 );
            lcd.print("new admin code :");
            lcd.setCursor(0, 1 );
            do{
               newcode = keypad.getKey();
               delay (100);
            }
           while(newcode == '\0');
           newcode_str[0] = newcode;
           lcd.print(newcode_str);
           adminCode[0] = newcode_str[0];
           newadmincode = (newcode - '0') * 10;//get first digit and convert to int
           do{
           newcode = keypad.getKey();
           delay (100);
            }
            while(newcode == '\0');
            newcode_str[0] = newcode;
            lcd.print(newcode_str);
            adminCode[1] = newcode_str[0];
            newadmincode = (newcode - '0') + newadmincode;//get second digit.
            do{
           newcode = keypad.getKey();
           delay (100);
            }
            while(newcode == '\0');
            newcode_str[0] = newcode;
            lcd.print(newcode_str);
            adminCode[2] = newcode_str[0];
            newadmincode = (newcode - '0') + newadmincode;//get 3rd digit.
            do{
           newcode = keypad.getKey();
           delay (100);
            }
            while(newcode == '\0');
            newcode_str[0] = newcode;
            lcd.print(newcode_str);
            adminCode[3] = newcode_str[0];
            newadmincode = (newcode - '0') + newadmincode;//get 4th digit.
            do{
           newcode = keypad.getKey();
           delay (100);
            }
            while(newcode == '\0');
            newcode_str[0] = newcode;
            lcd.print(newcode_str);
            adminCode[4] = newcode_str[0];
            newadmincode = (newcode - '0') + newadmincode;//get 5th digit.
            do{
           newcode = keypad.getKey();
           delay (100);
            }
            while(newcode == '\0');
            newcode_str[0] = newcode;
            lcd.print(newcode_str);
            adminCode[5] = newcode_str[0];
            newadmincode = (newcode - '0') + newadmincode;//get 6th digit.
          
             //newcode = 'L';
     
            
             lcd.clear();
              
              lcd.setCursor(0, 0 );
              lcd.print("NEW ADMINCODE");
              lcd.setCursor(0, 1 );
              lcd.print(adminCode);
              delay(5000);
              lcd.clear();
            
            break;
            
            case '3': // Edit armcode
            lcd.clear();
            lcd.setCursor(0, 0 );
            lcd.print("new armcode :");
            lcd.setCursor(0, 1 );
            do{
               newarmcode = keypad.getKey();
               delay (100);
            }
           while(newarmcode == '\0');
           newarmcode_str[0] = newarmcode;
           lcd.print(newarmcode_str);
           ArmCode[0] = newarmcode_str[0];
           newarmcode = (newarmcode - '0') * 10;//get first digit and convert to int
           do{
           newarmcode = keypad.getKey();
           delay (100);
            }
            while(newarmcode == '\0');
            newarmcode_str[0] = newarmcode;
            lcd.print(newarmcode_str);
            ArmCode[1] = newarmcode_str[0];
            newarmcode = (newarmcode - '0') + newarmcode;//get second digit.
            do{
           newarmcode = keypad.getKey();delay (100);
            }
            while(newarmcode == '\0');
            newarmcode_str[0] = newarmcode;
            lcd.print(newarmcode_str);
            ArmCode[2] = newarmcode_str[0];
            newarmcode = (newarmcode - '0') + newarmcode;//get 3rd digit.
            do{
           newarmcode = keypad.getKey();
           delay (100);
            }
            while(newarmcode == '\0');
            newarmcode_str[0] = newarmcode;
            lcd.print(newarmcode_str);
            ArmCode[3] = newarmcode_str[0];
            newarmcode = (newarmcode - '0') + newarmcode;//get 4th digit.
            do{
           newarmcode = keypad.getKey();
           delay (100);
            }
            while(newarmcode == '\0');
            newarmcode_str[0] = newarmcode;
            lcd.print(newarmcode_str);
            ArmCode[4] = newarmcode_str[0];
            newarmcode = (newarmcode - '0') + newarmcode;//get 5th digit.
            do{
           newarmcode = keypad.getKey();
           delay (100);
            }
            while(newarmcode == '\0');
            newarmcode_str[0] = newarmcode;
            lcd.print(newarmcode_str);
            ArmCode[5] = newarmcode_str[0];
            newarmcode = (newarmcode - '0') + newarmcode;//get 6th digit.
          
             //newcode = 'L';
     
            
             lcd.clear();
              
              lcd.setCursor(0, 0 );
              lcd.print("NEW ARMCODE");
              lcd.setCursor(0, 1 );
              lcd.print(ArmCode);
              delay(5000);
              lcd.clear();
            
            break;
            
            case '4': // Edit disarmcode
            lcd.clear();
            lcd.setCursor(0, 0 );
            lcd.print("new disarmcode :");
            lcd.setCursor(0, 1 );
            do{
               newdisarmcode = keypad.getKey();
            delay (100);
          }
           while(newdisarmcode == '\0');
           newdisarmcode_str[0] = newdisarmcode;
           lcd.print(newdisarmcode_str);
           disarmCode[0] = newdisarmcode_str[0];
           newdisarmcode = (newdisarmcode - '0') * 10;//get first digit and convert to int
           do{
           newdisarmcode = keypad.getKey();
           delay (100);
            }
            while(newdisarmcode == '\0');
            newdisarmcode_str[0] = newdisarmcode;
            lcd.print(newdisarmcode_str);
            disarmCode[1] = newdisarmcode_str[0];
            newdisarmcode = (newdisarmcode - '0') + newdisarmcode;//get second digit.
            do{
           newdisarmcode = keypad.getKey();
           delay (100);
            }
            while(newdisarmcode == '\0');
            newdisarmcode_str[0] = newdisarmcode;
            lcd.print(newdisarmcode_str);
            disarmCode[2] = newdisarmcode_str[0];
            newdisarmcode = (newdisarmcode - '0') + newdisarmcode;//get 3rd digit.
            do{
           newdisarmcode = keypad.getKey();
           delay (100);
            }
            while(newdisarmcode == '\0');
            newdisarmcode_str[0] = newdisarmcode;
            lcd.print(newdisarmcode_str);
            disarmCode[3] = newdisarmcode_str[0];
            newdisarmcode = (newdisarmcode - '0') + newdisarmcode;//get 4th digit.
            do{
           newdisarmcode = keypad.getKey();
           delay (100);
            }
            while(newdisarmcode == '\0');
            newdisarmcode_str[0] = newdisarmcode;
            lcd.print(newdisarmcode_str);
            disarmCode[4] = newdisarmcode_str[0];
            newdisarmcode = (newdisarmcode - '0') + newdisarmcode;//get 5th digit.
            do{
           newdisarmcode = keypad.getKey();
           delay (100);
            }
            while(newdisarmcode == '\0');
            newdisarmcode_str[0] = newdisarmcode;
            lcd.print(newdisarmcode_str);
            disarmCode[5] = newdisarmcode_str[0];
            newdisarmcode = (newdisarmcode - '0') + newdisarmcode;//get 6th digit.
          
             //newcode = 'L';
     

            lcd.clear();
              
              lcd.setCursor(0, 0 );
              lcd.print("NEW DISARMCODE");
              lcd.setCursor(0, 1 );
              lcd.print(disarmCode);
              delay(5000);
              lcd.clear();
            
            break;
            
          case '2': // Timer
            lcd.clear();
           lcd.print("Enter xx Hours");
            lcd.setCursor(0, 1 );
            do{
               timeInt = keypad.getKey();
            }
            while(timeInt == '\0' || timeInt < '0' || timeInt > '6');
            timeInt_str[0] = timeInt;
            lcd.print(timeInt_str);
      
            hour = (timeInt - '0') * 10;//get first digit and convert to int
            do{
            timeInt = keypad.getKey();
            }
            while(timeInt == '\0');
            timeInt_str[0] = timeInt;
            lcd.print(timeInt_str);
        
            hour = (timeInt - '0') + hour;//get second digit.
            delay(800);
              lcd.clear();
              timeInt = 'L';
              // ------------------------------------------------------------------
              lcd.print("Enter xx Minutes");
              lcd.setCursor(0, 1 );
              do{
                timeInt = keypad.getKey();
              }
              while(timeInt == '\0' || timeInt < '0' || timeInt > '6');
              timeInt_str[0] = timeInt;
              lcd.print(timeInt_str);
          
              while (timeInt < '0' || timeInt > '6'){
                timeInt = keypad.getKey();
              }
              minute = (timeInt - '0') * 10;//get first digit and convert to int
              do{
                timeInt = keypad.getKey();
              }
              while(timeInt == '\0');
              minute = (timeInt - '0') + minute;//get second digit.
              timeInt_str[0] = timeInt;
              lcd.print(timeInt_str);
              delay(800); 
             lcd.clear();
              timeInt = 'L';
              // ------------------------------------------------------------------
              lcd.print("Enter xx Seconds");
              lcd.setCursor(0, 1 );
              do{
                timeInt = keypad.getKey();
              }
              while(timeInt == '\0' || timeInt < '0' || timeInt > '6');
              timeInt_str[0] = timeInt;
              lcd.print(timeInt_str);
          
              while (timeInt < '0' || timeInt > '6'){
                timeInt = keypad.getKey();
              }
              second = (timeInt - '0') * 10;//get first digit and convert to int
              do{
                timeInt = keypad.getKey();
              }
              while(timeInt == '\0');
              second = (timeInt - '0') + second;//get second digit.
              timeInt_str[0] = timeInt;
              lcd.print(timeInt_str);
              delay(800);   
              lcd.clear();
              timeInt = 'L';
              lcd.print("Time set :");
              lcd.setCursor(0, 1 );
              itoa (hour, hour_str, 10);
              itoa (minute, minute_str, 10);
              itoa (second, second_str, 10);
              lcd.print(hour_str);
              lcd.print(":");
              lcd.print(minute_str);
              lcd.print(":");
              lcd.print(second_str);
             delay(2000); 
             // ---------------------- Put randomize here --------------------------
              repeatTimerEdit = 1;
            }//end of getAdminCode == true
          
            if(resultOfGetAdmCode == false){
             tryAgainMsg();
             // Do nothing if pwd is false / Parent function send tryAgin msg
            
           }
            lcd.clear();
          }//end of timer edit function
    }



    /****************************************************************
     *                     serialOutput();                           *
     *    prints the values of the timer over the serial connection  *
     *         and onto the LCD                                      *
     *****************************************************************/
    void serialOutput() {

      
      itoa (hour, hour_str, 10);
      itoa (minute, minute_str, 10);
      itoa (second, second_str, 10);
      

      if(bombState != DISARMED){
      
       lcd.setCursor(0, 0 );
        delay(20);
        if (blinkArmed == 0){
          lcd.print("!!  ARMED    !!");
          blinkArmed=1;
        }
        else {
          lcd.print("!!            !!");
          blinkArmed=0;      
        }
        lcd.setCursor(0, 1 );
        
        lcd.print("Time = ");
        if (hour <=9) {
        lcd.print("0");
        lcd.print(hour_str); // the hour, sent to the screen in decimal format
        }
        else{
        lcd.print(hour_str);
       }
        lcd.print(":"); // a colon between the hour and the minute
        if (minute <=9) {
        lcd.print("0");
        lcd.print(minute_str); // the minute, sent to the screen in decimal format
        }
        else{
        lcd.print(minute_str);
        }
        lcd.print(":"); // a colon between the minute and the second
        if (second <=9) {
        lcd.print("0");
        lcd.print(second_str); // the minute, sent to the screen in decimal format
        }
        else{
          lcd.print(second_str);
        }
        //termination condition
      }
      if (second == 0 && minute == 0 && hour == 0) {
        lcd.clear();
        
        bombState = DETONATED; //clear LCD and set bomb state to "detonated" when timer runs out
      }

      if (bombState == DISARMED) {
        lcd.clear();
     }
    }//close serialOutput();


    void tryAgainMsg(){
      lcd.clear();
      //hideCursor();
      delay(100);       
      lcd.print("T");
      delay(150);
      lcd.print("r");
      delay(150);
      lcd.print("y");
      delay(150);       
      lcd.print(" ");
      delay(150);
      lcd.print("a");
      delay(150);         
     lcd.print("g");
      delay(150);
      lcd.print("a");
      delay(150);         
     lcd.print("i");
      delay(150);
      lcd.print("n");
      delay(150);
      lcd.print(" ");
      delay(150);
      lcd.print("!");
      delay(1000); 
    }

    void incorrectMsg(){
      lcd.clear();
      
      delay(100);       
      lcd.print("I");
      delay(350);
      lcd.print("n");
      delay(350);
      lcd.print("c");
      delay(350);       
      lcd.print("o");
      delay(350);
      lcd.print("r");
      delay(350);         
     lcd.print("r");
      delay(350);
      lcd.print("e");
      delay(350);         
     lcd.print("c");
      delay(350);
      lcd.print("t");
      delay(1000); 
    }
    //END of bomb program.

    freeman83
    freeman83
    boulon d'argent
    boulon d'argent


    Messages : 1234
    Date d'inscription : 23/06/2012
    Age : 45
    Localisation : Rougiers / Var

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par freeman83 Jeu 2 Avr - 23:30

    shift lcd ne marche que dans le cas de l'utilisation d'un 74HC595N pour gerer l'ecran lcd et sous condition d'avoir inclu dans la librairie le repertoire corespondant.
    avatar
    vince62


    Messages : 6
    Date d'inscription : 02/04/2015

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par vince62 Lun 6 Avr - 14:20

    voilà l'erreur que j'obtiens:
    error: expected unqualified-id before '-' token
    avatar
    vince62


    Messages : 6
    Date d'inscription : 02/04/2015

    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par vince62 Mer 8 Avr - 20:10

    Bonsoir, j'ai réussi Very Happy
    Par contre, le buzzer ne fonctionne pas à la fin du temps, j'ai test en direct sur la masse et il sonne en continue "ce qui confirme qu'il est en bon état", la valeur de la résistance peut elle jouer ?

    Contenu sponsorisé


    bombe arduino by freeman83 Empty Re: bombe arduino by freeman83

    Message par Contenu sponsorisé


      La date/heure actuelle est Mar 19 Mar - 5:45