//Simulazione di una giubbetto esplosito solo ed esclusivamente per il Softair
//Softair è una gioco di simulazione di giochi di guerra e/o tattica
//dove al suo interno possono esserci specialità come cartografia, orientiring ect.
//il Softair è un GIOCO
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); //Cambiare in caso si utilizzi un altro display
#define pinTone 10 //Definisco pin del buzzer
#define trigPin 2
#define echoPin 0
#define disarmo_prossimita A6
int intPressione = 11; //Definisco pin del pulsante uomo morto
int filovelocizzatempo1 = A0; //Definisco pin 1° filo anti-manomissione
int filovelocizzatempo = 13; //Definisco pin 2° filo anti-manomissione
int filomorte = 12; //Definisco pin filo esplosione
int cancella_codice_disarmo = 0; //Definisco e imposto variabile cancella codice disarmo
bool tipo_int_rilascio = false; //Definisco variabile per tipologia pulsante uomo morto 1 - Dimezzo tempo 2 - Pulsante uomo morto
bool intRilascio = false; //Definisco e imposto variabile interuttore rilascio uomo morto
bool filovelocizzatempo_bool = true; //Definisco e imposto variabile filo velocizza tempo
bool filovelocizzatempo1_bool = true; //Definisco e imposto variabile 2° filo velocizza tempo
bool filomorte_bool = true; //Definisco e imposto variabile filo esplosione
bool abilita_prossimita = true;
String distanza_prossimita = "";
int Hours = 00; //Definisco ed imposto variabile Ora
int Minutes = 00; //Definisco ed imposto variabile Minuti
int Seconds = 00; //Definisco ed imposto variabile Secondi
int trycount = 0; //Definisco ed imposto variabile riprova inserimento
int keycount = 0; //Definisco ed imposto variabile conteggio pressione tasto
int i = 0;
//const int relayPin = 2;
int redled = A2; //Definisco pin Led Rosso
int yellowled = A1; //Definisco pin Led Giallo
int greenled = A3; //Definisco pin Led Verde
int hourstenscode;
int hoursonescode;
int mintenscode;
int minonescode;
int sectenscode;
int seconescode;
long tempmillis = 0;
long temp_lampeggio = 500;
long secMillis = 0;
long previousMillis = 0;
long interval = 1000;
long interval_led = 200;
long durata, distanza;
char password[4];
char entered[4];
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //1,2,3,4 per keypad nero 4x3
byte colPins[COLS] = {5, 4, 3}; //5,6,7 per keypad nero 4x3
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void(* Riavvia)(void) = 0;
void setup() {
pinMode(redled, OUTPUT);
pinMode(yellowled, OUTPUT);
pinMode(greenled, OUTPUT);
//pinMode(relayPin, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(intPressione, INPUT);
pinMode(filovelocizzatempo, INPUT);
pinMode(filovelocizzatempo1, INPUT);
pinMode(filomorte, INPUT);
digitalWrite(redled,HIGH);
digitalWrite(yellowled,HIGH);
digitalWrite(greenled,HIGH);
lcd.init();
//lcd.begin();
lcd.backlight();
Serial.begin(9600);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("*** CODE DISARM! ***");
lcd.setCursor(0, 1);
lcd.print("codice 4 cifre:");
while (keycount < 4)
{
lcd.setCursor(keycount + 16, 1);
lcd.blink();
char armcode = keypad.getKey();
armcode == NO_KEY;
if (armcode != NO_KEY)
{
if ((armcode != '*') && (armcode != '#'))
{
lcd.print(armcode);
tone(pinTone, 5000, 100);
password[keycount] = armcode;
keycount++;
}
}
}
if (keycount == 4)
{
delay(500);
lcd.noBlink();
lcd.clear();
lcd.home();
lcd.print("Codice disarmo: ");
lcd.setCursor(16, 0);
lcd.print(password[0]);
lcd.print(password[1]);
lcd.print(password[2]);
lcd.print(password[3]);
Serial.print("Codice disarmo: ");
Serial.println(String(password[0]) + String(password[1]) + String(password[2]) + String(password[3]));
delay(3000);
lcd.clear();
}
lcd.setCursor(0, 0);
lcd.print("*** COUNTDOWN! ****");
lcd.setCursor(0, 1);
lcd.print("Set(h:m:s): : : ");
keycount = 5;
ricarica_tempo:
while (keycount == 5)
{
char hourstens = keypad.getKey();
lcd.setCursor(12, 1);
lcd.blink();
if (hourstens >= '0' && hourstens <= '5')
{
hourstenscode = hourstens - '0';
tone(pinTone, 5000, 100);
lcd.print(hourstens);
keycount++;
}
}
ricarica_tempo1:
while (keycount == 6)
{
char hoursones = keypad.getKey();
lcd.setCursor(13, 1);
lcd.blink();
if (hoursones == '*'){
tone(pinTone, 5000, 100);
lcd.setCursor(12,1);
lcd.print(" ");
keycount--;
goto ricarica_tempo;
}
if (hoursones >= '0' && hoursones <= '9')
{
hoursonescode = hoursones - '0';
tone(pinTone, 5000, 100);
lcd.print(hoursones);
keycount++;
}
}
ricarica_tempo2:
while (keycount == 7)
{
char mintens = keypad.getKey();
lcd.setCursor(15, 1);
lcd.blink();
if (mintens == '*'){
tone(pinTone, 5000, 100);
lcd.setCursor(13,1);
lcd.print(" ");
keycount--;
goto ricarica_tempo1;
}
if (mintens >= '0' && mintens <= '5')
{
mintenscode = mintens - '0';
tone(pinTone, 5000, 100);
lcd.print(mintens);
keycount++;
}
}
while (keycount == 8)
{
char minones = keypad.getKey();
lcd.setCursor(16, 1);
lcd.blink();
if (minones == '*'){
tone(pinTone, 5000, 100);
lcd.setCursor(15,1);
lcd.print(" ");
keycount--;
goto ricarica_tempo2;
}
if (minones >= '0' && minones <= '9')
{
minonescode = minones - '0';
tone(pinTone, 5000, 100);
lcd.print(minones);
keycount++;
}
}
ricarica_tempo3:
while (keycount == 9)
{
char sectens = keypad.getKey();
lcd.setCursor(18, 1);
lcd.blink();
if (sectens == '*'){
tone(pinTone, 5000, 100);
lcd.setCursor(16,1);
lcd.print(" ");
keycount--;
goto ricarica_tempo2;
}
if (sectens >= '0' && sectens <= '5')
{
sectenscode = sectens - '0';
tone(pinTone, 5000, 100);
lcd.print(sectens);
keycount = 10;
}
}
while (keycount == 10)
{
char secones = keypad.getKey();
lcd.setCursor(19, 1);
lcd.blink();
if (secones == '*'){
tone(pinTone, 5000, 100);
lcd.setCursor(18,1);
lcd.print(" ");
keycount--;
goto ricarica_tempo3;
}
if (secones >= '0' && secones <= '9')
{
seconescode = secones - '0';
tone(pinTone, 5000, 100);
lcd.print(secones);
keycount = 11;
}
}
if (keycount == 11);
{
Hours = (hourstenscode * 10) + hoursonescode;
Minutes = (mintenscode * 10) + minonescode;
Seconds = (sectenscode * 10) + seconescode;
delay(100);
lcd.noBlink();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Timer a:");
Serial.print("Timer impostato a: ");
if (Hours >= 10)
{
lcd.setCursor (9, 0);
lcd.print(Hours);
Serial.print(Hours);
}
if (Hours < 10)
{
lcd.setCursor (9, 0);
lcd.print("0");
lcd.setCursor (10, 0);
lcd.print(Hours);
Serial.print("0" + String(Hours));
}
lcd.print (":");
Serial.print(":");
if (Minutes >= 10)
{
lcd.setCursor (12, 0);
lcd.print (Minutes);
Serial.print(Minutes);
}
if (Minutes < 10)
{
lcd.setCursor (12, 0);
lcd.print("0");
lcd.setCursor (13, 0);
lcd.print (Minutes);
Serial.print("0" + String(Minutes));
}
lcd.print (":");
Serial.print(":");
if (Seconds >= 10)
{
lcd.setCursor (15, 0);
lcd.print(Seconds);
Serial.println(Seconds);
}
if (Seconds < 10)
{
lcd.setCursor (15, 0);
lcd.print("0");
lcd.setCursor (16, 0);
lcd.print(Seconds);
Serial.println("0" + String(Seconds));
}
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Seleziona modalita'");
lcd.setCursor(0,1);
lcd.print("pulsante:");
keycount = 12;
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("1 Dimezza tempo");
lcd.setCursor(0,1);
lcd.print("2 Uomo morto");
}
while (keycount == 12){
char key_uomo_morto = keypad.getKey();
key_uomo_morto == NO_KEY;
if (key_uomo_morto >= '0' && key_uomo_morto <= '9') {
if (key_uomo_morto == '1') {
tipo_int_rilascio = true;
tone(pinTone, 5000, 100);
keycount = 13;
}
if (key_uomo_morto == '2') {
tipo_int_rilascio = false;
tone(pinTone, 5000, 100);
keycount = 13;
}
}
}
delay(50);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("*MODALITA PULSANTE!*");
Serial.print("Modalità pulsante: ");
lcd.setCursor(0,1);
if (tipo_int_rilascio == false) {
lcd.print("UOMO MORTO");
Serial.println("Uomo morto");
} else {
lcd.print("DIMEZZA TEMPO");
Serial.println("Dimezza tempo");
}
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Abilita sensore di");
lcd.setCursor(0,1);
lcd.print("prossimita");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("1 Abilita");
lcd.setCursor(0,1);
lcd.print("2 Disabilita");
while (keycount == 13){
char key_prossimita = keypad.getKey();
key_prossimita == NO_KEY;
if (key_prossimita >= '0' && key_prossimita <= '9') {
if (key_prossimita == '1') {
abilita_prossimita = true;
tone(pinTone, 5000, 100);
keycount = 14;
}
if (key_prossimita == '2') {
abilita_prossimita = false;
tone(pinTone, 5000, 100);
keycount = 14;
}
}
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("*SENSORE PROSSIMITA*");
Serial.print("Sensore di porssimità: ");
lcd.setCursor(0,1);
if (abilita_prossimita == false) {
lcd.print("Disabilitto");
Serial.print("Disabilitato");
keycount = 16;
delay(2000);
} else {
lcd.print("Abilitato");
Serial.print("Abilitato");
delay(2000);
ricarica_distanza:
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Imp distanza sensore");
lcd.setCursor(0,1);
lcd.print("prossimita (cm):");
while (keycount <= 15){
lcd.setCursor(keycount + 3, 1);
lcd.blink();
char key_distanza = keypad.getKey();
key_distanza == NO_KEY;
if (key_distanza == '*') {
distanza_prossimita = "";
keycount--;
goto ricarica_distanza;
}
if (key_distanza >= '0' && key_distanza <= '9') {
distanza_prossimita = distanza_prossimita + String(key_distanza - '0');
lcd.print(key_distanza);
tone(pinTone, 5000, 100);
keycount++;
}
}
}
delay(50);
if (abilita_prossimita == true) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("* DISTANZA STIMATA *");
Serial.print(" e impostato a: ");
lcd.setCursor(7,1);
lcd.print(distanza_prossimita);
Serial.println(distanza_prossimita + " cm");
lcd.setCursor(11,1);
lcd.print("cm.");
delay(2000);
}
lcd.noBlink();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Premi # per avviare!");
delay(50);
while (keycount == 16)
{
char armkey = keypad.getKey();
if (armkey == '#')
{
tone(pinTone, 5000, 100);
delay(50);
tone(pinTone, 0, 100);
delay(50);
tone(pinTone, 5000, 100);
delay(50);
tone(pinTone, 0, 100);
delay(50);
tone(pinTone, 5000, 100);
delay(50);
tone(pinTone, 0, 100);
lcd.clear();
lcd.print ("*** BOMBA ARMATA ***");
lcd.setCursor(0, 1);
lcd.print("Avvio Countdown");
delay(3000);
lcd.clear();
keycount = 0;
digitalWrite(greenled, LOW);
}
}
}
void loop() {
timer();
lampeggio_led(temp_lampeggio);
pulsante_fili();
trigger_prossimita();
char disarmcode = keypad.getKey();
//if (disarmcode == '*') {
tone(pinTone, 5000, 100);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Codice: ");
while (keycount < 4) {
timer();
lampeggio_led(temp_lampeggio);
pulsante_fili();
trigger_prossimita();
if (abilita_prossimita == true) {
if (analogRead(A6) == 0) {
if (distanza > distanza_prossimita.toInt()) {
timedeath();
}
}
}
char disarmcode = keypad.getKey();
if (disarmcode == '*') {
tone(pinTone, 5000, 100);
keycount = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Codice: ");
if (cancella_codice_disarmo <= 1){
dimezzaTempo();
cancella_codice_disarmo++;
} else if (cancella_codice_disarmo > 1){
velocizzaTempo();
}
} else if (disarmcode != NO_KEY) {
digitalWrite(greenled, LOW);
lcd.setCursor(keycount + 7, 0);
lcd.blink();
lcd.print(disarmcode);
entered[keycount] = disarmcode;
keycount++;
tone(pinTone, 5000, 100);
delay(100);
lcd.noBlink();
lcd.setCursor(keycount + 6, 0);
lcd.print("*");
lcd.setCursor(keycount + 7, 0);
lcd.blink();
char disarmcode = keypad.getKey();
if (disarmcode == '*') {
tone(pinTone, 5000, 100);
keycount = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Codice: ");
if (cancella_codice_disarmo <= 1){
dimezzaTempo();
cancella_codice_disarmo++;
} else if (cancella_codice_disarmo > 1){
velocizzaTempo();
}
} else if (disarmcode != NO_KEY) {
lcd.setCursor(keycount + 7, 0);
lcd.blink();
lcd.print(disarmcode);
entered[keycount] = disarmcode;
keycount++;
tone(pinTone, 5000, 100);
delay(100);
lcd.noBlink();
lcd.setCursor(keycount + 6, 0);
lcd.print("*");
lcd.setCursor(keycount + 7, 0);
lcd.blink();
}
}
}
if (keycount == 4) {
if (entered[0] == password[0] && entered[1] == password[1] && entered[2] == password[2] && entered[3] == password[3]) {
lcd.noBlink();
lcd.clear();
lcd.home();
lcd.setCursor(0,0);
lcd.print("***** Ordigno ******");
lcd.setCursor(0, 1);
lcd.print("*** Disinnescato ***");
keycount = 0;
digitalWrite(greenled, LOW);
digitalWrite(redled, HIGH);
digitalWrite(yellowled, HIGH);
delay(10000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Reset bomba");
lcd.setCursor(0,1);
lcd.print("in corso.. 5 sec");
delay(5000);
Riavvia();
}
else {
lcd.noBlink();
lcd.clear();
lcd.home();
lcd.print("codice errato!");
trycount++;
dimezzaTempo();
if (trycount == 2) {
velocizzaTempo();
}
if (trycount == 3) {
timedeath();
}
delay(1000);
keycount = 0;
}
}
//}
}
void timedeath() {
Minutes = Minutes - 59;
Hours = Hours - 59;
Seconds = Seconds - 59;
}
void velocizzaTempo() {
interval = interval / 10;
}
void dimezzaTempo() {
if (Hours > 0) {
Hours = Hours / 2;
}
if (Minutes > 0) {
Minutes = Minutes / 2;
}
if (Seconds > 0){
Seconds = Seconds / 2;
}
}
void timer()
{
//Serial.print(Seconds);
//Serial.println();
if (Hours <= 0)
{
if ( Minutes < 0 )
{
lcd.noBlink();
lcd.clear();
lcd.home();
lcd.setCursor(0,0);
lcd.print("***** Ordigno ******");
lcd.setCursor (0, 1);
lcd.print("***** Esploso! *****");
tone(pinTone, 7000, 5000);
digitalWrite(redled, LOW);
digitalWrite(greenled, HIGH);
digitalWrite(yellowled, HIGH);
delay(10000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Reset bomba");
lcd.setCursor(0,1);
lcd.print("in corso.. 5 sec");
delay(5000);
Riavvia();
while (Minutes < 0)
{
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval_led) {
previousMillis = currentMillis;
digitalWrite(redled, !digitalRead(redled));
digitalWrite(greenled, !digitalRead(greenled));
digitalWrite(yellowled, !digitalRead(yellowled));
tone(pinTone, 7000, 100);
}
//digitalWrite(relayPin, HIGH);
digitalWrite(redled, LOW);
tone(pinTone, 7000, 100);
delay(200);
digitalWrite(redled, HIGH);
tone(pinTone, 7000, 100);
delay(200);
digitalWrite(yellowled, LOW);
tone(pinTone, 7000, 100);
delay(200);
digitalWrite(yellowled, HIGH);
tone(pinTone, 7000, 100);
delay(200);
digitalWrite(greenled, LOW);
tone(pinTone, 7000, 100);
delay(200);
digitalWrite(greenled, HIGH);
tone(pinTone, 7000, 100);
delay(200);
}
}
}
lcd.setCursor (0, 1);
lcd.print ("Tempo:");
if (Hours >= 10)
{
lcd.setCursor (7, 1);
lcd.print (Hours);
}
if (Hours < 10)
{
lcd.setCursor (7, 1);
lcd.print("0");
lcd.setCursor (8, 1);
lcd.print(Hours);
}
lcd.print (":");
if (Minutes >= 10)
{
lcd.setCursor (10, 1);
lcd.print (Minutes);
}
if (Minutes < 10)
{
lcd.setCursor (10, 1);
lcd.print("0");
lcd.setCursor (11, 1);
lcd.print (Minutes);
}
lcd.print (":");
if (Seconds >= 10)
{
lcd.setCursor (13, 1);
lcd.print (Seconds);
}
if (Seconds < 10)
{
lcd.setCursor (13, 1);
lcd.print("0");
lcd.setCursor (14, 1);
lcd.print (Seconds);
}
if (Hours < 0)
{
Hours = 0;
}
if (Minutes < 0)
{
Hours --;
Minutes = 59;
}
if (Seconds < 1)
{
Minutes --;
Seconds = 59;
}
if (Seconds > 0)
{
unsigned long currentMillis = millis();
if ((currentMillis - secMillis) > interval)
{
if (Minutes == 0) {
if ((Seconds <= 59) && (Seconds > 30)) {
temp_lampeggio = 150;
}
if ((Seconds <= 30 ) && (Seconds >= 00)) {
temp_lampeggio = 75;
}
}
tone(pinTone, 7000, 50);
secMillis = currentMillis;
Seconds --;
digitalWrite(yellowled, !digitalRead(yellowled));
}
}
}
void lampeggio_led(long interval){
unsigned long currentMillis = millis();
if ((currentMillis - tempmillis) > interval)
{
tempmillis = currentMillis;
digitalWrite(redled, !digitalRead(redled));
digitalWrite(greenled, !digitalRead(greenled));
}
}
void pulsante_fili() {
if (digitalRead(intPressione) == LOW) {
if (intRilascio == false) {
if (tipo_int_rilascio == false) {
timedeath();
} else {
dimezzaTempo();
}
}
intRilascio = true;
} else {
intRilascio = false;
}
if (digitalRead(filovelocizzatempo) == HIGH) {
if (filovelocizzatempo_bool == false) {
velocizzaTempo();
}
filovelocizzatempo_bool = true;
} else {
filovelocizzatempo_bool = false;
}
if (digitalRead(filovelocizzatempo1) == HIGH) {
if (filovelocizzatempo1_bool == false) {
velocizzaTempo();
}
filovelocizzatempo1_bool = true;
} else {
filovelocizzatempo1_bool = false;
}
if (digitalRead(filomorte) == HIGH) {
if (filomorte_bool == false) {
timedeath();
}
filomorte_bool = true;
} else {
filomorte_bool = false;
}
}
void trigger_prossimita() {
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
delayMicroseconds(20);
durata = pulseIn(echoPin, HIGH);
distanza = durata / 58;
delayMicroseconds(50);
}