Bonsoir , le code est trop long donc je le met en trois parties :
1ere partie .
/********************************************************************************
**********
* Airsoft C4 Prop by Joshua Burgess
* v2 modify by PIC-PAC
* 13/08/2013
********************************************************************************
***********/
/********************************************************************************
**********
*
* TO DO
* ajouter option fil à couper
********************************************************************************
***********/
#include <Keypad.h>
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
// set up the LCD's number of columns and rows:
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = {A1, A2, A3, A4}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 6, 7}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
//Define all the bomb states
#define READY 0
#define ARMED 1
#define DISARMED 2
#define DETONATED 3
#define speakerPin 2
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 = 2;//pin that the piezo buzzer is connected to.
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 to arm the bomb
char disarmCode[] = "123456";//code to disarm the bomb
char adminCode[] = "123456";//code to change timer
char ENTER_KEY = '#';
char CANCEL_KEY = '*';//stores the cancel key variable.
char timeSetKey = '*';//key to press to set the code.
void setup()
{lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(2, 0 );
lcd.print( "Bombe Factice" );
lcd.setCursor( 3, 1 );
lcd.print( "GOOD GAME" );
delay(2000);
lcd.setCursor( 2, 0 );
lcd.print( "Bombe Factice" );
lcd.setCursor( 3, 1 );
lcd.print( "BY PIC-PAC" );
delay(2000);
lcd.clear();
////backlightOn();
//blinkCursor();
//stopVscroll();
pinMode(speakerPin, OUTPUT);//sets the output pin for the piezo buzzer
}
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 :"); //Notify user of status.
resultOfGetArmCode = getArmCode();
if (resultOfGetArmCode == 1) {
lcd.clear();
lcd.setCursor(0, 0 );
delay(100);
lcd.print("Correct");
delay(500);
lcd.clear();
bombState = ARMED; //Start countdown
}//Close getArmCode(); = true
if (resultOfGetArmCode == 0) { //if code fails print "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();
if (disarmKey == '#') {
char reslutOfDisarm;
lcd.clear();
lcd.setCursor(0, 0 );
delay(100);
lcd.print("Enter DisarmCode"); //if disarm button is pressed, ask user to input code.
reslutOfDisarm = getDisarmCode();
if (reslutOfDisarm == true) {
lcd.clear();
bombState = DISARMED; //and set bombState to disarmed.
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(); //if disarm key has not been pressed, continue countdown.
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(2, 0 );
lcd.print("BOMB DISARMED"); //bomb has been disarmed, inform user.
lcd.setCursor(2, 1 );
lcd.print("GOOD JOB TEAM");
delay(1000);
lcd.setCursor(2, 0 );
lcd.print("GOOD JOB TEAM"); //bomb has been disarmed, inform user.
lcd.setCursor(2, 1 );
lcd.print("BOMB DISARMED");
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, HIGH);//turn on buzzer
lcd.setCursor(0, 0 );
lcd.print("BOOOOOOOOOOOOOOM"); //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);//wait 5 seconds
digitalWrite(speakerPin, LOW);//turn off buzzer
repeatBuzzer = 1;//set flag to prevent code from looping again.
}
else {
//lcd.setCursor(0, 0 );
//lcd.print("BOOOOOOOOOOOOOOM"); //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(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--;
tone(3,4699,100);
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, HIGH);//turn on buzzer
}
if (currentMillis - previousDelay > 100) {//100ms chirp duration
digitalWrite(speakerPin, LOW);//turn off buzzer
}
} //close countdown();