come riesco a controllare il sensore PIR

ciao a tutti

ho comprato un sensore PIR questo modello :http://cgi.ebay.it/ws/eBayISAPI.dll?ViewItemVersion&item=320904743545&view=all&tid=934658652011 solo che ha qualche problema ho scritto un programmino , per farlo funzionare , solo quando mi muovo davanti a sensore non mi accende il led, quando tocco dietro a sensore , si accende e si spegne , che consigli mi date?per favore

grazie

adesso mi funziona solo avevo un è problema il sensore ha temporizzatore sulla scheda , che mi spegni e mi accendo per conto suo , potrei disattivarlo con arduino , in senso che non posso comandarlo io i tempi quanti minuti deve essere acceso il led??

aspetto una vostra riposta

grazie mille

Ciao Idro, purtroppo non riesco ad accedere al link postato quindi non vedo che tipo di sensore hai acquistato. Inoltre, potresti inserire qui il codice che usi per lo sketch e uno schema dei collegamenti. Così forse riusciamo ad aiutarti. Ci servono più informazioni --> http://arduino.cc/forum/index.php/topic,91560.0.html

Ti linko una pagina che spiega il funzionamento dei PIR --> http://www.logicaprogrammabile.it/come-creare-sistema-di-allarme-arduino/ oppure --> http://bildr.org/2011/06/pir_arduino/

PaoloP: Ciao Idro, purtroppo non riesco ad accedere al link postato quindi non vedo che tipo di sensore hai acquistato. Inoltre, potresti inserire qui il codice che usi per lo sketch e uno schema dei collegamenti. Così forse riusciamo ad aiutarti. Ci servono più informazioni --> http://arduino.cc/forum/index.php/topic,91560.0.html

Ti linko una pagina che spiega il funzionamento dei PIR --> http://www.logicaprogrammabile.it/come-creare-sistema-di-allarme-arduino/ oppure --> http://bildr.org/2011/06/pir_arduino/

grazie mille per la riposta il link è spero che funziona : http://www.ebay.it/itm/1x-HC-SR501-PIR-Human-Motion-Sensor-Body-Pyroelectric-Infrared-SR501-Detector?item=320904743545&cmd=ViewItem&_trksid=p5197.m7&_trkparms=algo%3DLVI%26itu%3DUCI%26otn%3D5%26po%3DLVI%26ps%3D63%26clkid%3D1177676413444405720

const int sensore=2; const int led=13;

void setup(){

pinMode(sensore,INPUT); pinMode(led,OUTPUT); } void loop(){ int val=digitalRead(sensore); if(val==HIGH){ digitalWrite(led,HIGH);

}

}

Per i pir perchè non usi questo tutorial è commentato piuttosto bene il codice:
http://arduino.cc/playground/Code/PIRsense

C'è anche questa altro tutorial --> http://www.ladyada.net/learn/sensors/pir.html Il chip di controllo è lo stesso anche se cambia qualcosa nella componentistica.

grazie a tutti per i consigli ,

ma volevo chiedere la resistenza pullup devo mettere per forza? scusatemi per ignoranza ma a che cosa serve questa resistenza ??

grazie

scusatemi ma questo codice va bene accendere e spegnere la luce quando qualcuno entra si accende la luce e quando esce si spegne con un sensore di movimento PIR. possibile fare questo programmino??

ho scrittp questo codice ma non funziona:

int led=13; int PIR=2; bool sensore=false;

void setup(){

pinMode(led,OUTPUT); pinMode(PIR,INPUT);

}

void loop(){

int valore=digitalRead(PIR);

if(valore==HIGH) { if(sensore) sensore=false; else sensore=true; }

if(sensore) digitalWrite(led,HIGH); else digitalWrite(led,LOW);

}

aspetto una vostra riposta grazieee

Prova un pò cosi informandomi ho letto che c’è bisogno della calibrazione del sensore :grin:

int calibrationTime = 30;        
long unsigned int lowIn;         
long unsigned int pause = 5000;  
boolean lockLow = true;
boolean takeLowTime;  
int pirPin = 2;    //the digital pin connected to the PIR sensor's output
int ledPin = 13;

bool sensore=false;
void setup(){
  Serial.begin(9600);
  pinMode(pirPin, INPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(pirPin, LOW);

  //give the sensor some time to calibrate
  Serial.print("calibrating sensor ");
    for(int i = 0; i < calibrationTime; i++){
      Serial.print(".");
      delay(1000);
      }
    Serial.println(" done");
    Serial.println("SENSOR ACTIVE");
    delay(50);
  }
void loop(){
  
  int valore=digitalRead(pirPin);
  
  if(valore==HIGH)
  {
    if(sensore)
    sensore=false;
    else
    sensore=true;
  }
  
  if(sensore)
  digitalWrite(ledPin,HIGH);
  else
  digitalWrite(ledPin,LOW);

}

Madwriter:
Prova un pò cosi informandomi ho letto che c’è bisogno della calibrazione del sensore :grin:

int calibrationTime = 30;        

long unsigned int lowIn;         
long unsigned int pause = 5000; 
boolean lockLow = true;
boolean takeLowTime; 
int pirPin = 2;    //the digital pin connected to the PIR sensor’s output
int ledPin = 13;

bool sensore=false;
void setup(){
  Serial.begin(9600);
  pinMode(pirPin, INPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(pirPin, LOW);

//give the sensor some time to calibrate
  Serial.print(“calibrating sensor “);
    for(int i = 0; i < calibrationTime; i++){
      Serial.print(”.”);
      delay(1000);
      }
    Serial.println(" done");
    Serial.println(“SENSOR ACTIVE”);
    delay(50);
  }
void loop(){
 
  int valore=digitalRead(pirPin);
 
  if(valore==HIGH)
  {
    if(sensore)
    sensore=false;
    else
    sensore=true;
  }
 
  if(sensore)
  digitalWrite(ledPin,HIGH);
  else
  digitalWrite(ledPin,LOW);

}

grazie mille per la riposta ,

solo che non funziona mi da questo messaggio su serial : calibrating sensor … done
SENSOR ACTIVE

e poi non fa piu niente

prova cosi:

int calibrationTime = 30;        
long unsigned int lowIn;         
long unsigned int pause = 5000;  
boolean lockLow = true;
boolean takeLowTime;  
int pirPin = 2;    //the digital pin connected to the PIR sensor's output
int ledPin = 13;

bool sensore=false;
void setup(){
  Serial.begin(9600);
  pinMode(pirPin, INPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(pirPin, LOW);

  //give the sensor some time to calibrate
  Serial.print("calibrating sensor ");
    for(int i = 0; i < calibrationTime; i++){
      Serial.print(".");
      delay(1000);
      }
    Serial.println(" done");
    Serial.println("SENSOR ACTIVE");
    delay(50);
  }
void loop(){
  

  
   if(digitalRead(pirPin) == HIGH)
  {
    if(sensore)
    sensore=false;
    else
    sensore=true;
  }
  
  if(sensore)
  digitalWrite(ledPin,HIGH);
  else
  digitalWrite(ledPin,LOW);

}

anche se ti consiglio di provare prima questo:

/* 
 * //////////////////////////////////////////////////
 * //making sense of the Parallax PIR sensor's output
 * //////////////////////////////////////////////////
 *
 * Switches a LED according to the state of the sensors output pin.
 * Determines the beginning and end of continuous motion sequences.
 *
 * @author: Kristian Gohlke / krigoo (_) gmail (_) com / http://krx.at
 * @date:   3. September 2006 
 *
 * kr1 (cleft) 2006 
 * released under a creative commons "Attribution-NonCommercial-ShareAlike 2.0" license
 * http://creativecommons.org/licenses/by-nc-sa/2.0/de/
 *
 *
 * The Parallax PIR Sensor is an easy to use digital infrared motion sensor module. 
 * (http://www.parallax.com/detail.asp?product_id=555-28027)
 *
 * The sensor's output pin goes to HIGH if motion is present.
 * However, even if motion is present it goes to LOW from time to time, 
 * which might give the impression no motion is present. 
 * This program deals with this issue by ignoring LOW-phases shorter than a given time, 
 * assuming continuous motion is present during these phases.
 *  
 */

/////////////////////////////
//VARS
//the time we give the sensor to calibrate (10-60 secs according to the datasheet)
int calibrationTime = 30;        

//the time when the sensor outputs a low impulse
long unsigned int lowIn;         

//the amount of milliseconds the sensor has to be low 
//before we assume all motion has stopped
long unsigned int pause = 5000;  

boolean lockLow = true;
boolean takeLowTime;  

int pirPin = 2;    //the digital pin connected to the PIR sensor's output
int ledPin = 13;


/////////////////////////////
//SETUP
void setup(){
  Serial.begin(9600);
  pinMode(pirPin, INPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(pirPin, LOW);

  //give the sensor some time to calibrate
  Serial.print("calibrating sensor ");
    for(int i = 0; i < calibrationTime; i++){
      Serial.print(".");
      delay(1000);
      }
    Serial.println(" done");
    Serial.println("SENSOR ACTIVE");
    delay(50);
  }

////////////////////////////
//LOOP
void loop(){

     if(digitalRead(pirPin) == HIGH){
       digitalWrite(ledPin, HIGH);   //the led visualizes the sensors output pin state
       if(lockLow){  
         //makes sure we wait for a transition to LOW before any further output is made:
         lockLow = false;            
         Serial.println("---");
         Serial.print("motion detected at ");
         Serial.print(millis()/1000);
         Serial.println(" sec"); 
         delay(50);
         }         
         takeLowTime = true;
       }

     if(digitalRead(pirPin) == LOW){       
       digitalWrite(ledPin, LOW);  //the led visualizes the sensors output pin state

       if(takeLowTime){
        lowIn = millis();          //save the time of the transition from high to LOW
        takeLowTime = false;       //make sure this is only done at the start of a LOW phase
        }
       //if the sensor is low for more than the given pause, 
       //we assume that no more motion is going to happen
       if(!lockLow && millis() - lowIn > pause){  
           //makes sure this block of code is only executed again after 
           //a new motion sequence has been detected
           lockLow = true;                        
           Serial.print("motion ended at ");      //output
           Serial.print((millis() - pause)/1000);
           Serial.println(" sec");
           delay(50);
           }
       }
  }

poi nel caso lo modifichiamo come vuoi tu :smiley:

Madwriter:
prova cosi:

int calibrationTime = 30;        

long unsigned int lowIn;         
long unsigned int pause = 5000; 
boolean lockLow = true;
boolean takeLowTime; 
int pirPin = 2;    //the digital pin connected to the PIR sensor’s output
int ledPin = 13;

bool sensore=false;
void setup(){
  Serial.begin(9600);
  pinMode(pirPin, INPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(pirPin, LOW);

//give the sensor some time to calibrate
  Serial.print(“calibrating sensor “);
    for(int i = 0; i < calibrationTime; i++){
      Serial.print(”.”);
      delay(1000);
      }
    Serial.println(" done");
    Serial.println(“SENSOR ACTIVE”);
    delay(50);
  }
void loop(){

if(digitalRead(pirPin) == HIGH)
  {
    if(sensore)
    sensore=false;
    else
    sensore=true;
  }
 
  if(sensore)
  digitalWrite(ledPin,HIGH);
  else
  digitalWrite(ledPin,LOW);

}



anche se ti consiglio di provare prima questo:



/*

  • //////////////////////////////////////////////////
  • //making sense of the Parallax PIR sensor’s output
  • //////////////////////////////////////////////////
  • Switches a LED according to the state of the sensors output pin.
  • Determines the beginning and end of continuous motion sequences.
  • @author: Kristian Gohlke / krigoo () gmail () com / http://krx.at
  • @date:   3. September 2006
  • kr1 (cleft) 2006
  • released under a creative commons “Attribution-NonCommercial-ShareAlike 2.0” license
  • http://creativecommons.org/licenses/by-nc-sa/2.0/de/
  • The Parallax PIR Sensor is an easy to use digital infrared motion sensor module.
  • (http://www.parallax.com/detail.asp?product_id=555-28027)
  • The sensor’s output pin goes to HIGH if motion is present.
  • However, even if motion is present it goes to LOW from time to time,
  • which might give the impression no motion is present.
  • This program deals with this issue by ignoring LOW-phases shorter than a given time,
  • assuming continuous motion is present during these phases.

    */

/////////////////////////////
//VARS
//the time we give the sensor to calibrate (10-60 secs according to the datasheet)
int calibrationTime = 30;

//the time when the sensor outputs a low impulse
long unsigned int lowIn;

//the amount of milliseconds the sensor has to be low
//before we assume all motion has stopped
long unsigned int pause = 5000;

boolean lockLow = true;
boolean takeLowTime;

int pirPin = 2;    //the digital pin connected to the PIR sensor’s output
int ledPin = 13;

/////////////////////////////
//SETUP
void setup(){
  Serial.begin(9600);
  pinMode(pirPin, INPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(pirPin, LOW);

//give the sensor some time to calibrate
  Serial.print(“calibrating sensor “);
    for(int i = 0; i < calibrationTime; i++){
      Serial.print(”.”);
      delay(1000);
      }
    Serial.println(" done");
    Serial.println(“SENSOR ACTIVE”);
    delay(50);
  }

////////////////////////////
//LOOP
void loop(){

if(digitalRead(pirPin) == HIGH){
       digitalWrite(ledPin, HIGH);   //the led visualizes the sensors output pin state
       if(lockLow){ 
         //makes sure we wait for a transition to LOW before any further output is made:
         lockLow = false;           
         Serial.println("—");
         Serial.print(“motion detected at “);
         Serial.print(millis()/1000);
         Serial.println(” sec”);
         delay(50);
         }         
         takeLowTime = true;
       }

if(digitalRead(pirPin) == LOW){       
       digitalWrite(ledPin, LOW);  //the led visualizes the sensors output pin state

if(takeLowTime){
        lowIn = millis();          //save the time of the transition from high to LOW
        takeLowTime = false;       //make sure this is only done at the start of a LOW phase
        }
       //if the sensor is low for more than the given pause,
       //we assume that no more motion is going to happen
       if(!lockLow && millis() - lowIn > pause){ 
           //makes sure this block of code is only executed again after
           //a new motion sequence has been detected
           lockLow = true;                       
           Serial.print(“motion ended at “);      //output
           Serial.print((millis() - pause)/1000);
           Serial.println(” sec”);
           delay(50);
           }
       }
  }



poi nel caso lo modifichiamo come vuoi tu :D

grazie mille per la risposta e per disponibilità.

ho provato tutte 2 programmi che mi hai scritto , solo che il led si accende e dopo 10 secondi si spegne automaticamente , quindi non lo so dove è il problema , sw o hw ?

mmm quali dei 2 funziona? credo che il pir funzioni cosi se va in HIGH ha rilevato qualcosa altrimenti va in LOW e giustamente il led si spegne. possiamo temporizzare la cosa tipo leggi high blocchi il loop per tipo 15 min se leggi low spegni,altrimenti se lo tieni tipo in una porta leggi high e accendi il led rileggi high e spegni il led. dipende che uso vuoi farne e dove hai messo il pir.

Madwriter: mmm quali dei 2 funziona? credo che il pir funzioni cosi se va in HIGH ha rilevato qualcosa altrimenti va in LOW e giustamente il led si spegne. possiamo temporizzare la cosa tipo leggi high blocchi il loop per tipo 15 min se leggi low spegni,altrimenti se lo tieni tipo in una porta leggi high e accendi il led rileggi high e spegni il led. dipende che uso vuoi farne e dove hai messo il pir.

allora il secondo fuonziona bene, io volevo posizionarlo in modo che ce qualcuno dentro stanza e si sta movendo il ensore rimanga sempre HIGH, invece quando esce dalla stanza il sensore deve diventare LOW, quindi non so precisamente quanti minuti ci vogliono .

spero che mi sono spiegato bene

scusa se ti muovi sempre ininterottamente avanti al sensore mica il led si spegne o alemeno se si spegne si riaccende poco dopo giusto?

fai così... se rileva movimento si accende e attribuisce millis+il tempo che vuoi che rimanga acceso a una variabile(ad esempio 45 secondi, così se per 10 secondi non sei in movimento non si spegne), e gli dici che quando millis uguale o maggiore alla tua variabile spegne il led... ovviamente il sistema di attribuzione lo metti in loop, così se rileva movimento continua a fare lo storage della variabile, e così ogni volta che fai movimento hai altri 45 secondi :D

l'avevo pensato anche io ma se lui entra e si mette sul letto?dopo 10 sec si spegne poi basta che dopo che mette HIGH fa un delay di 5 min e blocca il codice :P

Madwriter: l'avevo pensato anche io ma se lui entra e si mette sul letto?dopo 10 sec si spegne poi basta che dopo che mette HIGH fa un delay di 5 min e blocca il codice :P

no, se fa il delay, blocca tutto, e quindi non è in grado di leggere altri movimenti e resettare il timer... metti cche si vuole mettere a giocare a 1 2 3 stella il tuo metodo fallisce :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

con il mio, decide lui il tempo (io ho sparato 45 secondi, ma può anche mettere 5 minuti, così lui può stare fermo 5 minuti prima che si spenga la luce...

ripensandoci, potresti diventare campione del mondo di 1 2 3 stella, peccato che le olimpiadi stanno per finire 8)

infatti pensavo di bloccarlo a prescindere dai movimenti mm forse meglio la tua idea :grin: ma comunque meglio fare un clapper almeno quando è il tuo compleanno dopo la torta la tua stanza si trasforma in una discoteca ]:D

ma se lo deve posizionare in un magazzino, dove deve entrare pieno di scatoloni che non riesce neanche a premere l' interruttore, te con il clapper cosa vuoi fargli fare, questo???? :grin:

http://www.youtube.com/watch?v=EyLbWQrBBZg