Allarme Arduino

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.

Il codice ha una logica tutta sua... :sweat_smile:
Io vederei di ottimizzarlo perché è inutilmente ridondante e ripetitivo.
Inoltre, ai fini della sicurezza, non dovresti bloccare l'inserimento al primo errore perché in questo modo è facile, per tentativi, risalire al codice corretto. :wink:
Prima fai premere tutti i tasti che compongono il codice, li memorizzi, e solo alla fine provvedi alla loro analisi per verificare se il codice inserito è giusto oppure no.

PS:
evitiamo i doppi posting, per favore...

Si lo so, scusa! Ma avevo sbagliato sezione e non sapevo come rimuoverlo(questo è il primo forum a cui mi iscrivo e non sono molto pratico!).
Ma come potrei memorizzare i tasti premuti?

In un array, una variabile detta anche vettore composta da diverse “celle” ordinate in cui salvi in ogni cella il valore di un pulsante. Poi fai una scansione e controlli se i pulsanti premuti corrispondono al codice memorizzato.

Le cose non si sanno dalla nascita, qindi come in tutte le materie bisogna un minimo conoscere le basi.
Ti serve prima di tutto un piccolo corso di programmazione in C. Ce ne sono diversi anche in italiano e gratuiti, online oppure scaricabili in formato PDF. Ti consiglio di iniziare prima una infarinatura di programmazione e poi riprovare a scrivere il tuo sketch, vedrai che differenza! :wink: