pessoal estou trabalhando em um projeto com ldr, porém o mesmo atua em tempo real, tipo quando a luz diminui a tal ponto imediatamente ele toma uma ação.

eu queria que o programa fizesse uma amostragem não precisa ser grande, somente para ter certeza que luz diminuiu mesmo e não é apenas um "pico" entenderam?

obrigado

Exibições: 882

Responder esta

Respostas a este tópico

Olá Rafael,

 

Da uma olhada nesse exemplo, nele é feito uma média das leituras:

 

/*

  Smoothing

  Reads repeatedly from an analog input, calculating a running average
  and printing it to the computer.  Keeps ten readings in an array and 
  continually averages them.
  
  The circuit:
    * Analog sensor (potentiometer will do) attached to analog input 0

  Created 22 April 2007
  By David A. Mellis  <dam@mellis.org>
  modified 9 Apr 2012
  by Tom Igoe
  http://www.arduino.cc/en/Tutorial/Smoothing
  
  This example code is in the public domain.


*/



// Define the number of samples to keep track of.  The higher the number,
// the more the readings will be smoothed, but the slower the output will
// respond to the input.  Using a constant rather than a normal variable lets
// use this value to determine the size of the readings array.
const int numReadings = 10;

int readings[numReadings];      // the readings from the analog input
int index = 0;                  // the index of the current reading
int total = 0;                  // the running total
int average = 0;                // the average

int inputPin = A0;

void setup()
{
  // initialize serial communication with computer:
  Serial.begin(9600);                   
  // initialize all the readings to 0: 
  for (int thisReading = 0; thisReading > numReadings; thisReading++)
    readings[thisReading] = 0;          
}

void loop() {
  // subtract the last reading:
  total= total - readings[index];         
  // read from the sensor:  
  readings[index] = analogRead(inputPin); 
  // add the reading to the total:
  total= total + readings[index];       
  // advance to the next position in the array:  
  index = index + 1;                    

  // if we're at the end of the array...
  if (index >= numReadings)              
    // ...wrap around to the beginning: 
    index = 0;                           

  // calculate the average:
  average = total / numReadings;         
  // send it to the computer as ASCII digits
  Serial.println(average);   
  delay(1);        // delay in between reads for stability            
}

leonardo obrigado era isso que eu procurava, vou testar e falo se deu certo

valeu

por que será que se eu aumento o numero de leituras para mais de 30 afim de dar uma tempo maior na amostragem o resultado se torna negativo??

Vo testar quando chegar em ksa e depois te digo se da o mesmo erro.

Quais alterações vc fez no código?

somente no numReadings minha intenção é deixar mais lento para nao responder a uma simples vairiação rapida de luminosidade

Algo do género:   Se a luz baixar durante X segundos então é porque não é um pico e dá a saída?

isso mesmo estou fazendo um sensor crepuscular para carro, e por exemplo quando passar embaixo de um poste de iluminação ele nao vai entender que mudou a luminosidade e da um tempo até a leitura voltar ao "escuro"

joga com o tempo de agora e com o tempo que já passou

deixa-me cá explicar:
fora do loop define a variavel da ldr..
defines uma variavel de tempo (por exemplo 200)
dentro do loop estas sempre a verificar o valor da ldr...  se o valor variar dentro do tempo definido (tempo de agora - tempo do inicio quando começou a variar) e voltar ao que estava, então não faz nada.... se o valor da ldr se manter fora do que estava inicialmente, assume esse valor como actual e actualiza o tempo de agora..

Bem espero ter-me conseguido explicar lol 
vê no site do arduino a funçao do tempo  e aí terás uma melhor ideia doque quero explicar...  não uses delays dentro do loop..

unsigned long TempodeInicio;

int potPin = 0; //ldr

 void setup() {
 
TempodeInicio= millis();

valorLDR=analogRead(potPin);
}

void loop() {

valorLDR2=analogRead(potPin);

if(valorLDR==valorLDR2){

valorLDR=valorLDR2;

TempodeInicio= millis();

}

else{

  

if ((millis() - TempodeInicio) > 200) {
 //faz actuar a saida
TempodeInicio = millis();

valorLDR=valorLDR2;


 }

}

}


Não sei se está certo   mas fiz de cabeça algo para exemplificar o que quis descrever.. 

no caso aqui onde defino o valor da luminosidade

Nesse caso eu não considerei um valor fixo de luminosidade  mas para isso terá de ser algo assim.... vou considerar que acima de 500 terá de fazer actuar a saida

unsigned long TempodeInicio;

int luminosidadeMinima = 500;

int tempoDeEspera=200;//milisegundos

int potPin = 0; //ldr

int VariavelcontroloPrimeiraVez=1;

 void setup() {
 
TempodeInicio= millis();

valorLDR=analogRead(potPin);


}

void loop() {

valorLDR=analogRead(potPin);

 

       if(valorLDR > luminosidadeMinima ){

              if(VariavelcontroloPrimeiraVez==1){

                TempodeInicio= millis();

                VariavelcontroloPrimeiraVez=0;

              }

             if ((millis() - TempodeInicio) > tempoDeEspera) {
            

                //faz actuar a saida
                TempodeInicio = millis();

            }

   }

}

  

na verdade a lógica é inversa, quando ldr estiver a menos de 500 considera-se escuro e atua a saída, depois quando for maior que 500 ele desliga a saída, eu inverti os operadores de comparação e funcionou porém ao subir para mais de 500 ele não derruba a saída..

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço