/********* Pleasedontcode.com **********
Pleasedontcode thanks you for automatic code generation! Enjoy your code!
- Terms and Conditions:
You have a non-exclusive, revocable, worldwide, royalty-free license
for personal and commercial use. Attribution is optional; modifications
are allowed, but you're responsible for code maintenance. We're not
liable for any loss or damage. For full terms,
please visit pleasedontcode.com/termsandconditions.
- Project: FakeBomb
- Source Code compiled for: Arduino Uno
- Source Code created on: 2023-12-03 01:29:44
- Source Code generated by: Francesco Alessandro
********* Pleasedontcode.com **********/
/****** SYSTEM REQUIREMENTS *****/
/****** SYSTEM REQUIREMENT 1 *****/
/* Il programma inizia visualizzando una barra di */
/* caricamento sull'LCD. Successivamente deve partire */
/* un timer di 10 minuti e sull'LCD dev'essere */
/* visualizzato "INSERIRE PASSWORD" e nel frattempo */
/* dev'essere riprodotta la "traccia1.mp3" dal */
/* DFPlayerMini. */
/****** SYSTEM REQUIREMENT 2 *****/
/* Attraverso il keypad dev'essere monitorata */
/* l'introduzione di un codice composto da 4 numeri e */
/* finalizzato con carattere #. */
/****** SYSTEM REQUIREMENT 3 *****/
/* Se i 4 numeri sono uguali alla password "5421" */
/* allora deve accendersi il led verde e sull'LCD */
/* deve comparire la scritta "CODICE CORRETTO, BOMBA */
/* DISINNESCATA". Se sbagliato "CODICE SBAGLIATO, */
/* RIPROVA". */
/****** SYSTEM REQUIREMENT 4 *****/
/* Durante il countdown deve lampeggiare il led BLU. */
/* Se il countdown raggiunge 10 secondi allora la */
/* traccia audio "traccia2.mp3" e "traccia3.mp3" */
/* devono essere riprodotte. */
/****** SYSTEM REQUIREMENT 5 *****/
/* Se il countdown termina e non viene inserita la */
/* password giusta allora il led rosso deve */
/* accendersi ad intermittenza e devono essere */
/* riprodotte le tracce mp3 "traccia4.mp3", */
/* "traccia5.mp3" e "traccia6.mp3". */
/****** END SYSTEM REQUIREMENTS *****/
/********* User code review feedback **********
#### Feedback 1 ####
- il countdown deve partire subito all'avvio e non essere dipenden
te dall'inserimento della password
********* User code review feedback **********/
/****** DEFINITION OF LIBRARIES *****/
#include
#include
#include
#include
#include
/****** SYSTEM REQUIREMENTS *****/
const unsigned long TIMER_DURATION = 20000; //10 * 60 * 1000; // 10 minutes in milliseconds
const char PASSWORD[5] = "5421";
const char CORRECT_CODE_MESSAGE[] = "CODICE CORRETTO, BOMBA DISINNESCATA";
const char WRONG_CODE_MESSAGE[] = "CODICE SBAGLIATO, RIPROVA";
const char INSERT_PASSWORD_MESSAGE[] = "INSERIRE PASSWORD";
const char COUNTDOWN_MESSAGE[] = "COUNTDOWN: ";
const char MP3_TRACK1_FOLDER[] = "traccia1.mp3";
const char MP3_TRACK2_FOLDER[] = "traccia2.mp3";
const char MP3_TRACK3_FOLDER[] = "traccia3.mp3";
const char MP3_TRACK4_FOLDER[] = "traccia4.mp3";
const char MP3_TRACK5_FOLDER[] = "traccia5.mp3";
const char MP3_TRACK6_FOLDER[] = "traccia6.mp3";
/***** DEFINITION OF DIGITAL INPUT PINS *****/
const uint8_t pad_Keypad4x4_R1_PIN_D2 = 2;
const uint8_t pad_Keypad4x4_R2_PIN_D3 = 3;
const uint8_t pad_Keypad4x4_R3_PIN_D4 = 4;
const uint8_t pad_Keypad4x4_R4_PIN_D5 = 5;
/***** DEFINITION OF DIGITAL OUTPUT PINS *****/
const uint8_t pad_Keypad4x4_C1_PIN_D6 = 6;
const uint8_t pad_Keypad4x4_C2_PIN_D7 = 7;
const uint8_t pad_Keypad4x4_C3_PIN_D8 = 8;
const uint8_t pad_Keypad4x4_C4_PIN_D9 = 9;
const uint8_t VERDE_LED_PIN_D11 = 11;
const uint8_t ROSSO_LED_PIN_D12 = 12;
const uint8_t BLU_LED_PIN_D10 = 10;
/***** DEFINITION OF Software Serial *****/
const uint8_t mp3_DFPlayerMini_Serial_PIN_SERIAL_TX_A0 = A0;
const uint8_t mp3_DFPlayerMini_Serial_PIN_SERIAL_RX_A1 = A1;
SoftwareSerial mp3_DFPlayerMini_Serial(mp3_DFPlayerMini_Serial_PIN_SERIAL_RX_A1, mp3_DFPlayerMini_Serial_PIN_SERIAL_TX_A0);
/***** DEFINITION OF I2C PINS *****/
const uint8_t lcd_LCD1602I2C_I2C_PIN_SDA_A4 = A4;
const uint8_t lcd_LCD1602I2C_I2C_PIN_SCL_A5 = A5;
const uint8_t lcd_LCD1602I2C_I2C_SLAVE_ADDRESS = 0x27;
const uint8_t KEYPAD4X4_ROWS = 4; //four rows
const uint8_t KEYPAD4X4_COLS = 4; //four columns
char hexaKeys_Keypad4x4[KEYPAD4X4_ROWS][KEYPAD4X4_COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'},
};
/****** DEFINITION OF LIBRARIES CLASS INSTANCES *****/
DFRobotDFPlayerMini mp3Player;
LiquidCrystal_I2C lcd(lcd_LCD1602I2C_I2C_SLAVE_ADDRESS, 20, 4);
Keypad customKeypad = Keypad(makeKeymap(hexaKeys_Keypad4x4),
(byte[]) {pad_Keypad4x4_R1_PIN_D2, pad_Keypad4x4_R2_PIN_D3, pad_Keypad4x4_R3_PIN_D4, pad_Keypad4x4_R4_PIN_D5},
(byte[]) {pad_Keypad4x4_C1_PIN_D6, pad_Keypad4x4_C2_PIN_D7, pad_Keypad4x4_C3_PIN_D8, pad_Keypad4x4_C4_PIN_D9},
KEYPAD4X4_ROWS, KEYPAD4X4_COLS);
bool isPasswordCorrect = false; // Set password as correct initially
bool isCountdownStarted = true; // Start countdown immediately upon startup
unsigned long countdownStartTime = 0;
void setup()
{
Serial.begin(9600);
delay(1000);
Serial.println(TIMER_DURATION);
// put your setup code here, to run once:
pinMode(pad_Keypad4x4_R1_PIN_D2, INPUT_PULLUP);
pinMode(pad_Keypad4x4_R2_PIN_D3, INPUT_PULLUP);
pinMode(pad_Keypad4x4_R3_PIN_D4, INPUT_PULLUP);
pinMode(pad_Keypad4x4_R4_PIN_D5, INPUT_PULLUP);
pinMode(pad_Keypad4x4_C1_PIN_D6, OUTPUT);
pinMode(pad_Keypad4x4_C2_PIN_D7, OUTPUT);
pinMode(pad_Keypad4x4_C3_PIN_D8, OUTPUT);
pinMode(pad_Keypad4x4_C4_PIN_D9, OUTPUT);
pinMode(VERDE_LED_PIN_D11, OUTPUT);
pinMode(ROSSO_LED_PIN_D12, OUTPUT);
pinMode(BLU_LED_PIN_D10, OUTPUT);
mp3_DFPlayerMini_Serial.begin(9600);
mp3Player.begin(mp3_DFPlayerMini_Serial);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Caricamento...");
delay(2000); // Delay for the loading screen
digitalWrite(BLU_LED_PIN_D10, HIGH); // Turn on BLU LED
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(INSERT_PASSWORD_MESSAGE);
mp3Player.volume(10); // Set volume to a reasonable level
mp3Player.playFolder(1, 1); // Play "traccia1.mp3" from folder 1
}
void loop()
{
// put your main code here, to run repeatedly:
char customKey = customKeypad.getKey();
if (customKey)
{
Serial.println(customKey);
if (customKey == '#')
{
if (isPasswordCorrect)
{
digitalWrite(VERDE_LED_PIN_D11, HIGH); // Turn on VERDE LED
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(CORRECT_CODE_MESSAGE);
while(1);
}
else
{
digitalWrite(ROSSO_LED_PIN_D12, HIGH); // Turn on ROSSO LED
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(WRONG_CODE_MESSAGE);
delay(1000);
digitalWrite(ROSSO_LED_PIN_D12, LOW); // Turn off ROSSO LED
mp3Player.enableLoopAll();
mp3Player.playFolder(2, 1); // Play "traccia4.mp3" from folder 2
mp3Player.playFolder(2, 2); // Play "traccia5.mp3" from folder 2
mp3Player.playFolder(2, 3); // Play "traccia6.mp3" from folder 2
while(1);
}
}
else
{
isPasswordCorrect = checkPassword(customKey); // Check if the entered password is correct
}
}
if (!isCountdownStarted && isPasswordCorrect)
{
startCountdown(); // Start the countdown if the password is correct
}
if (isCountdownStarted)
{
unsigned long currentTime = millis();
unsigned long elapsedTime = currentTime - countdownStartTime;
if (elapsedTime >= TIMER_DURATION)
{
countdownFinished(); // Countdown has finished, handle the situation
}
else
{
updateCountdownToLCD(elapsedTime); // Update the countdown on the LCD
}
if (elapsedTime >= (TIMER_DURATION - 10000))
{
playAdditionalTracks(); // Play additional tracks when 10 seconds left in the countdown
}
}
}
bool checkPassword(char customKey)
{
static char enteredPassword[5] = "";
static uint8_t passwordIndex = 0;
if (customKey >= '0' && customKey <= '9')
{
enteredPassword[passwordIndex++] = customKey;
lcd.setCursor(passwordIndex - 1, 0);
lcd.print("*");
if (passwordIndex == 4)
{
enteredPassword[passwordIndex] = '\0'; // Null-terminate the entered password string
passwordIndex = 0; // Reset the password index for future use
Serial.println(enteredPassword);
Serial.println(PASSWORD);
if (strcmp(enteredPassword, PASSWORD) == 0)
{
Serial.println("PSW GIUSTA");
return true; // Password is correct
}
else
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(WRONG_CODE_MESSAGE);
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(INSERT_PASSWORD_MESSAGE);
}
}
}
return false;
}
void startCountdown()
{
isCountdownStarted = true;
countdownStartTime = millis();
}
void updateCountdownToLCD(unsigned long elapsedTime)
{
unsigned long remainingTime = TIMER_DURATION - elapsedTime;
unsigned long minutes = remainingTime / 60000;
unsigned long seconds = (remainingTime % 60000) / 1000;
lcd.setCursor(0, 1);
lcd.print(COUNTDOWN_MESSAGE);
if (minutes < 10)
{
lcd.print("0");
}
lcd.print(minutes);
lcd.print(":");
if (seconds < 10)
{
lcd.print("0");
}
lcd.print(seconds);
// Blink the BLU LED
unsigned long blinkInterval = 500;
if ((elapsedTime / blinkInterval) % 2 == 0)
{
digitalWrite(BLU_LED_PIN_D10, HIGH);
}
else
{
digitalWrite(BLU_LED_PIN_D10, LOW);
}
}
void playAdditionalTracks()
{
mp3Player.playFolder(2, 4); // Play "traccia2.mp3" from folder 2
mp3Player.playFolder(2, 5); // Play "traccia3.mp3" from folder 2
}
void countdownFinished()
{
isCountdownStarted = false;
isPasswordCorrect = false;
countdownStartTime = 0;
digitalWrite(ROSSO_LED_PIN_D12, HIGH); // Turn on ROSSO LED
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(WRONG_CODE_MESSAGE);
delay(1000);
digitalWrite(ROSSO_LED_PIN_D12, LOW); // Turn off ROSSO LED
mp3Player.enableLoopAll();
mp3Player.playFolder(2, 4); // Play "traccia2.mp3" from folder 2
mp3Player.playFolder(2, 5); // Play "traccia3.mp3" from folder 2
mp3Player.playFolder(2, 6); // Play "traccia6.mp3" from folder 2
}