je suis nouveau sur le forum et dans le monde de l'arduino, j'ai donc suivi les cours mais je doit vous avouer que je suis plus manuel qu'intéllectuel donc j'ai pas tout assimilé et certain truc que j'ai pas compris mais malgrès tout je me suis lancé dans un petit projet pour mon équipe sprotive...
je pratique l'airsoft et pour pimenter un peu les parties avec mon equipe j'ai decidé de creer une bombe factice sur base arduino.
donc voila j'ai réalisé la partie electronique, et j'ai trouvé et modifié un code pour gerer le système. donc j'explique. le montage sera dans une mallette possedant un micro swith comme contacteur d'ouverture de couvercle et un autre comme contacteur anti soulèvement( déplacement) et aussi une clé de piratage. le principe est simple il y a un compte a rebours activé/désactivé par code via un clavier 16 touches. si l'équipe adverse ouvre la malette ou la déplace une sirène se déclenche==>fin de partie par contre si l'équipe adverse insert une clé de piratage(clé usb) elle peut aisément ouvrir et déplacer la mallette pour essayer de la désamorcer.
donc mon problème se situe au niveau des contacteurs, le compte a rebours marche nickel et les code fonctionnent impec mais des que je veut activer les contacteurs je n'y arrive pas. j'ai essayé plusieurs manière mais a chaque fois le compte a rebours s'intterompt quelque soit l'état du contacteur(HIGH ou LOW) et quelque soit sont état physique (appuyé ou relaché).
pour le branchement du lcd je passe par un 74hc595n et le clavier est branché en direct ( les broches sont enoncés en début de prog).
pour le branchement des microswitchs je les ais branchés comme dans le tuto, j'ai a coup sur fais une erreur quelque part mais la je sèche et je fais donc humblement appel a vos connaissances, branchement? code? je ne sais pas et je ne trouve pas! si vous pouviez aider le jeune padawan que je suis dans cet univers fantastique qu'est "l'arduino" je vous en serai très reconnaissant.
voici le code utilisé et dans son état actuel
/*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
*/
// 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 :
* 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
* 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 );
//Define all the bomb states
#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 speakerPin = 13;//broche de connection du buzzer.
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( "GOOD GAME" );
delay(3000);
lcd.setCursor( 1, 0 );
lcd.print( "Bombe Factice" );
lcd.setCursor( 3, 1 );
lcd.print( "BY FREEMAN" );
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.
digitalWrite(contacteur_couvercle, LOW); //definir la valeur du contacteur couvercle
digitalWrite(contacteur_deplacement, LOW); //definir la valeur du contacteur de deplacement
digitalWrite(cle_usb, LOW); //definir la valeur de la cle 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 (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 (etat3 == LOW); //si la cle usb est inseré les contacteurs couvercle et deplacement sont consideré comme appuyé
etat1 = LOW;
etat2 = LOW;
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(9000);
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.
On peut déjà dire un grand bravo a celui qui prendra soin de tout lire dans les moindre détails.
Voici déjà les points que je relève après un survole de ton code :
==========
Ligne 138 à 140 : un digitalWrite sur des pin en INPUT, je doute fort que tu ai pu voir ça dans le tuto, que voulais tu faire exactement ?
==========
Ligne 154 : une ligne de code à l’intérieur d'un switch sans être une case précise, c'est une erreur (mais peut être que le compilateur l'accepte plus ou moins)
==========
Ligne 212, 213, 214 : il aurait été préférable de faire ce if AVANT de déclarer la bombe DETONATED parce que là, c'est un peu trop tard
==========
Ligne 204, 208, 211 et peut-être d'autre : très probablement l'orginie de ton problème ... il ne faut JAMAIS mettre de point virgule après un if.
// Ecrire ceci :
if ( a == 2 );
b++;
// Revient au même que écrire ceci :
if ( a == 2 ) {
// Rien;
}
b++;
// Bref, dans tous les cas, b++ est exécuté
==========
Inutile de continuer à lire le reste, supprimer ces ; devrait résoudre ton problème (ou alors, c'est que tu en as plusieurs).
tout d'abord merci de la réponse rapide, j'ai donc procédé au changements,
lignes 138 a 140 supprimés, j'ai voulu initialisé l'état des sortie mais effectivement ce sont des entrée donc inutile, je devais être très fatigué quand j'ai écrit ça.
lignes 204, 208, 211 j'ai supprimé le ;
lignes 212, 213 et 214 je les ai décalé au début et ça marche, quand a la ligne 154 j'ai laissé ça n'a pas l'air de gêner le programme.
le projet fonctionne j'ai plus qu'a faire le montage définitif dans la mallette et voir si je peut rajouter des LED clignotantes pour égayer un peu le tout.
encore une petite question, la sirène que je met est récupéré sur une alarme de fenêtre, (avec son circuit pour la variation de ton)
mais quand je le branche et qu'il se déclenche ça me fait varier l'intensité du rétro-éclairage du LCD, comme quand cela tire trop de jus sur l'alim de l'arduino, pourtant l'alim d'origine de l'alarme est en 4,5V doit-je faire une alim séparée et gerer le tout par un relais ou l'alim de l'arduino suffit?
ok merci de la réponse, je pense que je vais choisir l'option du transistor, plus simple a réalisé et moins encombrant. par contre comment je calcule la valeur du transistor que je doit prendre histoire de ne pas le voir cramer a la première utilisation
La première chose à faire, c'est de mesurer le courant dont tu as besoin.
Donc tu branches directement ta sirène sur le 4.5V avec un ampèremètre en série et tu mesure le courant.
Une fois que tu connais ça, tu prends un transistor capable de faire passer ce courant (en gardant une bonne marge si tu ne veux pas qu'il chauffe) et ça ira
rebonjour, j'ai fini le montage définitif du circuit électronique et j'ai branché la prise usb (récupéré sur une carte mère d'ordi portable)et je me retrouve avec un prob au niveau fonctionnement. je m'explique mon contacteur déplacement fonctionne, celui d'ouverture aussi mais au niveau de la clé usb ca ne fonctionne pas, la bombe passe directement en "état detonated" comme si il me reconnaissait pas la clé usb. lors de mes tests j'ai utilisé un micro switch( bouton poussoir NO) et cela marchait trés bien (je n'avais pas encore la prise usb femelle pour le test). je vous avoue que la je sèche, j'ai testé la prise usb male et femelle le courant passe sans problème, j'ai donc modifié le code sans succès mais comme il fonctionnait avec le micro switch je ne vois pas pourquoi il devrai être modifié, autre hypothèse la resistance soudée a la prise usb gène le passage de l'information? mais j'ai fais comme sur les micros switchs qui eux fonctionnent bien donc je cherche un peut d'aide. merci d'avance.
Une petit photo ou un schéma pour comparer ce que donne ton montage avec le microswitch et avec la clef USB serait bienvenue parce que là, ton problème est tout simplement incompréhensible.
Et surtout, explique nous comment tu t'y ai pris pour raccorder cette prise USB à ton arduino.
alors pour le raccordement de la clé usb j'ai tout simplement branché a l'identique des micro switch c.a.d. un coté a la masse et l'autre sur la sortie 13 comme indiqué dans le programme. pour le câblage de la prise usb j'ai tout simplement soudé un fil pour ponter le + et le - de la prise (1ere et 4eme broche de la prise mâle uniquement) et donc un fil sur la première broche et un autre sur la dernière. de plus comme sur les micro switch j'ai soudé une résistance sur le fil relié a la masse, peut être que la résistance a une valeur trop élevé mais j'ai mis la même que sur les micro switch. c'est donc la que je ne comprend plus le truc. est ce que la clé usb peut être considéré comme un interrupteur? absente circuit ouvert et inséré circuit fermé?
là je sèche et je viens encore de tester ce soir les micro swiths fonctionnent mais pas la clé usb. le code doit-il être modifié?
j'essaie de faire des photos du montage et je les posterais au besoin.
Une clef USB, ça ne se comporte ni comme un circuit ouvert, ni comme un circuit fermé.
A l’intérieur, c'est toute une électronique dont tu ne maitrises pas du tout le comportement.
Ce que tu devrais faire, c'est démonter ta clef (ou une vieille dont tu ne te sert plus) et souder un fil qui fait un court circuit entre les 4 broches de l'USB (VCC, D+, D-, GND).
Coté arduino, il te faudra relier une des broches du port femelle au GND, l'autre à l'arduino avec une pull-up sur 5V.
Lorsque la clef n'est pas branché, l'arduino va donc lire le 5V (HIGH) gràce à la pull-up.
Lorsque la clef sera branchée, le court-circuit que tu auras fais dedans va connecté le GND à l'arduino va lire LOW.
==========
Ou alors, j'ai une autre idée qui permettrait de ne pas modifier la clef mais je ne suis pas sur qu'elle marche...
Dans tous les cas, il faudra modifier le programme car une simple I/O ne fonctionnera pas.
En théorie, en fonctionnement normale, une clef USB consomme du courant et c'est cette consommation qu'il faudrait détecter.
j'ai oublié de dire que ma clé usb mâle c'est en fait le coté usb d'un câble iphone qui était coupé donc en principe ça ne doit rien consommer, je pensait utiliser la clé pour fermer le circuit et donc le passer en low, comme les micro switch qui sont appuyé, le courant passe, (en état low) et quand on ouvre ou que l'on déplace la mallette ils sont relaché et le courant ne passe plus (en état high).
la clé usb servirais de ce fait comme un 3eme interrupteur, absente circuit ouvert (état high), présente circuit fermé(état low).
est-ce possible ou faut-il que je fasse comme tu as dit et que je fasse un pull-up?
Donc si je comprends bien, 2 fils vers la prise USB :
l'un connecté sur une pin INPUT de l'arduino
l'autre connecté sur GND au travers d'une résistance
Mais comment à tu branché ça sur ta prise USB (quels pins ?) et quelle genre de clef utilise tu ?
==========
Au passage, j'en profites pour dire que ce forum ne génère pas d'alerte lors de l'édition d'un message donc si tu ne veux pas à nouveau perdre 3 ou 4 jours à attendre, poste un message à la place de edit.
ok pour le délai j'avais compris mais je suis pas trop pressé je prépare le projet pour septembre. oui effectivement c'est le cas. j'ai soudé un fil sur le premier et le dernier pin de la prise et idem sur la clé qui est une prise usb d'un cable de syncro iphone( qui etait coupé je précise). je suis aussi en train de me demander si la valeur de la résistance n'as pas un effect sur la détection par l'arduino?
ok mon montage n'est pas vraiment correct mais comme j'ai beaucoup de mal a comprendre ce genre de schéma du coup je vois pas trop comment brancher le tout mais si je comprend bien ce que tu veut dire( et a ma pauvre compréhension du schéma) sur mon fil qui est relié à la broche dédié de l'arduino (dans mon cas broche 6,7 et 8) doit être aussi relié a une résistance qui est elle même relié au +5V est-ce bien ça?
bon j'ai modifié mon montage pour faire comme tu l'as dis et j'ai gagné en rapidité de reaction sur les deux switch mais pour la clé ca ne marche pas . et ca ne marche pas non plus si je remplace la clé par un BP .
j'ai tout vérifié, pas de mauvaise connexion sur les éléments, les deux switch fonctionnent, mais pas la clé.
j'avais modifié une ligne de code pour un essai et c'était une erreur de ma part, j'ai remis comme il faut et la clé marche. mais du coup j'ai le micro swith du contacteur déplacement qui ne fonctionne plus, j'inverse les switchs l'un et l'autre fonctionne sur la sortie 6 mais l'un comme l'autre ne fonctionnent pas sur la sortie 7 (est-ce possible qu'elle soit grillé?) j'ai donc essayé sur une autre sortie pour voir (en changeant le pin dans le code bien sur) et ça ne marche pas non plus......erreur dans le code? mais je vois pas où.
donc maintenant j'ai un switch qui marche, une clé qui marche et un switch qui marche pas.je ne comprend plus rien.
je remet ici le code mis a jour. si il y a une erreur dedans ca doit concerner les switchs (ligne 212 à 222)
/*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
*avec un merci a PIC-PAC
*/
// Déclaration de la librairie :
#include <LiquidCrystal.h>
#include <Keypad.h> // inclusion de la librairie pour clavier matriciel
#include <ShiftLCD.h>//inclusion de la librairie pour l'utilisation du shift register 8 bit 74HC595
ShiftLCD lcd(10, 12, 11);//definition des broches pour le lcd
/* 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 speakerPin = 13;//broche de connection du buzzer.
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( "GOOD GAME" );
delay(3000);
lcd.setCursor( 1, 0 );
lcd.print( "Bombe Factice" );
lcd.setCursor( 3, 1 );
lcd.print( "BY FREEMAN" );
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.
Un problème qui revient souvent ... Pas de point virgule après un if !
Ainsi que l'obligation de mettre des accolade dès qu'il y a plus d'une instruction.
D'ailleurs, une bonne pratique consiste à TOUJOURS mettre des accolades (car ça évite ce genre de bug).
Et sinon, pour que ça marche, tu ferais mieux de faire le test de clef USB avant de faire les tests de détonation ...
// Test de clef USB avant les tests de détonnation
if (etat3 == LOW) { // Une accolade ouvrante ICI car 2 instructions
etat1 = LOW;
etat2 = LOW;
} // Une accolade fermante ICI
// Test de détonnation n°1
if (etat1 == HIGH) // Pas de Point virgule ICI
bombState = DETONATED; // Une indentation ICI, ça fait plus propre
// Test de détonnation n°2
if (etat2 == HIGH) // Pas de Point virgule ICI
bombState = DETONATED; // Une indentation ICI, ça fait plus propre
Au passage, j'en profite pour faire une petite citation ...
Bref, deux problèmes que je t'avais déjà évoqué mais que tu n'as pas du tout corrigé.
lorrio a écrit:
Ligne 212, 213, 214 : il aurait été préférable de faire ce if AVANT de déclarer la bombe DETONATED parce que là, c'est un peu trop tard
==========
Ligne 204, 208, 211 et peut-être d'autre : très probablement l'orginie de ton problème ... il ne faut JAMAIS mettre de point virgule après un if.
// Ecrire ceci :
if ( a == 2 );
b++;
// Revient au même que écrire ceci :
if ( a == 2 ) {
// Rien;
}
b++;
// Bref, dans tous les cas, b++ est exécuté
sans vouloir t'offenser si je me suis permis de remettre le code c'est parce que les problèmes que tu mentionnent on étés corrigé suite a ton intervention et le seul truc qu'il me manque d'après ce que tu dis sont les accolades sur la partie de test de la clé usb, ce que je vais m'empresser de rectifier, quand aux test ils attendront demain.
pour faire suite a ce projet, tout est fonctionnel, j'ai même rajouter des bips pour marquer le décompte du temps.
je voulais savoir si je pouvais ajouter un 74hc595n a mon montage pour piloter un ensemble de led et leur appliquer une variation d'intensité, en sachant que j'en ai déja un pour l'écran, et que mes seules sorties encore dispo sont A0,A1 et 1,2(rx et tx)
il m'en faut 3 pour gerer le 74hc595n mais est-ce que je peut mélanger les sorties analogique et numériques, et est-ce que je peut utiliser les sorties RX et/ou TX.
Il est tout a fait possible d'utiliser les pin Analogue en mode digital :
The analog input pins can be used as digital pins, referred to as A0, A1, etc.
Ce qui donne le code suivant :
pinMode(A0, OUTPUT);
digitalWrite(A0, LOW);
Il est aussi possible d'utiliser les pin 0 et 1 mais il ne sera alors plus possible d'utiliser le Serial (chose qui ne devrait pas te déranger car tu as un LCD pour afficher des messages).
ok donc il me suffit de déclarer mes pins pour le second 74hc595n et je peut les utiliser comme n'importe quel pin.
mais pour déclarer mes pins du 74hc595n pour mon lcd je suis passé par un shiftlcd auquel j'ai attribué des pins, pour le second 74hc595n qui va gerer mes leds je ne devrais pas aussi avoir un shift" quelque chose" pour ne pas foutre la pagaille? ou sinon je doit faire comme dans le tuto?
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Retrouvez moi sur mon blog et ma chaine Youtube !