Go Down

Topic: Codice problematico per timer ordigno finto softair (Read 924 times) previous topic - next topic

Jan 26, 2013, 08:58 pm Last Edit: Jan 27, 2013, 01:16 am by alex_branchi Reason: 1
Ciao a tutti, mi sto cimentando nella costruzione di una replica giocattolo di ordigno a tempo.
E' composta così:

Arduino 2009 (poi implementerò un mega 2560)
LCD 20x4 parallelo color blu
keypad 4x4

Il software dovrebbe far sì che prima viene richiesto il codice, la bomba si arma, parte il timer e nel mentre si dovrebbe riuscire ad immettere un codice di disinnesco. Detto ciò non riesco assolutamente a far apparire il timer che faccia il conto alla rovescia!!!

Ho provato in tutte le maniere ma faccio solo dei pasticci, ormai è quasi 3 settimane che litigo con il libro di arduino e il mio cervello, mi date una mano per favore?

ecco il codice

Code: [Select]

//#include <Event.h>
#include <Timer.h>
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Tone.h>
#define pound = 14
Tone tone1;
int Scount = 0; // count seconds
int Mcount = 0; // count minutes
int Hcount = 0; // count hours
int Dcount = 0; // count days
int val = 0;
long secMillis = 0; // store last time for second
long interval = 1000; // interval for seconds
char password[4];
int currentLength = 0;
int i = 0;
char entered[4];

LiquidCrystal lcd(12, 13, 11, 10, 9, 8);
const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = {
 {
   '1','2','3','A'  }
 ,
 {
   '4','5','6','B'  }
 ,
 {
   '7','8','9','C'  }
 ,
 {
   '*','0','#','D'  }
};
byte rowPins[ROWS] = {
 3, 2, 1, 0}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {
 7, 6, 5, 4}; //connect to the column pinouts of the keypad

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



void setup(){

 tone1.begin(A0);
 lcd.begin(20, 4);
 Serial.begin(9600);
 lcd.clear();
 lcd.setCursor(1,0);
 lcd.print("Enter disarm code: ");
 while (currentLength < 4){
   lcd.setCursor(currentLength + 6, 1);
   lcd.cursor();
   char key = keypad.getKey();
   key == NO_KEY;
   if (key != NO_KEY){
     lcd.print(key);
     password[currentLength] = key;
     currentLength++;
     delay(200);
   }
 }
 if (currentLength == 4){
   lcd.noCursor();
   lcd.clear();
   lcd.home();
   lcd.setCursor(0,1);
   lcd.print("<<<<<BOMB ARMED>>>>> ");
   lcd.setCursor(6,2);
   lcd.print(password[0]);
   lcd.print(password[1]);
   lcd.print(password[2]);
   lcd.print(password[3]);
   delay(3000);
   lcd.clear();
   currentLength = 0;
 }
}

void loop(){
 


 char key2 = keypad.getKey(); // get the key
 lcd.setCursor(0,4);

 if (key2 != NO_KEY)
 {
   while (key2 == NO_KEY)
   {
     key2 = keypad.getKey();
   }
   if (key2 != NO_KEY)
   {
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("Enter Code: ");
     while (currentLength < 4){
       lcd.setCursor(currentLength + 6, 1);
       lcd.cursor();
       char key2 = keypad.getKey();
       if (key2 != NO_KEY)
       {
         tone1.play(NOTE_A6, 200);
         lcd.print(key2);
         entered[currentLength] = key2;
         currentLength++;
         delay(200);
         lcd.noCursor();
         lcd.setCursor(currentLength + 5, 1);
         lcd.print("*");
         tone1.play(NOTE_G5, 200);
         lcd.setCursor(currentLength + 6, 1);
         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("Disarm loading...");
         currentLength = 0;
         delay(10000);
         lcd.setCursor(0,1);
         lcd.print("STATUS:");
         delay(5000);
         lcd.setCursor(9,1);
         lcd.print("<DISARMED>");
         //delay(5000);
       }
       else
       {

         lcd.noCursor();
         lcd.clear();
         lcd.home();
         lcd.print("Protection mode");
         lcd.setCursor(0,1);
         lcd.print("TIME - 1:30 ");
         if (Mcount < 14)
         {
           Mcount = Mcount + 1;
         }
         if (Scount < 59)
         {
           Scount = Scount + 30;
         }
         delay(1500);
         currentLength = 0;
       }
     }
   }
 }
}

void timer(){
 if ( Mcount >= 15 )
 {
   while ( Mcount >= 15)
   {
     lcd.noCursor();
     lcd.clear();
     lcd.home();
     lcd.print("YOU ARE DIED!!!");
     tone1.play(NOTE_A2, 200);
     tone1.play(NOTE_A2, 200);
     delay(10); // waits for a second
     tone1.play(NOTE_A2, 200);
     delay(10); // waits for a second
     tone1.play(NOTE_A2, 200);
     delay(10); // waits for a second
     tone1.play(NOTE_A2, 200);
     delay(10); // waits for a second

     char key4 = keypad.getKey();
     if (key4 != NO_KEY){
       while (key4 == NO_KEY){
         key4 = keypad.getKey();
       }
       if (key4 = '#')
       {
         lcd.clear();
         lcd.print("Reset the Bomb");
       }
     }
   }
   if ( Mcount == 60) // if Mcount is 60 do this operation
   {
     delay (10); // good place to fine tune timing 32
     Mcount = 0; // reset Mcount
     Hcount ++;
   }
   if (Hcount> 23)
   {
     Dcount++;
     Hcount = 0; // have to reset Hcount to "0" after 24hrs
   }

   lcd.setCursor (0,4); // sets cursor to 2nd line
   lcd.print ("Timer: ");
   lcd.print (Dcount);
   lcd.print (":");
   lcd.print (Hcount);
   lcd.print (":");
   lcd.print (Mcount);
   lcd.print (":");
   lcd.print (Scount);
   if (Scount >59) // if 60 do this operation
   {
     Mcount ++; // add 1 to Mcount
     Scount = 1000; // reset Scount
     delay (58); // changes ms per min
   }
   if (Scount < 60) // do this oper. 59 times
   {
     unsigned long currentMillis = millis();//
     delay (988); // changing by one = 60 ms a min
     if(currentMillis - secMillis > interval)
     {
       tone1.play(NOTE_G5, 200);
       secMillis = currentMillis;
       Scount ++; // add 1 to Scount
       delay(10); // waits for a second
       delay(10); // waits for a second
     }
   }
 }
}





pablos

#1
Jan 26, 2013, 09:45 pm Last Edit: Jan 26, 2013, 11:08 pm by pablos Reason: 1
Non è che lunedì vai davanti a qualche scuola ??  
no comment

Ma va!!! Siamo solo dei pazzi che si prendono troppo sul serio  :D

Quache idea?
Ps dimenticavo ch ho aggiunto anche un buzzer, ma non è troppo rilevante...

leo72

Non mi sono messo a guardare tutto il codice, troppo lungo.
Mi viene solo da dirti di dividere la cosa in blocchi logici.
Quando fai partire il conto alla rovescia devi adottare una serie di controlli basati su millis.

1) Ogni secondo devi far scorrere il conto alla rovescia indietro di 1 secondo.
2) Durante quel tempo, devi controllare se l'utente ha premuto un pulsante. Nel caso, lo memorizzi in una matrice che contiene la chiave ed incrementi il numero di cifre immesse
3) Se il numero di cifre immesse è pari a quello delle cifre che compongono la chiave, fai subito un controllo se il codice è giusto. Se è giusto, fermi il conto alla rovescia, se è sbagliato, svuoti la matrice, riazzeri il contatore di cifre e continui dal punto 1).
4) Prosegui dal punto 1.

Potresti aggiungere anche un altro punto:
3.5) Controlli un timeout. Se l'utente non ha premuto un ulteriore pulsante prima di un timeout, svuoti tutta la matrice dei pulsanti fino ad allora premuti, resetti il contatore di cifre e continui dal punto 1).

Questo dipende da come vuoi fare il disinnesco.

Ok, provo a rifare tutto e poi vediamo che succede...
Per ora grazie!

Go Up