Introduction: Arduino Defuseable Bomb, Perfect for Airsoft Games! (with Timer, LCD, Keypad, Sound and More!)
Hello
This is a project I made a long time ago, but decided to upload anyways, feel free to ask me about it!
The bomb has several features:
- Password input by keypad to arm the bomb
- Timer/count down
- Sound
- Flashy LEDs
- Defusing via the password
- LCD display
- Keypad
- Simple to edit and change
So to get started you would need:
- Arduino
- LCD (I used a 16x2 from sparkfun)
- Potentiometer for the contrast on the LCD
- Keypad (again from sparkfun)
- Jumperwires
- Resistors for the LEDs (I used 330 Ohm)
- Piezo/buzzer
- LEDs
Step 1: Assembly
Connect the components as according to the circuit schematic
Step 2: Upload the Code
Upload the bomb project4 code to your arduino, and add the following libraries: Keypad, Tone, and liquid crystal to your libraries folder in the arduino folder
and now you're ready to use the bomb!
First edit the time in the code, to match your needs, then start the arduino and enter your desired password, then the bomb timer will start, and you can press the * to begin defusing the bomb, if you press a wrong key, pressing # will delete what you've written. If you write a wrong password, or the timer reaches 0, the bomb will "explode"!
Feel free to ask :)

Participated in the
Microcontroller Contest
13 People Made This Project!
- IsiaetteD made it!
- IsiaetteD made it!
- Princess TwilightS made it!
- thebigpanta made it!
- balloonanimaldeadworm made it!
- Daniel AugustoG made it!
- charley242015 made it!
- chichao made it!
- FrankG53 made it!
See 4 More
193 Discussions
5 years ago on Introduction
thank you :D it worked like a charm: https://www.youtube.com/watch?v=5O5KRUmsD6o&feature=youtu.be
Reply 5 years ago on Introduction
Glad you found it useful! Your prop looks great!
Reply 5 years ago on Introduction
Hey, I am having a issue with the LCD screen. When I turn it on nothing is being displayed on the screen, the keypad, LED's and buzzer work fine, when I enter the code and it start counting I am able to enter password again after the * and it is being defused or explode but the LCD screen itself does not display anything. I am including the picture of how the LCD is displayed
Reply 4 years ago
I'm having the same issue
Reply 5 years ago
hi, have you found a solution i have your same problem.....the lcd makes only a long line like in your photos...
Reply 4 years ago
did you find a solution?
Reply 5 years ago on Introduction
do you have Potentiometer for the contrast on the LCD ?
Reply 5 years ago on Introduction
I may found the reason for the LCD to not work correctly.....
The schematics of the LCD does not show which order are the pins, if they are VSS, VDD, VO, RS, RW, E, D0, D1, D2, D3, D4, D5, D6 ,D7, A, K, or other way round... I will Re-solder them and we will see if it helps.
Reply 5 years ago
Hi
Do you have any detailed photos of your wiring ? I'm having some trouble getting this to work
Question 8 days ago
is it possible to run the program via bluetooth or wireless on your phone? that way you can start the game remotely?
Question 1 year ago
It's a stupid question maybe, but where goes the battery ?
Answer 2 months ago
if you hook to a battery, the VIN to battery positive, GND to battery negative.
Put a toggle switch on either wire for on and off control
2 months ago
I need the Arduino code which doesn't let me download it
Reply 2 months ago
/////////////////////////////
// Airsoft Bomb //
// by Malthe Falkenstjerne //
/////////////////////////////
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Tone.h>
#define pound 14
Tone tone1;
int Scount = 12; // count seconds
int Mcount = 10; // count minutes
int Hcount = 0; // count hours
int DefuseTimer = 0; // set timer to 0
long secMillis = 0; // store last time for second add
long interval = 1000; // interval for seconds
char password[4]; // number of characters in our password
int currentLength = 0; //defines which number we are currently writing
int i = 0;
char entered[4];
int ledPin = 4; //red led
int ledPin2 = 3; //yellow led
int ledPin3 = 2; //green led
LiquidCrystal lcd(7,8,10,11,12,13); // the pins we use on the LCD
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] = {5, A5, A4, A2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {A1, A0, A3}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup(){
pinMode(ledPin, OUTPUT); // sets the digital pin as output
pinMode(ledPin2, OUTPUT); // sets the digital pin as output
pinMode(ledPin3, OUTPUT); // sets the digital pin as output
tone1.begin(9);
lcd.begin(16, 2);
Serial.begin(9600);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Enter Code: ");
while (currentLength < 4)
{
lcd.setCursor(currentLength + 6, 1);
lcd.cursor();
char key = keypad.getKey();
key == NO_KEY;
if (key != NO_KEY)
{
if ((key != '*')&&(key != '#'))
{
lcd.print(key);
password[currentLength] = key;
currentLength++;
tone1.play(NOTE_C6, 200);
}
}
}
if (currentLength == 4)
{
delay(500);
lcd.noCursor();
lcd.clear();
lcd.home();
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]);
tone1.play(NOTE_E6, 200);
delay(3000);
lcd.clear();
currentLength = 0;
}
}
void loop()
{
timer();
char key2 = keypad.getKey(); // get the key
if (key2 == '*')
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Code: ");
while (currentLength < 4)
{
timer();
char key2 = keypad.getKey();
if (key2 == '#')
{
currentLength = 0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Code: ");
}
else
if (key2 != NO_KEY)
{
lcd.setCursor(currentLength + 7, 0);
lcd.cursor();
lcd.print(key2);
entered[currentLength] = key2;
currentLength++;
tone1.play(NOTE_C6, 200);
delay(100);
lcd.noCursor();
lcd.setCursor(currentLength + 6, 0);
lcd.print("*");
lcd.setCursor(currentLength + 7, 0);
lcd.cursor();
}
}
if (currentLength == 4)
{
if (entered[0] == password[0] && entered[1] == password[1] && entered[2] == password[2] && entered[3] == password[3])
{
lcd.noCursor();
lcd.clear();
lcd.home();
lcd.print("Bomb Defused");
currentLength = 0;
digitalWrite(ledPin3, HIGH);
delay(2500);
lcd.setCursor(0,1);
lcd.print("Reset the Bomb");
delay(1000000);
}
else
{
lcd.noCursor();
lcd.clear();
lcd.home();
lcd.print("Wrong Password!");
if (Hcount > 0)
{
Hcount = Hcount - 1;
}
if (Mcount > 0)
{
Mcount = Mcount - 59;
}
if (Scount > 0)
{
Scount = Scount - 59;
}
delay(1500);
currentLength = 0;
}
}
}
}
void timer()
{
Serial.print(Scount);
Serial.println();
if (Hcount <= 0)
{
if ( Mcount < 0 )
{
lcd.noCursor();
lcd.clear();
lcd.home();
lcd.print("The Bomb Has ");
lcd.setCursor (0,1);
lcd.print("Exploded!");
while (Mcount < 0)
{
digitalWrite(ledPin, HIGH); // sets the LED on
tone1.play(NOTE_A2, 90);
delay(100);
digitalWrite(ledPin, LOW); // sets the LED off
tone1.play(NOTE_A2, 90);
delay(100);
digitalWrite(ledPin2, HIGH); // sets the LED on
tone1.play(NOTE_A2, 90);
delay(100);
digitalWrite(ledPin2, LOW); // sets the LED off
tone1.play(NOTE_A2, 90);
delay(100);
digitalWrite(ledPin3, HIGH); // sets the LED on
tone1.play(NOTE_A2, 90);
delay(100);
digitalWrite(ledPin3, LOW); // sets the LED off
tone1.play(NOTE_A2, 90);
delay(100);
}
}
}
lcd.setCursor (0,1); // sets cursor to 2nd line
lcd.print ("Timer:");
if (Hcount >= 10)
{
lcd.setCursor (7,1);
lcd.print (Hcount);
}
if (Hcount < 10)
{
lcd.setCursor (7,1);
lcd.write ("0");
lcd.setCursor (8,1);
lcd.print (Hcount);
}
lcd.print (":");
if (Mcount >= 10)
{
lcd.setCursor (10,1);
lcd.print (Mcount);
}
if (Mcount < 10)
{
lcd.setCursor (10,1);
lcd.write ("0");
lcd.setCursor (11,1);
lcd.print (Mcount);
}
lcd.print (":");
if (Scount >= 10)
{
lcd.setCursor (13,1);
lcd.print (Scount);
}
if (Scount < 10)
{
lcd.setCursor (13,1);
lcd.write ("0");
lcd.setCursor (14,1);
lcd.print (Scount);
}
if (Hcount <0)
{
Hcount = 0;
}
if (Mcount <0)
{
Hcount --;
Mcount = 59;
}
if (Scount <1) // if 60 do this operation
{
Mcount --; // add 1 to Mcount
Scount = 59; // reset Scount
}
if (Scount > 0) // do this oper. 59 times
{
unsigned long currentMillis = millis();
if(currentMillis - secMillis > interval)
{
tone1.play(NOTE_G5, 200);
secMillis = currentMillis;
Scount --; // add 1 to Scount
digitalWrite(ledPin2, HIGH); // sets the LED on
delay(10); // waits for a second
digitalWrite(ledPin2, LOW); // sets the LED off
delay(10); // waits for a second
//lcd.clear();
}
}
}
Question 2 months ago on Introduction
I figured it out, code and all. Everything works with I2C LCD ... Thanks
Question 9 months ago
hi,
I cant make the sound working
thanks
Question 1 year ago
Hello! I wanted to ask if i can use any other LCD or does it have to be from sparkfun? Thank you!
4 years ago
Cool i fixed it with a 4x4 Keypad. I needed to change the code. Below is the code:
Also i added a image of the pin on the keypad.
//replace these lines in the code when u have a 4x4 instead of 3x4 keypad.
//and add a cable to pin 6 which is pin 1 on the keypad.
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {A0, 5, A1, A2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {A3, A4, A5, 6}; //connect to the column pinouts of the keypad
//Pins 8, 7, 6, 5 on the keypad should be connected to digital pins A0, 5, A1, A2 on //the Arduino.
//Pins 4, 3, 2, 1 on the keypad should be connected to digital pins A3, A4, A5, 6 on //the Arduino.
Reply 1 year ago
You, sir, are a life saver. Thank you very much!
Reply 3 years ago
can you please upload the full code you use, i also have a 4x4 keypad and im having issues to verify the code, you realy help me