Countdown da fermare con inserimento di una password

Salve a tutti,

ho un problma con un progetto che vorrei fare. Premendo un pulsante faccio partire un countdown di 20 min da visualizzare sul displey e devo cercare di interrompere inserendo una password. Ora ho un problema per la password perché non so come fare.

Ho usato un arduino Due dove ho connesso una tastiera di matrice 4x4, un display da due righe e 16 colonne e una scheda da 8 relè.

Ecco il programma, mi scuso per la forma ma sto facendo vari tentativi.

Grazie per aiuto.

Brandon_Bomba.ino (5.81 KB)

nessuno riesce ad aiutarmi?

Forse perchè il programma è scritto in modo illegibile, con un'infinità di righe vuote ed una pessima indentatura che scoraggia chiunque volesse magari leggerlo ? ::slight_smile:

Imparate a scrive programmi come si deve, senza inutile enormi spazi vuoti e con le giuste indentature (... che, tra l'altro, vi fa automaticamente l'IDE con la funzione Tools -> Auto Format) così, chi magari ci vuole dare un occhiata, non deve diventare pazzo ...

Guglielmo

ciao...ho dato un occhio allo sketch...tralasciando le innumerevoli righe vuote...ci sono un po' di cose che non vanno bene...o per lo meno che sono dubbie...tipo:

int ms = 1201000;

questa non va...le int hanno un range da -32768 a 32767

ad ogni inizio loop() fai:

lcd.clear();        // Start with a blank screen
Serial.println("SISTEMA ATTIVO");
lcd.setCursor(1,0);
lcd.print("SISTEMA ATTIVO");
delay (1000);

cioè resetti quello che avevi scritto e lo rimpiazzi con questo.
ma tu hai collegato l'LCD o lo stai stampando solo su Serial?
ci sono un casino di variabili non utilizzate...per curiosità...ti sei fatto uno schema logico di come vuoi che il programma funzioni o stai andando a "braccio"?

Dopo di che (mio post #2) ...
... probabilmente sarebbe il caso che lo strutturassi come una "macchina a stati finiti", definendo quindi quali sono i vari stati in cui si trova il tuo sistema (innescato, disinnescato, tempo scaduto, ecc. ecc.) e per quali condizioni si passa da uno stato all'altro, sviluppando i vari stati separatamente (... e semplificando così il tutto).

Guglielmo

Grazie per le risposte ma sono riuscito a risolvere. solo ora ho un altro problema per far partire la bomba è il timer vorrei mettere un pulsante, ora lo faccio partire premeto il tasto 1 della tastiera. Ho fatto delle prove ma non riesco come posso fare? (una prova che ho fatto e messa come commento)
ecco il prgramma

#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Tone.h>
#define pound 14

int Scount = 59;
int Mcount = 29;
int Hcount = 0;
int DefuseTimer = 0;
const int BUTTON = 38;
int val = 0;

long secMillis = 0;
long interval = 1000;

char password[4];
int currentLength = 0;
int i = 0;
char entered[4];
char code [5];
char f;

#include <SPI.h>
#define ZONA1 44
#define ZONA2 45
#define ZONA3 46
#define ZONA4 47
#define ZONA5 48
#define ZONA6 49
#define ZONA7 50
#define ZONA8 51

#define PULSANTE 38

int val0 = 0;
int val1 = 0;
int val2 = 0;
int val3 = 0;
int val4 = 0;
int val5 = 0;
int val6 = 0;
int val7 = 0;
int val8 = 0;
byte out[] = { 19, 18, 17, 16, 15, 14, 13, 12, 11, }; // C19_44 C18_45 C17_46 C16_47 C15_48 C14_49 C13_50

int riga1;
int riga2;
int riga3;
int riga4;
int colonna1;
int colonna2;
int colonna3;
int colonna4;

const int numeroRighe = 2;
const int numeroColonne = 16;

//char code [5];
//char f;
int v;
int c;
int restart = 0;

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

const byte ROWS = 5;
const byte COLS = 5;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {
30, 31, 32, 33}; // Connessione delle righe: Riga0, Riga1, Riga2 e Riga3 ai pins di Arduino.
byte colPins[COLS] = {
34, 35, 36, 37};

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup()

{

pinMode (ZONA1, OUTPUT); // imposto zona1 e zona 2 come uscite
pinMode (ZONA2, OUTPUT);
pinMode (ZONA3, OUTPUT);
pinMode (ZONA4, OUTPUT);
pinMode (ZONA5, OUTPUT);
pinMode (ZONA6, OUTPUT);
pinMode (ZONA7, OUTPUT);
pinMode (ZONA8, OUTPUT);

pinMode (30, INPUT);
pinMode (31, INPUT);
pinMode (32, INPUT);
pinMode (33, INPUT);
pinMode (34, INPUT);
pinMode (35, INPUT);
pinMode (36, INPUT);
pinMode (37, INPUT);
pinMode (BUTTON,INPUT);

digitalWrite (ZONA1, LOW);
digitalWrite (ZONA2, LOW);
digitalWrite (ZONA3, LOW);
digitalWrite (ZONA4, LOW);
digitalWrite (ZONA5, LOW);
digitalWrite (ZONA6, LOW);
digitalWrite (ZONA7, LOW);
digitalWrite (ZONA8, LOW);

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++;

}
}
}

if (currentLength == 4)
{
delay(500);
lcd.noCursor();
lcd.clear();
lcd.home();

lcd.setCursor(6,1);
lcd.print(password[0]);
lcd.print(password[1]);
lcd.print(password[2]);
lcd.print(password[3]);

delay(3000);
lcd.clear();
currentLength = 0;
}

lcd.clear(); // Start with a blank screen

Serial.println("SISTEMA ATTIVO");
lcd.setCursor(1,0);
lcd.print("SISTEMA ATTIVO");
delay (1000);

lcd.setCursor(1,1);

lcd.println("DETONA BOMBA ");

for (f=0; f<1; f++)
code[f] = keypad.waitForKey();
Serial.print("Tasto numero ");
Serial.print(f);
Serial.print(" - valore ");
Serial.println(code[f]);

if (code[0] == '1') {

// val = digitalRead(BUTTON);
// if ( BUTTON == HIGH) {

lcd.clear(); // Start with a blank screen
delay (1000);
lcd.setCursor(0,1);
Serial.println ("BOMBA ATTIVATA"); // se zona 1 è attiva la bomba è attiva
lcd.print("BOMBA ATTIVATA");

delay (1000);

}

c ='1';

val1 = digitalRead (ZONA1); // leggo lo stato delle uscite
val2 = digitalRead (ZONA2);
val3 = digitalRead (ZONA3); // leggo lo stato delle uscite
val4 = digitalRead (ZONA4);
val5 = digitalRead (ZONA5); // leggo lo stato delle uscite
val6 = digitalRead (ZONA6);
val7 = digitalRead (ZONA7); // leggo lo stato delle uscite
val8 = digitalRead (ZONA8);

}

void loop()
{

timer();
char key2 = keypad.getKey();

if (key2 == '*')
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("CODE:");

while (currentLength < 4)
{

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++;

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("BOMBA ");
currentLength = 0;

lcd.setCursor(0,1);
lcd.print("DISINNESCATA!");
delay(50000);
}
else
{
lcd.noCursor();
lcd.clear();
lcd.home();
lcd.print("CODICE ERRATO!");
lcd.setCursor (0,1);

lcd.print("BOMBA ESPLOSA!!! ");

digitalWrite (ZONA1, HIGH);
digitalWrite (ZONA2, HIGH);
digitalWrite (ZONA3, HIGH);
digitalWrite (ZONA4, HIGH);
digitalWrite (ZONA5, HIGH);
digitalWrite (ZONA6, HIGH);
digitalWrite (ZONA7, HIGH);
digitalWrite (ZONA8, HIGH);
Serial.println ("TUTTE LE ZONE SONO ATTIVE"); // tutte le zone sono attivate

delay (50000);

}
}
}
}

void timer()
{
Serial.print(Scount);
Serial.println();

if (Hcount <= 0)
{
if ( Mcount < 0 )
{
lcd.noCursor();
lcd.clear();
lcd.home();

}
}

lcd.setCursor (0,1);
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)
{
Mcount --;
Scount = 59;
}

if (Scount > 0)
{
unsigned long currentMillis = millis();

digitalWrite (ZONA1, LOW);

if(currentMillis - secMillis > interval)
{

secMillis = currentMillis;
Scount --;
digitalWrite (ZONA1, HIGH);

}
}
}

>robertino83:

  1. in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

  2. Te l'ho già detto nel mio post #2 (che hai del tutto ignorato) ... se vuoi che qualcuno dedichi del tempo a leggere il tuo codice ... rendilo LEGGIBILE:

  • Via tutte quelle inutili righe vuote che NON servono assolutamente a nulla
  • Indentalo cone si deve. C'è un'apposita funzione dell'IDE per farlo, Tools -> Auto Format, usala.

Guglielmo