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
Tags:
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..
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por