Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // commenta la seguente riga per disattivare il debug sulla serial
- //#define DEBUG
- #ifdef DEBUG
- #define DEBUG_PRINT(...) Serial.print(__VA_ARGS__)
- #define DEBUG_PRINTLN(...) Serial.println(__VA_ARGS__)
- #else
- #define DEBUG_PRINT(...)
- #define DEBUG_PRINTLN(...)
- #endif
- typedef struct {
- String name;
- uint8_t inpPin; //variabile sarà un intero da 8 bit senza segno (unsigned int 8 bit)
- uint8_t ledPin;
- boolean activeState = LOW;
- boolean actualState = LOW;
- // Aggiungiamo una nuova "proprietà" alla struttura che rappresenta ciascun sensore
- boolean alarmState = LOW;
- } sensor_n;
- // Usiamo un array per contenere tutti i nostri sensori, cosi possiamo scorrere l'array
- // per richiamare rapidamente le proprietà dei sensori durante l'esecuzione
- #define CHECKTIME 5000 // 5 secondi
- #define NUM_MAX_SENSORS 15
- uint8_t numSensors = 0;
- sensor_n sensors[NUM_MAX_SENSORS];
- const uint8_t inpReset=3;
- const uint8_t outBuzzer = 9;
- const uint8_t ledMaster=4;
- // Confrontando systemState con systemOld nel loop principale posso capire quando c'è un cambiamento
- uint16_t systemState, systemOld;
- bool alarm, mute = false;
- #define BLINKTIME 500
- uint32_t blinkTime = millis();
- boolean blink;
- // Prototipi delle funzioni usate
- bool add_sensor(String _name, uint8_t _inpPin, uint8_t _ledPin, boolean _activeState = LOW);
- void init_sensor();
- void setup() {
- Serial.begin(9600);
- DEBUG_PRINTLN("Start");
- pinMode(outBuzzer, OUTPUT);
- pinMode(ledMaster, OUTPUT);
- pinMode(inpReset, INPUT); // Pulsante di reset a pull-down
- // Per aggiungere ulteriori sensori è sufficiente chiamare la funzione
- // add_sensor(nome sensore, pin input, pin led, stato di allarme attivo);
- add_sensor("Left door", 2, 13);
- add_sensor("Right door", 5, 12);
- add_sensor("Oil pressure", 8, 7, LOW);
- //add_sensor("Oil level", 10, 11, HIGH);
- // La funzione init_sensor imposta gli ingressi e le uscite precedentemente definite
- init_sensor();
- } // End setup()
- void loop() {
- // Metto ad 1 il bit 16 solo per visualizzare sempre un numero binario della stessa lunghezza nel monitor seriale
- systemState = 0x8000; // 0b1000 0000 0000 0000 -> In questo modo posso usare fino ad un massimo di 15 sensori.
- for (int i=0; i<numSensors; i++){
- delay(80);
- sensors[i].actualState = digitalRead(sensors[i].inpPin);
- // Se il sensore n si trova nello stato "attivo", ho la segnalazione di allarme
- // di cui tengo traccia aggiungendo 1 alla variabile systemState (in funzione della posizione del sensore)
- // Esempio: systemState = 0b1000 0000 0000 0001 bit14: sensors[14] bit6: sensors[6] ... ... bit0: sensors[0]
- if(sensors[i].actualState == sensors[i].activeState){
- // Questa istruzione aggiunge il valore 1 shiftato di "i" a sinistra alla variabile systemState
- systemState += 0x8000 << i;
- sensors[i].alarmState = true;
- }
- }
- // C'è variazione negli ingressi, attiviamo il master warning se systemState > 0b10000001
- if(systemState != systemOld){
- if(systemState > 0x8000){
- alarm = true;
- mute = false;
- }
- systemOld = systemState;
- // Qualche informazione utile per il debug
- for (int i=0; i<numSensors; i++){
- DEBUG_PRINT(sensors[i].name);
- DEBUG_PRINT(": ");
- DEBUG_PRINTLN(sensors[i].actualState);
- }
- DEBUG_PRINT("\nSystem state: ");
- DEBUG_PRINTLN(systemState, BIN);
- }
- // Taciatiamo l'allarme alla pressione del pulsante di reset
- boolean reset = digitalRead(inpReset);
- if ((reset)&&(!mute)){
- delay(100); // debounce del pulsante
- mute = true;
- DEBUG_PRINTLN("Reset");
- }
- else if(reset){
- for (int i=0; i<numSensors; i++){
- if(sensors[i].actualState != sensors[i].activeState){
- sensors[i].alarmState = false;
- digitalWrite(sensors[i].ledPin, LOW);
- }
- }
- digitalWrite(ledMaster,LOW);
- }
- if (alarm && !mute){
- if(blink)
- tone(outBuzzer, 2000);
- else
- tone(outBuzzer, 1000);
- }
- else {
- noTone(outBuzzer);
- }
- for (int i=0; i<numSensors; i++){
- if((sensors[i].actualState == sensors[i].activeState)&&(sensors[i].alarmState)){
- digitalWrite(sensors[i].ledPin, HIGH);
- digitalWrite(ledMaster, HIGH);
- sensors[i].alarmState = true;
- }
- else if(sensors[i].alarmState){
- digitalWrite(sensors[i].ledPin, blink);
- digitalWrite(ledMaster, blink);
- }
- }
- // Uso una variabile globale per avere sempre lo stesso timing per il blink
- if(millis() - blinkTime > BLINKTIME){
- blinkTime = millis();
- blink = !blink;
- }
- } // End loop()
- // Usiamo questa funzione per popolare il nostro array che contiene la definizione dei sensori
- bool add_sensor(String _name, uint8_t _inpPin, uint8_t _ledPin, boolean _activeState = LOW){
- int num = numSensors;
- numSensors++;
- if ( numSensors > NUM_MAX_SENSORS ){
- return false ; // raggiunto il numero massimo di sensori supportato
- }
- sensors[num].name = _name;
- sensors[num].inpPin = _inpPin;
- sensors[num].ledPin = _ledPin;
- sensors[num].activeState = _activeState;
- return true;
- }
- // con questa funzione inizializziamo i sensori secondo i pin a cui sono collegati
- void init_sensor(){
- digitalWrite(ledMaster, HIGH);
- for (uint8_t i=0; i<numSensors; i++){
- pinMode(sensors[i].inpPin, INPUT);
- pinMode(sensors[i].ledPin, OUTPUT);
- DEBUG_PRINT("Set pin mode for sensor: ");
- DEBUG_PRINTLN(sensors[i].name);
- digitalWrite(sensors[i].ledPin, HIGH);
- }
- delay(CHECKTIME);
- for (uint8_t i=0; i<numSensors; i++){
- digitalWrite(sensors[i].ledPin, LOW);
- }
- digitalWrite(ledMaster, LOW);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement