Hello everybody,
First of all I’ve got to say that I’ve never used Arduino and I’m totally green in terms of programming, but I’m very interested in this project, I’m an airsoft player and I’ve been looking for a timed bomb for a long time.
Bassically, what the bomb should do is this:
-When you turn up the power, the device asks you for a password, that will be set as the defuse password. When you enter it, the count down starts.
-The detonation timing should be in the code, so players can’t change it.
-Then bomb asks you for the defuse password.
-If you enter the right password before the time is out, bomb tells “DEFUSED” or somethign like that and then restarts itself.
-If time count gets to 0, a relay is activated(This in turn activates a horn) during 15 seconds or so and then the device restarts itself.
I’ve found a project that suits my requirements: http://www.instructables.com/id/Prop-bomb (You can see I commented there)
Then, after investigating a bit more, in that same post, I found a link that drove me to this code:
/*Airsoft TIMER
Version 1.5
Creators:
Chase Cooley
Joey Meyer
Turned into usable code, 6/16/2011:
Matt Falcon*/
//#define DEBUG
//#include "DebugUtils.h"
#include <Keypad.h>
#include <LiquidCrystal.h>
#define pound 14
#define LED_RED 6
#define LED_GREEN 5
#define KP_ROWS 3
#define KP_COLS 4
unsigned int timerSeconds = 300; // start with 5 minutes on the clock
byte password[4];
byte entered[4];
int currentLength = 0;
byte i = 0;
LiquidCrystal lcd(8,7, 10, 11, 12, 13);
//Keypad
char keys[KP_ROWS][KP_COLS] = {
{
'1', '2', '3', '4' }
, {
'5', '6', '7', '8' }
, {
'*', '9', '0', '#' }
};
byte rowPins[KP_ROWS] = {
2,14,15}; //connect to the row pinouts of the keypad
byte colPins[KP_COLS] = {
19,18,17,16 }; //connect to the column pinouts of the keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KP_ROWS, KP_COLS);
char key;
//LCD setup
void setup() {
Serial.begin(9600);
pinMode(LED_RED, OUTPUT); // sets the digital pin as output
pinMode(LED_GREEN, OUTPUT); // sets the digital pin as output
lcd.begin(16, 2);
lcd.print("Enter Code: ");
lcd.cursor();
lcd.setCursor(6, 1);
while (currentLength < 4) {
key = keypad.getKey();
if (key != NO_KEY) {
lcd.print(key);
password[currentLength] = key;
currentLength++;
lcd.setCursor(currentLength + 6, 1);
}
else delay(10);
}
lcd.noCursor();
lcd.clear();
lcd.print("You've Entered: ");
lcd.setCursor(6, 1);
lcd.print(password[0]);
lcd.print(password[1]);
lcd.print(password[2]);
lcd.print(password[3]);
delay(2500);
lcd.clear();
currentLength = 0;
}
void loop() {
lcd.clear();
lcd.print("Enter Code: ");
lcd.cursor();
key = keypad.getKey(); // get the key once per this loop
if (key != NO_KEY) {
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(6, 1);
while (currentLength < 4) {
// here, we take the key that broke us into this "if" statement, instead of discarding it. this also pauses the timer, effectively.
if (key != NO_KEY)
{ // redundant for the first loop, but necessary for every next character
lcd.setCursor(currentLength + 5, 1);
lcd.print(key);
entered[currentLength] = key;
currentLength++;
}
else delay(10);
key = keypad.getKey(); // get the key every time "while" loops
}
if (memcmp(entered,password,4) == 0) { // shortcut to compare an array of bytes, use memcmp(A, B, length), will return 0 if match.
lcd.noCursor();
lcd.clear();
lcd.print(" Defused ");
tone(9,1200, 4000); //
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Bomb Rebooting");
lcd.setCursor(0,1 );
lcd.print("Have a nice day!");
currentLength = 0;
delay(4000); // hold that on screen for 2.5 seconds
lcd.clear();
currentLength = 0;
setup();
}
else {
lcd.noCursor();
lcd.clear();
lcd.print(" Wrong ");
tone(9,110, 2500);
lcd.setCursor(0, 1);
lcd.print("Penalty -2:00"); // Display time penalty
if (timerSeconds > 120) timerSeconds -= 120;
else timerSeconds = 1; // will trigger BOOM next cycle
currentLength = 0;
delay(2500); // hold that on screen for 2.5 seconds
lcd.clear();
}
}
timer(); // prints current time on screen, checks for "go off" time, holds loop for 1 second
}
void timer() {
lcd.setCursor(0, 1); // sets cursor to 2nd line
lcd.print("Timer: ");
lcd.print(timerSeconds / 60); // integer number of minutes on clock
lcd.print(":");
lcd.print(timerSeconds % 60); // mod 60; gives us number of seconds outside of 60sec/min
delay(950); // hold us here for 0.950 seconds
{
digitalWrite(LED_RED,!digitalRead(LED_RED)); // toggle the green LED once a second
}
tone(9,800, 250); // play bleep for 50ms
delay(50); // and there's the rest of that 1 second (not counting LCD delay)
timerSeconds--;
if (timerSeconds == 0) bombomb();
}
void bombomb() {
// routine for making ze BOMB GOEZ OFF!!!1 :D
lcd.noCursor();
lcd.clear();
lcd.print(" !BoOo0o0o0om! ");
lcd.setCursor(0, 1);
lcd.print("you LoSe Sucker!");
tone(9,110, 100);
digitalWrite(LED_RED, HIGH); // sets the red LED on
delay(500); // waits half a second
tone(9,110, 100);
delay(500); // waits half a second
digitalWrite(LED_RED, LOW); // sets the red LED off
digitalWrite(LED_GREEN, HIGH); // sets the green LED on
tone(9,110, 100);
delay(500); // waits half a second
digitalWrite(LED_RED, HIGH); // sets the red LED on
digitalWrite(LED_GREEN, LOW); // sets the green LED off
tone(9,110, 100);
delay(500); // waits half a second
digitalWrite(LED_RED, LOW); // sets the red LED off
digitalWrite(LED_GREEN, HIGH); // sets the green LED on
tone(9,110, 100);
delay(500); // waits half a second
key = NO_KEY; // enter the while() loop, otherwise it'll skip. i could use do { } while();, but I'm lazy.
{
while (key == NO_KEY) {
key = keypad.getKey();
if (key == '#')
{
lcd.clear();
lcd.print("Resetting:");
lcd.setCursor(6,1);
lcd.print("the Bomb!");
delay(3000); // 3 sec delay
void (*softReset) (void) = 0; //declare reset function @ address 0
softReset();
//timerSeconds = 300; // put 5 minutes on the clock
// and we break the loop and go back to timer.
}
else key = NO_KEY; // continue looking for pound key
}
}
}
Could you tell me if this new code is right or wrong? If it is right, what pins Am I suposed to connect to the to the keypad and the LCD display? The same as in the original project postes on Instructables? I’ll be using the same hardware setup.
Thanks everybody, and sorry for my poor english.