Fotoresistenza e sensore di movimento

Ciao tutti,

Sto cercando di fare accendere un faro in caso di movimento solo la notte.
Ma mi si accende sempre… non capisco dove sbaglio?

Mi sembra di chiedere che, se la fotoresistenza dà un valore superiore a 600 la luce dove essere sempre spenta, in alternativa si accende se c’è un movimento (di notte).

Invece si accende sempre anche di giorno. Dove sbaglio??

/////////////////////////////
//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 = 10000;  

boolean lockLow = true;
boolean takeLowTime; 

const int sensorLuce = A0;
int sensorValue = 0;

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


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

  //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(){
  
  sensorValue = analogRead(sensorLuce);
  //Serial.print("valore : ");
  //Serial.println(sensorValue);
  
  if (sensorLuce > 600) {
    digitalWrite (ledPin, LOW);
  
  } else 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);
           }
       }
  }

Hai verificato che i valori ricevuti dalla fotoresistenza siano coerenti con la situazione?

Ciao Roberto, Grazie per l'aiuto!

Si ho controllato prima il valore che mi dava la foto resistenza e ho impostato un valore inferiore (600) così che, in teoria, se il valore dato dalla fotoresistenza è superiore al valore impostato (600) Arduino non manda niente al ledPin, ma non funziona si accende lo stesso la luce.

Non capisco dove sbaglio :(

Mi permetto di ricordare che la fotoresistenza lavora con un partitore di tensione, quindi al aumentare della conducibilità Arduino può notare o un aumento del valore letto o una diminuzione in base a come sono disposte resistenza e fotoresistenza.

Hai provato ad escludere il pir e provando a pilotare il LED solo in base alla fotoresistenza?

Hai parecchia confusione in testa ...

  1. SE stai leggendo un segnale analogico, NON occorre che dichiari pinMode(sensorLuce, INPUT); dato che quello serve per le letture digitali.

  2. non vedi che stai leggendo il valore "sensorValue = analogRead(sensorLuce);" in sensorValue (giustamente) e poi invece fai il confronto con il numero del pin "if (sensorLuce > 600) {...}" (sensorLuce vale A0).

  3. questo è il risultato di un cattivo copia/incolla (... forse [u]senza ben capire[/u] quello che fa) di un programma per la gestione di un PIR (che normalmente ha un uscita digitale) con l'idea di usare una fotoresistenza (segnale analogico) ;)

Guglielmo

@Roberto no non ho provato, ho solo provato a vedere nel serial se la fotoresistenza mi dava un valore e quale.

@Gugliermo Grazie! non avevo visto questa sera provo.

Vi faccio sapere, in tanto grazie!

Wado: @Roberto no non ho provato, ho solo provato a vedere nel serial se la fotoresistenza mi dava un valore e quale.

Direi che ora diventerà inutile, visto che Guglielmo che ha l'occhio più sveglio del mio ha individuato in poco tempo il problema. :D Per il futuro, ridurre le variabili da considerare con qualche test rende molto più facile l'individuazione del errore. Probabilmente confrontandoti con solo due o tre righe di codice il problema sarebbe saltato fuori.

Bene, Guglielmo aveva visto giusto e adesso riesco ad accendere la luce solo quando il valore della fotoresistenza è superiore al valore impostato.
Grazie grazie mille!

GRAZIE!

//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 = 10000;  

boolean lockLow = true;
boolean takeLowTime; 

const int sensorLuce = A0;
int sensorValue = 0;

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



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(){
  
  sensorValue = analogRead(sensorLuce);
  //Serial.print("valore : ");
  //Serial.println(sensorValue);
  
  if (sensorValue > 600) {
    digitalWrite (ledPin, LOW);
  
  } else 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);
           }
       }
  }

... ma li guardate i vostri post dopo aver schiacciato il bottone "Post" ? ? ? :o

Wado ... per favore, sistema i tag CODE che ce ne devi avere uno di troppo ... non vedi come è il tuo post ?

Guglielmo