Problema programma PIR e KEYPAD

Salve, sono nuovo del forum e mi sono avvicinato ad Arduino da quasi una settimana. Al liceo ho studiato un po' di C++ quindi non sono proprio a digiuno da questo linguaggio di programmazione, ma sono passati ormai 10 anni...

Arrivo al dunque: ho un Arduino UNO con collegamento a PIR e KEYPAD.

Ho intenzione di realizzare un sistema di allarme di rilevamento tramite PIR che funziona a loop che deve disattivarsi quando inserisco un codice su tastiera. Il problema è che visto il funzionamento del PIR a loop continuo, non riesco a trovare un modo per inserirmi nel loop senza interrompere il sensore.

Ecco il pezzo di codice interessato:

 if (StatoSensore == LOW && d==1)
              {
               lcd.clear();
               lcd.print(" Allarme attivo"); 
               delay(500);
               digitalWrite(11, LOW);
               digitalWrite(12, LOW);
              }
          if (StatoSensore == HIGH && d==1)
              {
               digitalWrite(11, HIGH);
               digitalWrite(12, HIGH);
               lcd.clear();
               lcd.setCursor(0,0);
               lcd.print("  ATTENZIONE:");
               lcd.setCursor(0,1);
               lcd.print("  INTRUSIONE!");
               delay(500);
               digitalWrite(12, LOW);
               lcd.clear();
               lcd.print("");
               delay(500);
              }

Grazie in anticipo a chi mi saprà aiutare!

2 cose:
usa millis() al posto del delay() vedi l'esempio "blink without delay"
metti il controllo tastiera dopo il controllo sensore PIR.
Ciao Uwe

Ti invitiamo a presentarti qui: Re: Presentazioni nuovi iscritti, fatevi conoscere da tutti! (Part 1) - Generale - Arduino Forum
e a leggere il regolamento: http://forum.arduino.cc/index.php?topic=149082.0

nid69ita:
Ti invitiamo a presentarti qui: Re: Presentazioni nuovi iscritti, fatevi conoscere da tutti! (Part 1) - Generale - Arduino Forum
e a leggere il regolamento: [REGOLAMENTO] Come usare questa sezione del forum - Italiano - Arduino Forum

Mi sono presentato, il regolamento lo avevo già letto. Grazie per gli altri link utili!

vi scrivo tutto il loop, magari la situazione è più chiara!
In pratica il programma funziona perfettamente, inserisco il codice e si attiva il sensore PIR. Se sbaglio codice me lo fa riinserire.

Quello che devo aggiungere io è bloccare il sistema di allarme riinserendo il codice in un momento qualsiasi dell'esecuzione.

 void loop()
  {
   StatoSensore = digitalRead(10);
            if (StatoSensore == LOW && d==1)
              {
               lcd.clear();
               lcd.print(" Allarme attivo"); 
               delay(500);
               digitalWrite(11, LOW);
               digitalWrite(12, LOW);
              }
          if (StatoSensore == HIGH && d==1)
              {
               digitalWrite(11, HIGH);
               digitalWrite(12, HIGH);
               lcd.clear();
               lcd.setCursor(0,0);
               lcd.print("  ATTENZIONE:");
               lcd.setCursor(0,1);
               lcd.print("  INTRUSIONE!");
               delay(500);
               digitalWrite(12, LOW);
               lcd.clear();
               lcd.print("");
               delay(500);
              }
   char key = keypad.getKey();
   if (a==0)
      {
       delay(100);
       lcd.clear();
       lcd.setCursor(0,1);
       lcd.print("attivazione");
       lcd.setCursor(0,0);
       lcd.print("Codice: ");
       a++;
      }
   if (key != NO_KEY && b<4)
      {
       lcd.print("*");
       keyInsert[b]=key;
       b++;
      }
   if (b==4) 
      {
       lcd.clear();
       for(s=0; s<4; s++)
          {
           if(keyInsert[s]==codice[s])
              {
               x++;
              }
          }
           if (x!=4 && c==0)
              {
               delay(100);
               lcd.clear();
               lcd.setCursor(0,0);
               lcd.print("Codice errato!");
               lcd.setCursor(0,1);
               lcd.print("Riprova!");
               delay(2000);
               x=0;
               a=0;
               b=0;
               lcd.clear();
              }
           if (x==4)
              {
               lcd.clear();
               lcd.setCursor(0,0);
               lcd.print("Codice corretto!");
               lcd.setCursor(0,1);
               lcd.print("Allarme attivato");
               delay(10000);  
               c++;
               d++;
               }
 
        /*  if (d>1)
              {
               lcd.print("Allarme spento");
               delay(2000);
               x=0;
               a=0;
               b=0;
               s=0;
               c=0;
               d=0;
               lcd.clear();
              }
        */  }
      }

up

Secondo me devi scomporre le varie parti in funzioni separate, es. controllaPIR(), leggiKBD(), ecc. ecc. e dal loop() le richiami in continuazione una dopo l'altra.

NON devi usare l'istruzione delay() che è bloccante per il codice e che, in questo caso, creerebbe dei momenti di pausa inaccettabili. Devi imparare a fare le cose usando la millis() e, per capire come, prova a strudiare QUESTO articolo e poi QUESTO. Anche QUI trovi un possibile esempio.

Capito come scrivere codice non bloccante e scomposta la tua applicazione in funzioni elementari, le quali svolgono ciascuna un determinato compito, ti risulterà molto più facile fare quello che vuoi fare :slight_smile:

Guglielmo

gpb01:
Secondo me devi scomporre le varie parti in funzioni separate, es. controllaPIR(), leggiKBD(), ecc. ecc. e dal loop() le richiami in continuazione una dopo l'altra.

NON devi usare l'istruzione delay() che è bloccante per il codice e che, in questo caso, creerebbe dei momenti di pausa inaccettabili. Devi imparare a fare le cose usando la millis() e, per capire come, prova a strudiare QUESTO articolo e poi QUESTO. Anche QUI trovi un possibile esempio.

Capito come scrivere codice non bloccante e scomposta la tua applicazione in funzioni elementari, le quali svolgono ciascuna un determinato compito, ti risulterà molto più facile fare quello che vuoi fare :slight_smile:

Guglielmo

Ti ringrazio, inizierò a riscrivere il programma dopo aver imparato la funzione millis().