Problema programmazione antifurto.

Ciao! Sono nuovo del forum e la mia esperienza con arduino è tutta legata allo starter kit, quindi non sono molto esperto.
Il mio problema è che non riesco a far funzionare correttamente il mio progetto, un prototipo base per un antifurto.
Infatti quando io inserisco l’allarme, l’antifurto si accende e mi comunica se c’è un intruso o no, il problema è che una volta che lui mi segnale ad esempio che non c’è nessun intruso dopodiché l’antifurto è come se si bloccasse, nel senso che se il sensore rileva qualcosa e quindi ci sarebbe un intruso l’antifurto non me l’ho segnala, questo perché come l’ho programmato il progetto rileva solo se il pulsante che lo inserisce è schiacciato e CONTEMPORANEAMENTE il sensore rileva o no l’intruso e quindi una volta che il sensore comunica ciò che ha rilevato, l’antifurto “ha finito il suo lavoro”. Io penso che sia questo il problema, ma il motivo per cui io ho deciso di scriverlo sul forum è perché non riesco a trovare una soluzione. Ringrazio in anticipo chiunque mi aiuti!

P.S. (è un progetto base, infatti non ho aggiunto ad esempio un buzzer per la sirena, appena risolverò questo problema, magari lo migliorerò!)

Qui sotto metto lo sketch.

8_progetto_Antifurto_PIR_1_noTone.ino|attachment (1.84 KB)

Can we get you a map? The Italian forum is not the English forum.

Sorry!

Ed il cross-posting è vietato. http://forum.arduino.cc/index.php?topic=269937.0 Anche se nella sezione inglese scrivevi in inglese, NON puoi rifare stessa domanda in italiano in sezione italiana.

Innanzitutto vedi di presentarti, prima che passino i Grandi Capi, soprattutto dato che hai anche cannato sezione del forum. ;)

Poi, il problema, come dicevi, sta in questa riga:

else if (results.value == 16724175 && StatoSensore == HIGH) { // pulsante 1, Intruso Rilevato

Il ladro dev'essere nella stanza e premere il tasto 1 contemporaneamente ... non penso che ne abbia voglia. ]:)

Devi creare una variabile di stato che determina se l'allarme è stato inserito o meno. Questo ti permette di premere solo una volta il pulsante 1, in modo da verificare solo lo stato del PIR per andare in allarme o meno.

...
boolean AllarmeInserito = FALSE;    //oppure TRUE, se vuoi che all'avvio di arduino l'allarme sia attivo di default
...
...
if(results.value == 16718055){    // Allarme Disinserito, pulsante 2
      AllarmeInserito == FALSE;
...
...
if (results.value == 16724175) {    // pulsante 1,
      AllarmeInserito == TRUE;
...
...
else if (AllarmeInserito == TRUE && StatoSensore == HIGH) {    //Allarme inserito ed intruso presente
...

Chiedo ancora scusa, appena posso risolvo, comunque grazie ancora!

Ho provato a fare come mi hai detto (con boolean) ma non so perché il problema persiste, una volta che io ho inserito l'allarme non succede più nulla, anche se il sensore rileva qualcosa l'allarme non scatta. cosa può essere?

Se hai modificato il codice, riallegalo ad un post

Ok!

#include <IRremote.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

boolean AllarmeInserito = false ;
int RECV_PIN = 10;
int StatoSensore = 0;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  pinMode(9, INPUT); // PIR
  pinMode(6, OUTPUT); // led rosso
  pinMode(7, OUTPUT); // led verde
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.print("A.C.V.");
  lcd.setCursor(0, 1);
  lcd.print("Corporation");
  
  irrecv.enableIRIn(); // inizia ricezione IRemote
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);
    StatoSensore = digitalRead(9);
    Serial.println("StatoSensore: ");
    Serial.println(StatoSensore);
    
    StatoSensore = digitalRead(9);
    
   if(results.value == 16718055){ // Allarme disinserito, pulsante 2
   AllarmeInserito == false;
    digitalWrite(6, LOW); 
    digitalWrite(7, LOW);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Alllarme");
    lcd.setCursor(0, 1);
    lcd.print("Disinserito");
    delay(2000);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("A.C.V.");
    lcd.setCursor(0, 1);
    lcd.print("Corporation");
    delay(500);
   }
   
  else if(results.value == 16724175){ // Allarme inserito, pulsante 1 
   AllarmeInserito == true ;
    digitalWrite(6, LOW);      
    digitalWrite(7, HIGH);
    lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Allarme Inserito");
      delay(2000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("A.C.V.");
      lcd.setCursor(0, 1);
      lcd.print("Corporation");
      delay(500);
   }
        
   else if (AllarmeInserito == true && StatoSensore == HIGH) { // pulsante 1, Intruso!
    digitalWrite(6, HIGH);     
    digitalWrite(7, LOW);
    lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("INTRUSO RILEVATO");
      delay(500);
   }
    delay(500);
    irrecv.resume();
  }
}

L'ultimo check toglilo dalla catena di if..else, il controllo sull'allarme non deve dipendere dagli if precedenti ma deve essere un blocco if a sé stante, che viene eseguito se l'allarme è inserito ed il sensore rileva qualcosa.

In che senso, non potresti spiegarti meglio, non sono molto esperto!

L'ultimo controllo che fai:

else if (AllarmeInserito == true && StatoSensore == HIGH) { // pulsante 1, Intruso!

dovrebbe essere quello che fa scattare l'allarme. Ma è un "else" di un if", ossia la terza possibilità degli if precedenti. Devi renderlo autonomo:

if (AllarmeInserito == true && StatoSensore == HIGH) { // pulsante 1, Intruso!
    digitalWrite(6, HIGH);     
    digitalWrite(7, LOW);
    lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("INTRUSO RILEVATO");
      delay(500);
   }

e chiudere la catena di if..else prima di esso.

Ok, grazie mille! :smiley:

Ho appena provato, ma non è cambiato nulla!

Ora sono a lavoro e non posso analizzare bene il codice. Controlla che tutte le condizioni si verifichino e cerca di fare del debug, mettendo dei Serial.print per sapere che percorso fra il programma e dove non si infila. Gli if sono interpretati veri quando la o le condizioni di controllo accadono. Controlla che le variabili possano assumere i valori che fanno scattare il true.

Ok, grazie ancora, provo e poi ti faccio sapere!

Ho provato e il seriale mi segna AllarmeIntruso = 0, non capisco il perché!

(ho modificato il codice aggiungendo appunto i vari serial.println)

#include <IRremote.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

boolean AllarmeInserito = false ;
int RECV_PIN = 10;
int StatoSensore = 0;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  pinMode(9, INPUT); // PIR
  pinMode(6, OUTPUT); // led rosso
  pinMode(7, OUTPUT); // led verde
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.print("A.C.V.");
  lcd.setCursor(0, 1);
  lcd.print("Corporation");
  
  irrecv.enableIRIn(); // inizia ricezione IRemote
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);
    StatoSensore = digitalRead(9);
    Serial.println("StatoSensore: ");
    Serial.println(StatoSensore);
    
    StatoSensore = digitalRead(9);
    
  if(results.value == 16718055){ // Allarme disinserito, pulsante 2
    Serial.println("AllarmeInserito: ");
    Serial.println(AllarmeInserito);
    AllarmeInserito == false;
    digitalWrite(6, LOW); 
    digitalWrite(7, LOW);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Alllarme");
    lcd.setCursor(0, 1);
    lcd.print("Disinserito");
    delay(2000);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("A.C.V.");
    lcd.setCursor(0, 1);
    lcd.print("Corporation");
    delay(500);
   }
   
  else if(results.value == 16724175){ // Allarme inserito, pulsante 1 
      Serial.println("AllarmeInserito: ");
      Serial.println(AllarmeInserito);
      AllarmeInserito == true ;
      digitalWrite(6, LOW);      
      digitalWrite(7, HIGH);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Allarme Inserito");
      delay(2000);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("A.C.V.");
      lcd.setCursor(0, 1);
      lcd.print("Corporation");
      delay(500);
   }
        
  if (AllarmeInserito == true && StatoSensore == HIGH) { // pulsante 1, Intruso!
      Serial.println("AllarmeInserito: ");
      Serial.println(AllarmeInserito);
      digitalWrite(6, HIGH);     
      digitalWrite(7, LOW);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("INTRUSO RILEVATO");
      delay(500);
   }
    delay(500);
    irrecv.resume();
  }
}

Trovato! Hai assegnato i valori true e false ad AllarmeInserito, con il doppio uguale. ;)

AllarmeInserito == false è per i controlli, ed è diverso da AllarmeInserito = false che è per le assegnazioni.

Ah ok, grazie! provo fra poco! poi faccio sapere!

Ho provato a mettere un solo uguale, l'unica cosa che è cambiata è che [u]a volte[/u] quando io schiaccio il secondo pulsante (quello per disinserire l'allarme) l'antifurto mi trova un intruso! :cold_sweat: