[MAJ] Probleme projet bombe

Bonjour,

Ayant commencé à bidouiller sur un arduino depuis 6 mois, je me suis lancé dans le projet de faire une bombe d’airsoft ( Qui serait équipé d’un arduino UNO, Keypad, d’un écran LCD avec module I2C ainsi que des LEDS et d’un buzzer).

Actuellement je suis à la partie ou je cherche à mettre un son via un buzzer dès que n’importe quel touche de mon keypad est pressé. Mais j’ai beau cherché depuis un moment impossible de trouver…

Je vous remercie d’avance de l’aide que vous pourriez m’apporter.

#include <Keypad.h>
#include <TM1637Display.h>
#include <Wire.h>


const int ROW_NUM = 4; //four rows
const int COLUMN_NUM = 4; //three columns

char keys[ROW_NUM][COLUMN_NUM] = {
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'*','0','#','D'}
};

byte pin_rows[ROW_NUM] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte pin_column[COLUMN_NUM] = {9, 8, 7, 6}; //connect to the column pinouts of the keypad

//byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
//byte pin_column[COLUMN_NUM] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );

int keyNum = 0;
const String password = "5445"; // change your password here
String input_password;


const int CLK = 12; //Set the CLK pin connection to the display Emplacement du LCD
const int DIO = 13; //Set the DIO pin connection to the display Emplacement du LCD
const int SPEAKER = 10; // Emplacement du Buzzer



TM1637Display display(CLK, DIO);  //set up the 4-Digit Display.




void setup()
 {
   
 pinMode(SPEAKER, OUTPUT); // Buzzer - PIN 10
 
 Serial.begin(9600);
 input_password.reserve(32); // maximum input characters is 33, change if needed
 for(int i = 0; i< 3; i++)
 display.setBrightness(5);  //set the diplay to maximum brightness

}


void loop(){

char key = keypad.getKey();
 if(key){
    Serial.println(key);
   if(key=='*'){
     keyNum = 0;
     input_password = ""; // clear input password
    } else if(key == '#') {
     if(password == input_password) {
       Serial.println("Acces Autorise!");
       tone(10,1300);
       delay(300);
       noTone(10);
       delay(500);
       
       // DO YOUR WORK HERE
       
     } else {
       Serial.println("Acces Refuse!");
       keyNum = 0;
     }

     input_password = ""; // clear input password
   } else {
     input_password += key; // append new character to input password string
   
 
{
       keyNum = (keyNum*10) + (int(key)-48);
         }
   }
 }
  
   display.showNumberDec(keyNum);
    

}

Bonjour,

Mets ton code entre balises de code (et tu pourrais en profiter pour formater correctement ton code avec CTRL T).

Il suffit que tu mettes ton son après

 if(key){

Merci beaucoup Kamill de ton aide ! Pour ceux qui veulent voir la réponse :

 if(key){ 
    tone(10,1000);
        delay(10);
        noTone(10);
        delay(10);
  }

Tu pourrais simplement mettre

    tone(SPEAKER,1000,10);

Merci pour cette simplification qui marche à merveille

Bonjour,

J’ai avancé dans mon projet mais j’ai maintenant un autre problème quand je rentre le code j’ai soit le message “0ccès autorisé” ou bien “0ccès refusé”. Si quelqu’un à une solution à m’apporter.
En vous remerciant d’avance.

#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <TM1637Display.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display
const int ROW_NUM = 4; //four rows
const int COLUMN_NUM = 4; //three columns

char keys[ROW_NUM][COLUMN_NUM] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte pin_rows[ROW_NUM] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte pin_column[COLUMN_NUM] = {9, 8, 7, 6}; //connect to the column pinouts of the keypad

//byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
//byte pin_column[COLUMN_NUM] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );

int keyNum = 0;
const String password = "5445"; // change your password here
String input_password;


const int SPEAKER = 10; // Emplacement du Buzzer





 void setup()
  {
   
  pinMode(SPEAKER, OUTPUT); // Buzzer - PIN 10
  pinMode(11, OUTPUT);
  
  Serial.begin(9600);
  input_password.reserve(32); // maximum input characters is 33, change if needed
  for(int i = 0; i< 3; i++)
  lcd.init();  
  lcd.backlight();// initialize the lcd 
 
   // Print a message to the LCD.

  
 
 }
 
 
void loop(){
  
lcd.setCursor(0,0);
lcd.print("Entrez le Code :");

 char key = keypad.getKey();
  if(key){ 
    lcd.setCursor(0,1);
lcd.print(keyNum);
    tone(SPEAKER,1000,10);
  }
     if(key){
     Serial.println(keyNum);
     
    if(key=='*'){
      keyNum = 0;
      input_password = ""; // clear input password
     } else if(key == '#') {
      if(password == input_password) {
        Serial.println("Acces Autorise!");
        keyNum = 0;
        digitalWrite(11,HIGH); // Led verte HIGH
        lcd.setCursor(0,1);
        lcd.print("Acces Autorise!");
        tone(SPEAKER,1300,500);
        
        // DO YOUR WORK HERE
        
      } else {
        Serial.println("Acces Refuse!");
        lcd.setCursor(0,1);
        lcd.print("Acces Refuse!");
        keyNum = 0;
        tone(SPEAKER,70,500);
      }

      input_password = ""; // clear input password
    } else {
      input_password += key; // append new character to input password string
    
  
{
        keyNum = (keyNum*10) + (int(key)-48);
          }
    }
  }
 
lcd.setCursor(0,1);
lcd.print(keyNum);


     
 }
lcd.setCursor(0, 0);

il faut mettre 0,0 pour positionner le LCD au début de la ligne (ici la première)

Dans ton programme tu affiches keynum à la fin de la loop dans tous les cas (y compris après appui sur #).
Donc tu écrases la première lettre de l'affichage "Accès autorisé" ou "Accès refusé".

C'est le problème que je rencontre. Je n'arrive pas à faire en sortie d'afficher le keynum que pendant la saisie du code. Aurais-tu une solution à m'apporter car je bloque mise à part à mettre un delay ce qui retire le keynum pendant le delay.

Il faut afficher après l’appui sur une touche et l’ajout d’un caractère.
Tu peux simplifier ton programme, keynum ne sert à rien, il suffit d’afficher input_password.

void loop() {
  lcd.setCursor(0, 0);
  lcd.print("Entrez le Code :");

  char key = keypad.getKey();
  if (key) {
    Serial.println(key);
    tone(SPEAKER, 1000, 10);
    lcd.setCursor(0, 1);

    if (key == '*') {
      input_password = ""; // clear input password
      lcd.print("                ");
    } else if (key == '#') {
      if (password == input_password) {
        digitalWrite(11, HIGH); // Led verte HIGH
        lcd.print("Acces Autorise!");
        Serial.println("Acces Autorise!");
        tone(SPEAKER, 1300, 500);

        // DO YOUR WORK HERE
      } else {
        lcd.print("Acces Refuse!");
        Serial.println("Acces Refuse!");
        tone(SPEAKER, 70, 500);
      }
      input_password = ""; // clear input password
    } else {
      input_password += key; // append new character to input password string
      lcd.print(input_password);
      for (byte i = input_password.length(); i < 16; i++)
      {
        lcd.setCursor(i, 1);
        lcd.print(' ');   // efface la fin de ligne
      }
      Serial.println(input_password);
    }
  }
}

Merci beaucoup de ton aide Kamill !

Je rencontre de nouveau un problème dans mon projet. J'ai reçu mon nouveau module TM1637 ( 6 Digits / 7 segments ).
J'ai réussit à trouver une bibliothèque pour le compte à rebours "Countimer.h".
Le soucie c'est qu'il ressort la compte à rebours de cette façon "00:59:59" et quand j'essaie de l'afficher sur mon module TM1637 ben ça me ressort "00.00.0-". J'ai beau cherché depuis 2 jours je galère.
Merci de votre aide.

#include "Countimer.h"
#include "TM1637_6D.h"

#define CLK 3 //pins definitions for TM1637 and can be changed to other ports
#define DIO 2

TM1637_6D tm1637_6D(CLK,DIO);

Countimer timer;

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

    // Set up count down timer with 10s and call method onComplete() when timer is complete.
    // 00h:00m:10s
  timer.setCounter(0, 0, 10, timer.COUNT_DOWN, onComplete);

    // Print current time every 1s on serial port by calling method refreshClock().
    timer.setInterval(refreshClock, 1000);

      tm1637_6D.init();
  // You can set the brightness level from 0(darkest) till 7(brightest) or use one
  // of the predefined brightness levels below
  tm1637_6D.set(BRIGHT_TYPICAL);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
}

void refreshClock() {
  Serial.print("Current count time is: ");
    Serial.println(timer.getCurrentTime());
    
     // Array for displaying digits, the first number in the array will be displayed on the right
int8_t ListDisp[6] = {timer.getCurrentTime()};
  // Array for displaying points, the first point in the array will be displayed on the right
int8_t ListDispPoint[6] = {POINT_OFF,POINT_OFF,POINT_ON,POINT_OFF,POINT_ON,POINT_OFF};
  // String for converting millis value to seperate characters in the string
//  String millisstring;
  tm1637_6D.display(ListDisp, ListDispPoint);
  // Execute this loop every 10 milliseconds
  //  delay(10);
  

}

void onComplete() {
  Serial.println("Complete!!!");
}

void loop() {

  
  
  // Run timer
  timer.run();

    // Now timer is running and listening for actions.
    // If you want to start the timer, you have to call start() method.
    if(!timer.isCounterCompleted()) {
      timer.start();
    }
}

Je ne sais pas ce que tu espères de ça

  int8_t ListDisp[6] = {timer.getCurrentTime()};

A mon avis il faudrait plutôt faire ça:

  int8_t ListDisp[6] = {timer.getCurrentHours()/10,timer.getCurrentHours()%10,
                        timer.getCurrentMinutes()/10,timer.getCurrentMinutes()%10,
                        timer.getCurrentSeconds()/10,timer.getCurrentSeconds()%10};

Comme toujours Kamill tu me donne la bonne solution . Tu pense qu’il y’a moyen de mettre les milliseconde car je pense que ça ferais plus réaliste du genre MM:SS:MS

int8_t ListDisp[6] = {timer.getCurrentSeconds()%10, timer.getCurrentSeconds()/10,
                       timer.getCurrentMinutes()%10,timer.getCurrentMinutes()/10,
                      timer.getCurrentHours()%10,timer.getCurrentHours()/10 };

Oui, mais il faut revoir ton programme en utilisant millis() et en gérant le compteur toi même et non avec la librairie Counter.

C'est ce que j'ai essayé de faire mais ça m'affiche de cette façon 59.59.--

int8_t ListDisp[6] = { millis() /10, millis() /10,
                       timer.getCurrentSeconds()%10, timer.getCurrentSeconds()/10,
                       timer.getCurrentMinutes()%10,timer.getCurrentMinutes()/10,};

Il ne faut pas utiliser la librairie Countertimer. Il faut gérer le compteur avec ton programme.

C'est à dire coder un faux compteur avec des delay 10 ?

Tu démarres en calculant millisFin=millis()+duree_desiree

Tu fais un compteur avec compteur=millisFin-millis()

J'ai finalement abandonné l'idée des millisecondes car ça me paraissais compliqué à mettre en place pour peu de réalisme. Merci quand même Kamill car tu m'aide énormément dans mon projet. J'ai avancé dans mon projet. Je souhaiterais savoir si cette étape était faisable. Je voudrais relier 5 câble de cette façon à mon arduino. Je voulais savoir si il était possible que l'arduino puisse m'indiquer si une sortie est bien présent (alimentée). Merci d'avance.