Ho scritto questo sketch che tramite la pressione di 4 tasti mi attiva un sensore ad ultrasuoni e fa si che se la distanza misurata è diversa da 37cm fa suonare un buzzer in modo intermittente, ora io vorrei migliorare questo sistema facendo si che immettendo un altra sequenza sempre con gli stessi pulsanti mi disattivi il sensore. Questo è il codice:
#include <ShiftLCD.h>
ShiftLCD lcd(2, 4, 3);
////////////////////////////////////VARIABILI////////////////////////////////
int sequenzablocco = 0;
int sequenzasblocco = 0;
//PULSANTI
const int first_button = 10;
const int second_button = 9;
const int third_button = 8;
const int fourth_button = 7;
const int ok_button = 11;
//BUZZER
const int sensorPin = 6;
//ULTRASONIC RANGEFINDER
int triggerPort = 12;
int echoPort = 13;
///////////////////////////////////////////////////////////////////////////
void setup () {
pinMode (first_button, INPUT); //primo pulsante
pinMode (second_button, INPUT); //secondo pulsante
pinMode (third_button, INPUT); //terzo pulsante
pinMode (fourth_button, INPUT); //quarto pulsante
pinMode (ok_button, INPUT);
pinMode(8, OUTPUT);
pinMode(triggerPort, OUTPUT );
pinMode(echoPort, INPUT );
lcd.begin(16, 2);
lcd.setCursor(1,0);
lcd.print("By Fahrenheit");
delay(5000);
lcd.clear();
lcd.print("Enter code: ");
}
///////////////////////////////////////////////////////////////////////////
void sensore() {
while(digitalRead(ok_button) == LOW) {
lcd.clear();
digitalWrite( triggerPort, LOW );
digitalWrite( triggerPort, HIGH );
delayMicroseconds( 10 );
digitalWrite(triggerPort, LOW);
long duration = pulseIn(echoPort, HIGH);
long r = 0.034 * duration / 2;
lcd.setCursor(0,0);
lcd.print(r);
delay(500);
if(r != 37) {
tone(6, 2000, 100);
delay(100);
noTone(6);
delay(100);
}
if(digitalRead(ok_button) == HIGH) {
lcd.clear();
lcd.print("Enter code: ");
}
}
}
void loop () {
//SE NON E' STATO PREMUTO ALCUN PULSANTE DELLA SEQUENZA
if (sequenzablocco == 0) {
if (digitalRead(second_button) == HIGH) {
sequenzablocco = 1;
lcd.setCursor(1,1);
lcd.print("2");
delay(1000); //per evitare che si entri immediatamente nell'if succesivo nel caso in cui il pulsante è tenuto premuto per + di un secondo
}
}
//SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA
if (sequenzablocco == 1 && !digitalRead(first_button) && !digitalRead(second_button) && !digitalRead(third_button)) {
if (digitalRead(fourth_button) == HIGH) {
sequenzablocco = 2;
lcd.setCursor(5,1);
lcd.print("4");
delay(1000);
}
}
//SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA E IL SECONDO E' ERRATO
if (sequenzablocco == 1 && (digitalRead(first_button) || digitalRead(second_button) || digitalRead(third_button))) {
sequenzablocco = 0;
lcd.clear();
}
//SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA
if (sequenzablocco == 2 && !digitalRead(second_button) && !digitalRead(third_button) && !digitalRead(fourth_button)) {
if (digitalRead(first_button) == HIGH) {
sequenzablocco = 3;
lcd.setCursor(9,1);
lcd.print("1");
delay(1000);
}
}
//SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA E IL TERZO E' ERRATO
if (sequenzablocco == 2 && (digitalRead(second_button) || digitalRead(third_button) || digitalRead(fourth_button))) {
sequenzablocco = 0;
lcd.clear();
}
//SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA
if (sequenzablocco == 3 && !digitalRead(first_button) && !digitalRead(second_button) && !digitalRead(fourth_button)) {
if (digitalRead(third_button) == HIGH) {
sequenzablocco = 0; //RESETTO
lcd.setCursor(13,1);
lcd.print("3");
delay(1000);
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("System Armed");
delay(4000);
lcd.clear();
sensore();
}
}
//SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA E IL QUARTO E' ERRATO
if (sequenzablocco == 3 && (digitalRead(first_button) || digitalRead(second_button) || digitalRead(fourth_button))) {
sequenzablocco = 0;
lcd.clear();
}
///////////////////////////////////////////////////////////// codice: 4312 //////////////////////////////////////////////////////////////////////////////
//SE NON E' STATO PREMUTO ALCUN PULSANTE DELLA SEQUENZA
if (sequenzasblocco == 0) {
if (digitalRead(fourth_button) == HIGH) {
sequenzasblocco = 1;
lcd.setCursor(1,1);
lcd.print("4");
delay(1000); //per evitare che si entri immediatamente nell'if succesivo nel caso in cui il pulsante è tenuto premuto per + di un secondo
}
}
//SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA
if (sequenzasblocco == 1 && !digitalRead(first_button) && !digitalRead(second_button) && !digitalRead(fourth_button)) {
if (digitalRead(third_button) == HIGH) {
sequenzasblocco = 2;
lcd.setCursor(5,1);
lcd.print("3");
delay(1000);
}
}
//SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA E IL SECONDO E' ERRATO
if (sequenzasblocco == 1 && (digitalRead(first_button) || digitalRead(second_button) || digitalRead(fourth_button))) {
sequenzasblocco = 0;
lcd.clear();
}
//SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA
if (sequenzasblocco == 2 && !digitalRead(second_button) && !digitalRead(third_button) && !digitalRead(fourth_button)) {
if (digitalRead(first_button) == HIGH) {
sequenzasblocco = 3;
lcd.setCursor(9,1);
lcd.print("1");
delay(1000);
}
}
//SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA E IL TERZO E' ERRATO
if (sequenzasblocco == 2 && (digitalRead(second_button) || digitalRead(third_button) || digitalRead(fourth_button))) {
sequenzasblocco = 0;
lcd.clear();
}
//SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA
if (sequenzasblocco == 3 && !digitalRead(first_button) && !digitalRead(third_button) && !digitalRead(fourth_button)) {
if (digitalRead(second_button) == HIGH) {
sequenzasblocco = 4;
delay(2000);
sequenzasblocco = 0;
lcd.setCursor(13,1);
lcd.print("2");
delay(1000);
lcd.clear();
lcd.print("System Disarmed");
delay(4000);
lcd.clear();
}
}
//SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA E IL QUARTO E' ERRATO
if (sequenzasblocco == 3 && (digitalRead(first_button) || digitalRead(third_button) || digitalRead(fourth_button))) {
sequenzasblocco = 0;
lcd.clear();
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
Cosi com' è il codice immettendo la sequenza giusta mi attiva il sensore finché non viene premuto il V pulsante (ok_button), a questo punto già si interrompe la lettura del sensore e quindi si "disattiva l' allarme", poi si cancella l' LCD e si può inserire l' altro codice che dovrebbe disattivare l' allarme, ma in questo caso fa solo apparire la scritta: "System Disarmed".
Come dovrei modificare il codice per far si che l' allarme si disattivi solo dopo che viene inserita la sequenza di sblocco?
Grazie in anticipo per le risposte.