Sistema di Allarme

Buongiorno a Tutti,
da qualche mese sono entrato nel mondo di Arduino.
Da qualche settimana ho iniziato a fare il mio primo progetto.
Vorrei usare Arduino come sistema di allarme e come sistema di domotica.

ho un problema...
ho un sensore magnetico ed un sensore PIR.
Quando allontano il magnete dal sensore o quando rilevo un movimento si accende il led.
Il problema è che quando uno dei due sensori ritorna nella modalità LOW o HIGH, il led smette di funzionare.
Mi potreste dare una mano ?

// LCD 20x4
#include <LiquidCrystal_I2C.h>




//------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------

//DEFINISCI VARIABILI INGRESSI ANALOGICI

//MONITORAGGIO TEMPERATURA INTERNA (CONTROL UNIT)
#define ONE_WIRE_BUS 4

//MONITORAGGIO APERTURA CONTROL UNIT
int I_Limit_Switch = 3;
int Limit_Switch_State = LOW;

//EXTERNAL SENSOR - MAGNETIC/MOTION SENSOR
int I_External_Sensor_1 = 22;
int External_Sensor_1_State = HIGH;
int External_Sensor_2 = 23;
int External_Sensor_2_State = LOW;
int External_Sensor_3 = 24;
int External_Sensor_3_State = LOW;
int External_Sensor_4 = 25;
int External_Sensor_4_State = LOW;
int External_Sensor_5 = 26;
int External_Sensor_5_State = LOW;
int External_Sensor_6 = 27;
int External_Sensor_6_State = LOW;
int External_Sensor_7 = 28;
int External_Sensor_7_State = LOW;
int External_Sensor_8 = 29;
int External_Sensor_8_State = LOW;
int External_Sensor_9 = 30;
int External_Sensor_9_State = LOW;
int External_Sensor_10 = 31;
int External_Sensor_10_State = LOW;
int External_Sensor_11 = 32;
int External_Sensor_11_State = LOW;
int External_Sensor_12 = 33;
int External_Sensor_12_State = LOW;
int External_Sensor_13 = 34;
int External_Sensor_13_State = LOW;

//MOTION SENSOR
int I_Motion_Sensor_1 = 38;
int Motion_Sensor_1_State = LOW;
int Motion_Sensor_2 = 39;
int Motion_Sensor_2_State = LOW;
int Motion_Sensor_3 = 40;
int Motion_Sensor_3_State = LOW;

//MONITORAGGIO TEMPERATURA - SENSORI DHT22

#define DHT_1 A0
#define DHT_2 A1
#define DHT_3 A2
#define DHT_4 A3
#define DHT_5 A4
#define DHT_6 A5
#define DHT_7 A6
#define DHT_8 A7
#define DHT_9 A8
#define DHT_10 A9

// LCD 20x4
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

// LED

#define Led_Green 7 // led verde, porta 16 (A2)
#define Led_Red 5 // led rosso, porta 17 (A3)
#define Led_Blue 8 // caricamento
#define Led_Yellow 6 // Error
#define Buzzer 9 // sirena Interna


// RELE'

#define Sirena 46 // Relè N. 1
#define Ventola_Interna 47  // Relè N. 2
#define Rele3 48  // Relè N. 3
#define Rele4 49  // Relè N. 4

// COMANDO SERIALE

char Comando;


//------------------------------------------------------------------------------------

//*****************************    VOID SETUP    **************************************

// SENSORE DALLAS 18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup()
{
  Serial.begin(115200);
  Serial.println("Domotica R 1.0");
  Loading();
  pinMode(I_Limit_Switch,INPUT);
  pinMode(I_External_Sensor_1, INPUT);
  pinMode(External_Sensor_2, INPUT);
  pinMode(External_Sensor_3, INPUT);
  pinMode(External_Sensor_4, INPUT);
  pinMode(External_Sensor_5, INPUT);
  pinMode(External_Sensor_6, INPUT);
  pinMode(External_Sensor_7, INPUT);
  pinMode(External_Sensor_8, INPUT);
  pinMode(External_Sensor_9, INPUT);
  pinMode(External_Sensor_10, INPUT);
  pinMode(External_Sensor_11, INPUT);
  pinMode(External_Sensor_12, INPUT);
  pinMode(External_Sensor_13, INPUT);
  pinMode(I_Motion_Sensor_1, INPUT);
  pinMode(Motion_Sensor_2, INPUT);
  pinMode(Motion_Sensor_3, INPUT);
  pinMode(Led_Green, OUTPUT);
  pinMode(Led_Red, OUTPUT);
  pinMode(Led_Blue, OUTPUT);
  pinMode(Led_Yellow, OUTPUT);
  pinMode(Buzzer, OUTPUT);  
  pinMode(Sirena, OUTPUT); 
  pinMode(Ventola_Interna, OUTPUT);
  pinMode(Rele3, OUTPUT);
  pinMode(Rele4, OUTPUT);
  digitalWrite(Sirena, HIGH);
  digitalWrite(Ventola_Interna, HIGH);
  digitalWrite(Rele3, HIGH);
  digitalWrite(Rele4, HIGH); 

}

//*****************************   VOID LOOP   *****************************

void loop ()
{
  Print_Menu();
//  F_Comandi();  
  A_Limit_Switch();
  A_External_Sensor_1();
  A_Motion_Sensor_1();

}


//**************************   ALLARMI   **************************

void A_Limit_Switch()
{
  int V_Limit_Switch = digitalRead(I_Limit_Switch);
  if(V_Limit_Switch != Limit_Switch_State)
  {
    Limit_Switch_State = V_Limit_Switch;
    if( Limit_Switch_State == HIGH)
    {
    Serial.println("Control Unit Aperta (1)");    // Stampa su Seriale 
    lcd.clear();
    lcd.setCursor(0, 1);
    lcd.print(F("Control Unit"));                 // Stampa su LCD
    lcd.setCursor(0, 2);
    lcd.print(F("***** APERTA *****"));
    digitalWrite(Led_Red, HIGH);                  // Accende LED Rosso
    digitalWrite(Sirena, LOW);                    // Accende SIRENA
    }
    else{
    Serial.println("Control Unit Chiusa (0)");
    lcd.clear();
    Print_Menu();                                 // Ritorna al Menu Principale
    digitalWrite(Led_Red, LOW);                   // Spegne LED Rosso
    digitalWrite(Sirena, HIGH);                   // Spegne SIRENA
  }
}
}


//**************************   EXTERNAL SENSOR   **************************

void A_External_Sensor_1()
{
  int V_External_Sensor_1 = digitalRead(I_External_Sensor_1);
  if(V_External_Sensor_1 != External_Sensor_1_State)
  {
    External_Sensor_1_State = V_External_Sensor_1;
    if(External_Sensor_1_State == LOW)
    {
    Serial.println("Porta Principale Aperta (1)");    // Stampa su Seriale 
    lcd.clear();
    lcd.setCursor(0, 1);
    lcd.print(F("Porta Principale"));                 // Stampa su LCD
    lcd.setCursor(0, 2);
    lcd.print(F("***** APERTA *****"));
    digitalWrite(Led_Red, HIGH);                  // Accende LED Rosso
    digitalWrite(Sirena, LOW);                    // Accende SIRENA
    }
    else{
    Serial.println("Porta Principale Chiusa (0)");
    lcd.clear();
    Print_Menu();                                 // Ritorna al Menu Principale
    digitalWrite(Led_Red, LOW);                   // Spegne LED Rosso
    digitalWrite(Sirena, HIGH);                   // Spegne SIRENA
  }
}
}

//************************** MOTION SENSOR **************************

void A_Motion_Sensor_1()
{
  int V_Motion_Sensor_1 = digitalRead(I_Motion_Sensor_1);
  if(V_Motion_Sensor_1 != Motion_Sensor_1_State)
  {
    Motion_Sensor_1_State = V_Motion_Sensor_1;
    if(Motion_Sensor_1_State == HIGH)
    {
    Serial.println("Movimento (1)");    // Stampa su Seriale 
    lcd.clear();
    lcd.setCursor(0, 1);
    lcd.print(F("Corridoio"));                 // Stampa su LCD
    lcd.setCursor(0, 2);
    lcd.print(F("***** APERTA *****"));
    digitalWrite(Led_Red, HIGH);                  // Accende LED Rosso
    digitalWrite(Sirena, LOW);                    // Accende SIRENA
    }
    else{
    Serial.println("NO Movimento (0)");
    lcd.clear();
    Print_Menu();                                 // Ritorna al Menu Principale
    digitalWrite(Led_Red, LOW);                   // Spegne LED Rosso
    digitalWrite(Sirena, HIGH);                   // Spegne SIRENA
  }
}
}

Il problema è molto semplice da risolvere, devi cambiare la logica con la quale si accende il led. Quando ad esempio rilevi un movimento non devi accendere il led ma fai variare lo stato di una variabile ed in seguito controlli il suo stato per accendere o meno il led.

Ti faccio un esempio

bool statoLed = 0;

if (sensoreMovimento == HIGH)    // vuol dire che ho rilevato un movimento
    statoLed = 1;

if (sensoreFinestra == HIGH)    // qualcuno ha aperto la finestra
    statoLed = 1;

if (statoLed)
    digitalWrite(Led_Red, HIGH);                  // Accende LED Rosso

Queste è un esempio solo per spiegarti la logica, poi magari metti che dopo un tempo accettabile che non rilevi movimenti o non viene aperta nessuna porta/finestra fai diventare lo stato del led di nuovo 0. Così il led rimane acceso per tutto il tempo necessario a dare l'allarme.

  1. L' impianto elettrico deve essere certificato. Non puoi modificarlo fai da te.
  2. un sistema d' alarme deve essere sicuro, funzionante e affidabile. Comprati uno comerciale.
    Ciao Uwe

Dai non smontare i suoi progetti così! :cry:

Alla fine per iniziare ad usare Arduino va più che bene l'allarme che sta facendo, poi certo non è che può farci affidamento per la cassa forte di una banca...

I progetti di Domotica, per quel poco che ne so, non involvono l'impianto elettrico e la sua modifica, per lo meno non per forza

zioCri:
Dai non smontare i suoi progetti così! :cry:

Alla fine per iniziare ad usare Arduino va più che bene l'allarme che sta facendo, poi certo non è che può farci affidamento per la cassa forte di una banca...

I progetti di domotica, per quel poco che ne so, non involvono l'impianto elettrico e la sua modifica, per lo meno non per forza

Ci sono cose che non si possono fare da privati perché la legge non lo promette oppure ci sono altre conseguenze come un assicurazione che non paga dopo un incendio o un furto.
Uno é un impianto elettrico civile.
Un altra cosa che non é cosí semplice come si pensa sono sistemi di alarme che devono rilevare sicuramente un intrusione, non segnare un alarme che non c'é, che funziona 24 ore su 24, 7 giorni su 7 e 365 / 366 giorni all anno. Deve essere costruito in modo da rilevare un guasto / un sabotaggio con batteria tampone, con un modem da segnalare via tel un alarme. Tutto questo é complicato e costa. A quel punto un sistema comerciale costa di meno ed é piu affidabile.

Ciao Uwe

Che legge mi impedisce di fare un sistema di allarme per uso proprio???
è un sistema a 12 v con cavi CAT5 (cavi certificati e schermati, non fatti in casa).
le possibilità di incendio saranno molto inferiore ad un normale impianto di casa.
Non ho un assicurazione ad incendio e furto, e non la avrò mai.
è un progetto complicato con un costo non così alto quando credi.

Quello che intende dire @uwefed non è che nonb puoi fartelo, è che per raggiungere una qualità decente dovrai spendere molto e quella cifra che spenderai si avvicinerà drasticamente ad un impianto commerciale.
Le due cose poi si sono leggermete sovrapposte, ovvero la modifica ad un impianto civile (vietata) e che non rientra direttamente nella costruzione dell'allarme e l'allarme stesso.
Entrando direttamente nel merito del codice e della richiesta ti posso indicare qualcosa che probabilmente ti darà problemi sulla lunga distanza, ad ogni ciclo di loop scrivi sul'lcd (credo visto che non è riportato) a mezzo della Print_Menu. Seconda cosa stai cercando di mischiare impainto domotico con allarme, non è una buona idea, ti conviene separare in toto i due progetti e farli comunicare in qualche modo (seriale, RS485, wifi, ecc.) perché la complessità delle due cose mal si sposa con Arduino e secondariamente un sistema d'allarme dovrebbe essere isolato dal resto per svariati motivi, il primo dei quali è che deve rispondere il più rapidamente possibile agli eventi e se la parte domotica sta impegnando risorse per far dell'altro... considera che non è possibile gestire più thread su Arduino come faresti su un PC quindi trai le tue conclusioni.
Poi non hai menzionato nulla della parte hardware ma crddo tu stia usando una scheda relé commerciale giusto? Se è così da codice vedo che correttamente attivi la sirena mandando a LOW il pin, è un errore in un sistema d'allarme, la sirena deve attivarsi in caso di mancanza di comunicazione tra lei e la centrale altrimenti ti tagliano il filo di alimentazione e sei fregato, l'hai contemplato?
Inoltre tutti gli ingressi ed uscite dovrebbero essere protetti da optoisolatori, questa cosa ti conviene contemplarla sin da subito.
Per finire non credere che un sistema d'allarme anche auto costruito non debba sottostare a specifiche regole che possono variare da comune a comune, quindi se in caso d'allarme, vero o presunto, il tuo sistema attacca a suonare all'infinito i vicini possono denunciarti (e se mi dici che non hai vicini allora ti dico che la sirena manco ti serve :slight_smile: ), questo per dirti di documentarti per bene prima di procedere con il tuo progetto, lo dimensionerai e costruirai al meglio