Ciao
Il mio ultimo progetto che ho intenzione di creare è un piccolo antifurto il quale si attiva tramite un tastierino numerico (nel mio caso 4X4) e rileva i movimenti tramite il sensore di movimento PIR.
Inoltre è presente un display LCD 16X2 per "monitorare visivamente" la situazione dell'antifurto.
Il problema è che non funziona l'input del PIN (di 4 cifre) il quale viene richiesto subito per mettere in azione il sistema.
L'input del sensore PIR è il pin 2 poichè ho deciso di provare ad utilizzare la tecnica dell'interrupt su Arduino UNO.
Ecco il codice:
#include <LiquidCrystal.h> //importo la libreria per gestire LCD
#include <Keypad.h> //importo la libreria per la gestione del tastierino numerico (4*4 in questo caso)
#define buzzer 3 //costante per indicare pin del cicalino
#define pir 2 //costante per definire pin del PIR
#define MAX 5 //costante per definire valore massimo del vettore
char pin[MAX]; //stringa per pin inserito dall'utente
char MioPIN[MAX] = "1234"; //stringa che rappresenta il pin per abilitare antifurto
LiquidCrystal lcd (13,12,11,10,9,8); //imposto pin che comandano display
const byte riga = 4; //constante di tipo byte per identificare grandezza riga
const byte colonna = 4; //constante di tipo byte per identificare grandezza colonna
char matriceTasti[riga][colonna] =
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
}; //end vettore multidimensionale per la dichiarazione dei tasti del keypad
byte pinRiga[riga] = {A0,A1,A2,A3}; //vettore per indicare pin riga keypad
byte pinColonna[colonna] = {7,6,5,4}; //vettore per indicare pin colonna keypad
Keypad keypad = Keypad (makeKeymap(matriceTasti), pinRiga, pinColonna, riga, colonna ); //creo variabile di tipo keypad con tutte le caratteristiche
byte stato = 0; //variabile che indica lo stato
char carattere;
byte conta=0,contaLCD=6;
void allarme(void); //prototipo funzione per far scattare segnalazione allarme
void setup()
{
lcd.begin(16,2); //imposto grandezza display
pinMode(pir,INPUT); //imposto il pin2 digitale come input
pinMode(buzzer,OUTPUT); //imposto il pin3 come output per comandare il cicalino
/*
* Interrupt per la gestione del sensore PIR
* L'interrupt è attivo sul pin 2 (indicato con il valore 0 mentre il pin3 con il valore 1)
* il quale richiama il sottoprogramma "allarme"
* quando si passa da LOW ad HIGH sul pin 2 --> RISING
*/
attachInterrupt (0,allarme,RISING);
noInterrupts(); //disabilito interrupt
} //end setup
void loop()
{
switch(stato)
{
case 0:
/*
* Stato di partenza in cui
* viene richiesto il pin di 4 cifre
* e se convalidato si passa allo stato 1 altrimenti si ripete
*/
lcd.setCursor(0,0);
lcd.print("ANTIFURTO OFF");
lcd.setCursor(0,1);
lcd.print("Pin: ");
carattere = keypad.getKey();
if (carattere) // makes sure a key is actually pressed, equal to (customKey != NO_KEY)
{
pin[conta] = carattere; // store char into data array
lcd.setCursor(contaLCD,1); // move cursor to show each new char
lcd.print(pin[conta]); // print char at said cursor
conta++;
contaLCD++;
}
if(conta == MAX-1) // if the array index is equal to the number of expected chars, compare data to master
{
lcd.clear();
lcd.setCursor(0, 0);
if(strcmp(pin, MioPIN)==0)
{
lcd.print("PIN CORRETTO");
stato = 1;
interrupts();
}
else
{
lcd.print("PIN SBAGLIATO");
stato = 0;
}
delay(1000);// added 1 second delay to make sure the password is completely shown on screen before it gets cleared.
lcd.clear();
while(conta !=0)
{
pin[conta--] = 0; //pulizia stringa pin
contaLCD--;
}
} //end if
break;
case 1:
/*Stato che indica che l'antifiruto è attivo*/
//interrupts(); l'interrupt è stato abilitato se la password era corretta
char letto;
letto = keypad.getKey(); //lettura di un eventuale carattere
if(letto == 'A')
{
stato = 0; //stato vale 0 così da tornare in quello di partenza
/*Lo comunico tramite lcd*/
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Disattivazione");
lcd.setCursor(0,1);
lcd.print("Allarme!");
delay(1500); //ritardo di 1 secondo e mezzo
noInterrupts(); //disabilito interrupt poichè nello stato di partenza(case 0) non è attivo!
} //end if
lcd.setCursor(0,0);
lcd.print("ON - TUTTO OK!");
lcd.setCursor(0,1);
lcd.print("A per disattivare");
delay(30);
break;
case 2:
/*
* stato in cui si effettua la segnalazione della rilevazione del PIR
* tramite display LCD e cicalino
*/
noInterrupts(); //disabilita l'interrupt
lcd.clear(); //pulizia display
lcd.setCursor(0,0);
lcd.print("Movimento");
lcd.setCursor(0,1);
lcd.print("Rilvevato");
for(byte i = 0; i < 3; i++)
{
digitalWrite(buzzer,HIGH);
delay(500);
digitalWrite(buzzer,LOW);
delay(500);
} //end for
stato = 1; //imposto il valore di stato uguale a 1 così da tornare allo stato di controllo
interrupts(); //abilito nuovamente interrupt sul pin2
break; //end case 2
} //end switch
} //end loop
/*Funzioni e sottoprogrammi*/
void allarme (void)
{
stato = 2; //la variabile assume il valore 2 ed entra così nel case per la segnalazione del movimento
}//end allarme()
Ringrazio in anticipo se qualcuno mi potrà aiutare