Advertisement
TolentinoCotesta

Segnalazione Allarmi V2.

Aug 13th, 2018
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.77 KB | None | 0 0
  1. // commenta la seguente riga per disattivare il debug sulla serial
  2. //#define DEBUG
  3. #ifdef DEBUG
  4.   #define DEBUG_PRINT(...) Serial.print(__VA_ARGS__)
  5.   #define DEBUG_PRINTLN(...) Serial.println(__VA_ARGS__)
  6. #else
  7.   #define DEBUG_PRINT(...)
  8.   #define DEBUG_PRINTLN(...)
  9. #endif
  10.  
  11. typedef struct {
  12.   String name;
  13.   uint8_t inpPin;  //variabile sarà un intero da 8 bit senza segno (unsigned int 8 bit)
  14.   uint8_t ledPin;
  15.   boolean activeState = LOW;
  16.   boolean actualState = LOW;
  17.   // Aggiungiamo una nuova "proprietà" alla struttura che rappresenta ciascun sensore
  18.   boolean alarmState = LOW;
  19. } sensor_n;
  20.  
  21. // Usiamo un array per contenere tutti i nostri sensori, cosi possiamo scorrere l'array
  22. // per richiamare rapidamente le proprietà dei sensori durante l'esecuzione
  23. #define CHECKTIME 5000  // 5 secondi
  24. #define NUM_MAX_SENSORS 15
  25. uint8_t numSensors = 0;
  26. sensor_n sensors[NUM_MAX_SENSORS];
  27.  
  28. const uint8_t inpReset=3;
  29. const uint8_t outBuzzer = 9;
  30. const uint8_t ledMaster=4;
  31.  
  32. // Confrontando systemState con systemOld nel loop principale posso capire quando c'è un cambiamento
  33. uint16_t systemState, systemOld;
  34. bool alarm, mute = false;
  35.  
  36. #define BLINKTIME 500
  37. uint32_t  blinkTime = millis();
  38. boolean blink;
  39.  
  40. // Prototipi delle funzioni usate
  41. bool add_sensor(String _name, uint8_t _inpPin, uint8_t _ledPin, boolean _activeState = LOW);
  42. void init_sensor();
  43.  
  44.  
  45. void setup() {
  46.   Serial.begin(9600);
  47.   DEBUG_PRINTLN("Start");
  48.   pinMode(outBuzzer, OUTPUT);  
  49.   pinMode(ledMaster, OUTPUT);
  50.   pinMode(inpReset, INPUT);     // Pulsante di reset a pull-down  
  51.  
  52.   // Per aggiungere ulteriori sensori è sufficiente chiamare la funzione
  53.   // add_sensor(nome sensore, pin input, pin led, stato di allarme attivo);
  54.   add_sensor("Left door", 2, 13);
  55.   add_sensor("Right door", 5, 12);
  56.   add_sensor("Oil pressure", 8, 7, LOW);
  57.   //add_sensor("Oil level", 10, 11, HIGH);
  58.   // La funzione init_sensor imposta gli ingressi e le uscite precedentemente definite
  59.   init_sensor();  
  60. }   // End setup()
  61.  
  62.  
  63. void loop() {
  64.  
  65.   // Metto ad 1 il bit 16 solo per visualizzare sempre un numero binario della stessa lunghezza nel monitor seriale
  66.   systemState = 0x8000;   // 0b1000 0000 0000 0000  ->  In questo modo posso usare fino ad un massimo di 15 sensori.
  67.   for (int i=0; i<numSensors; i++){    
  68.     delay(80);
  69.     sensors[i].actualState = digitalRead(sensors[i].inpPin);    
  70.    
  71.     // Se il sensore n si trova nello stato "attivo", ho la segnalazione di allarme  
  72.     // di cui tengo traccia aggiungendo 1 alla variabile systemState (in funzione della posizione del sensore)
  73.     // Esempio: systemState = 0b1000 0000 0000 0001    bit14: sensors[14] bit6: sensors[6] ... ... bit0: sensors[0]
  74.     if(sensors[i].actualState == sensors[i].activeState){        
  75.       // Questa istruzione aggiunge il valore 1 shiftato di "i" a sinistra alla variabile systemState
  76.       systemState += 0x8000 << i;  
  77.       sensors[i].alarmState = true;
  78.     }      
  79.    
  80.   }
  81.  
  82.   // C'è variazione negli ingressi, attiviamo il master warning se systemState > 0b10000001
  83.   if(systemState != systemOld){    
  84.     if(systemState > 0x8000){
  85.       alarm = true;  
  86.       mute = false;
  87.     }
  88.     systemOld = systemState;
  89.    
  90.     // Qualche informazione utile per il debug
  91.     for (int i=0; i<numSensors; i++){    
  92.       DEBUG_PRINT(sensors[i].name);    
  93.       DEBUG_PRINT(": ");
  94.       DEBUG_PRINTLN(sensors[i].actualState);  
  95.     }  
  96.     DEBUG_PRINT("\nSystem state: ");
  97.     DEBUG_PRINTLN(systemState, BIN);  
  98.   }
  99.  
  100.   // Taciatiamo l'allarme alla pressione del pulsante di reset
  101.   boolean reset = digitalRead(inpReset);  
  102.   if ((reset)&&(!mute)){    
  103.     delay(100);   // debounce del pulsante
  104.     mute = true;
  105.     DEBUG_PRINTLN("Reset");    
  106.   }
  107.   else if(reset){
  108.     for (int i=0; i<numSensors; i++){  
  109.       if(sensors[i].actualState != sensors[i].activeState){
  110.         sensors[i].alarmState = false;
  111.         digitalWrite(sensors[i].ledPin, LOW);
  112.       }
  113.     }
  114.     digitalWrite(ledMaster,LOW);
  115.   }
  116.  
  117.   if (alarm && !mute){    
  118.     if(blink)
  119.       tone(outBuzzer, 2000);
  120.     else
  121.       tone(outBuzzer, 1000);
  122.   }
  123.   else {
  124.     noTone(outBuzzer);        
  125.   }
  126.  
  127.   for (int i=0; i<numSensors; i++){  
  128.     if((sensors[i].actualState == sensors[i].activeState)&&(sensors[i].alarmState)){
  129.       digitalWrite(sensors[i].ledPin, HIGH);
  130.       digitalWrite(ledMaster, HIGH);
  131.       sensors[i].alarmState = true;
  132.     }
  133.     else if(sensors[i].alarmState){
  134.       digitalWrite(sensors[i].ledPin, blink);  
  135.       digitalWrite(ledMaster, blink);    
  136.     }
  137.   }
  138.  
  139.   // Uso una variabile globale per avere sempre lo stesso timing per il blink
  140.   if(millis() - blinkTime > BLINKTIME){
  141.     blinkTime = millis();
  142.     blink = !blink;
  143.   }
  144.  
  145. }   // End loop()
  146.  
  147.  
  148. // Usiamo questa funzione per popolare il nostro array che contiene la definizione dei sensori
  149. bool add_sensor(String _name, uint8_t _inpPin, uint8_t _ledPin, boolean _activeState = LOW){
  150.   int num = numSensors;
  151.   numSensors++;
  152.   if ( numSensors > NUM_MAX_SENSORS ){
  153.     return false ; // raggiunto il numero massimo di sensori supportato
  154.   }
  155.   sensors[num].name = _name;
  156.   sensors[num].inpPin = _inpPin;
  157.   sensors[num].ledPin = _ledPin;
  158.   sensors[num].activeState = _activeState;
  159.   return true;
  160. }
  161.  
  162.  
  163.  // con questa funzione inizializziamo i sensori secondo i pin a cui sono collegati
  164. void init_sensor(){  
  165.   digitalWrite(ledMaster, HIGH);
  166.   for (uint8_t i=0; i<numSensors; i++){
  167.     pinMode(sensors[i].inpPin, INPUT);
  168.     pinMode(sensors[i].ledPin, OUTPUT);
  169.     DEBUG_PRINT("Set pin mode for sensor: ");      
  170.     DEBUG_PRINTLN(sensors[i].name);
  171.     digitalWrite(sensors[i].ledPin, HIGH);
  172.   }  
  173.   delay(CHECKTIME);
  174.   for (uint8_t i=0; i<numSensors; i++){
  175.     digitalWrite(sensors[i].ledPin, LOW);
  176.   }
  177.   digitalWrite(ledMaster, LOW);
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement