AllertaDuino

Un'idea di sistema d'allarme casalingo

Primi test con sensore PIR (Davide)

Dunque ho iniziato a fare qualche test con un sensore PIR (questo), disponibile per circa 10€ un pò ovunque (nei vari fornitori indicati nel wiki).

Innanzitutto un pò di dettagli non specificati nel datasheet: - il tempo di calibrazione necessario al sensore quando viene acceso è di 30s; se non lo rispettate, il sensore darà dei falsi positivi all'inizio fino a che non si sarà stabilizzato - l'alimentazione indicata è 12V tuttavia funziona anche alimentato a 7V o addirittura da USB; l'unica cosa da considerare è che con alimentazioni troppo basse il sensore è meno sensibile.

Detto questo, il test in questione, consiste nel far funzionare il PIR contando gli allarmi rilevati con un piccolo contatore binario a 5 bit. Lo script d'esempio da cui sono partito è questo.

Di seguito riporto il mio script completo:

int pirPin = 12; 
//int check = 2;
int counter[5]={0,0,0,0,0};
int load1=9, load2=2;
 
//the time we give the sensor to calibrate (10-60 secs according to the datasheet)
int calibrationTime = 30;
 
//Contatore binario: ad ognuno dei 5 elementi di counter[] associo un led che è acceso se 1 spento se 0
void count(int pin){
  if(pin == 7){
    if(counter[pin-3] == 0){
      digitalWrite(pin, HIGH);
      counter[pin-3]=1;
    }else{
      //se ho finito i bit disponibili azzero il contatore
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      counter[0]=0;
      counter[1]=0;
      counter[2]=0;
      counter[3]=0;
      counter[4]=0;
    }  
  }else{
    if(counter[pin-3] == 0){
      digitalWrite(pin, HIGH);
      counter[pin-3]=1;
    }else{
      digitalWrite(pin, LOW);
      counter[pin-3]=0;
      count(pin+1);
    }
  }  
}
 
 
void setup(){
 Serial.begin(9600); 
 pinMode(pirPin, INPUT);
 pinMode(load1, OUTPUT);
 pinMode(load2, OUTPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(6, OUTPUT);
 pinMode(7, OUTPUT);
 
 //do al sensore il tempo di calibrarsi per evitare i falsi positivi all'accensione della scheda
 //uso due led di stato per avere un feedback su quello che sta succedendo
 digitalWrite(load1, HIGH);
 Serial.print("calibrating sensor ");
   for(int i = 0; i < calibrationTime; i++){
     Serial.print(".");
     digitalWrite(load2, HIGH);
     delay(500); 
     digitalWrite(load2, LOW);
     delay(500);
   }
   Serial.println(" done");
   Serial.println("SENSOR ACTIVE");
   delay(50);
   digitalWrite(load1, LOW);
}
 
 
void loop(){
 
 
  int pirVal = digitalRead(pirPin);
 
  if(pirVal == LOW){ //was motion detected
    Serial.println("ALARM"); 
    digitalWrite(load2, HIGH);   // turn the LED on (HIGH is the voltage level)
    count(3);
    delay(1000);               // wait for 1 second
    digitalWrite(load2, LOW);   // turn the LED on (HIGH is the voltage level)
    delay(1000);               // wait for 1 second
 
  }
 
}

E una foto delle connessioni:

AGGIORNAMENTO: YUN (Davide)

Dunque sto provando ora a fare quello indicato sopra con lo yun aggiungendo qualche funzionalità; nello specifico quando scatta l'allarme faccio inviare allo yun una mail di avviso tramite wifi con una foto in allegato (per ora la foto è un'img statica, poi proverò a scattarne una in realtime con una webcam).

Sto notando qualche problema di falsi positivi: nei test iniziali, anche con i 30 secondi di delay (li ho aumentati fino a 60) segnala un allarme e poi si stabilizza. Sospetto che ci sia un problema dovuto all'alimentazione del sensore che in questo caso arriva direttamente dai 5V dello yun mentre prima arrivavano i 7-12V dal Vin dell'arduinoUNO. Inoltre ho il sospetto che venga fornito anche un amperaggio minore rispetto all'UNO (il Vin dello yun infatti non alimenta correttamente il sensore pur essendo sempre 5V). Sto facendo qualche prova (devo provare ad alimentare separatamente il sensore) poi una volta risolti i problemi aggiungerò lo sketch modificato, la descrizione di quello che va fatto e una foto delle connessioni.

AGGIORNAMENTO: **Libreria** C++ (giuscri)

Ho provato a scrivere un paio di librerie in C++ per gestire AllertaDuino. Qui i file che servono per compilare. E' sicuramente da sistemare: pullate!

  • Da github, invece di clonare la repo scaricate direttamente l'archivio in .zip. Dalla IDE dovreste essere in grado di importare la libreria lasciando fare tutto il lavoro a lei. Vedi qui per chiarimenti. La gerarchia delle cartelle dovrebbe essere tale da poter richiamare gli esempi direttamente dalla IDE.
  • Qui un modo per scrivere librerie in C++ (pare sia possibile farlo anche in C, senza supporto nativo alle classi.)

Segue lo sketch pensato per fare la stessa cosa dello sketch di Davide

// MainSketch.ino
 
#include "PIR.h"
#include "BinaryCalculator.h"
 
// Def+init of a instance of a
// PIR-obj wired at Pin 2..
PIR p(2);
 
// Def+init of a instance of a
// BinaryCalculator-obj that shows
// results at led's wired at pins
// 3, 4, 5, 6 and 7 ...
int pins[] = {3, 4, 5, 6, 7};
BinaryCalculator b(pins, 5);
 
void setup() {
    Serial.begin(9600);
}
 
void loop() {
 
    for (; !p.motionDetected(); p.detectMotion());
 
    Serial.println("Motion detected!");
 
    b.incrementByOne();
 
    delay(2000);
 
}

FIXME === A proposito dell'USB infrared toy v2 (giuscri) === http://www.lirc.org/, http://www.lirc.org/git.html, http://dangerousprototypes.com/forum/viewtopic.php?f=29&t=4747#p50525, http://lxr.free-electrons.com/source/include/media/rc-map.h

pub/arduino/allertaduino.txt · Last modified: 2014/02/08 18:30 by giuscri
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0