Multiplas leituras analogicas, variação nos resultados isolados.

E ai pessoal, blz?!

Sou iniciante no arduino, embora ja tenha um bom conhecimento de programação, a eletrônica em sí ainda é bem desconhecida pra mim. Acho que isso me leva a ter algumas duvidas bem simples, tipo está de agora.

Fui seguindo os totoriais de arduino e fiz os testes com sensores LDR e LM35 (luz e temperatura).

Beleza, funciona perfeitamente depois de apanhar um pouco.

Ai me deu na telha de fazer um exemplo pra mim mesmo deixar guardado de tudo junto. Montei belezinha o projeto e me deparei com valores diferentes dos testes isolados de cada problema. Pesquisei um pouco, encontrei que é recomendado ter um intervalo entre leituras, mas mesmo assim os resultados em testes isolados e no projeto com os sensores juntos as leituras são diferentes.

Bom vou postar o código do arduino e o esquema do Fritzing que montei, se alguem tiver uma ideia do que seja, tanto na logica do código quanto na montagem eletônica, posta ai pra gente chegar a uma conclusão :). Tenho quase certeza que é vacilo meu com algum conceito que nao estudei :(.

código:

const byte B10K = A5; //Potenciometro de 10k
const byte LDR = A3; //Sensor de luz
const byte LM35 = A1; //Sensor de temperatura

const byte RGB[] = {9,10,11}; //Pinos do led RGB{9=R;10=G;11=B}

const int voltasPorCiclo = 10; //Quantidade de voltas executadas para realizar a media das medicoes
const int segundoPorCiclo = 2; //Quantos segundos tera cada ciclo
const int intervalorLeitura = 20; //Intervalo entre a leitura das portas analogicas

int voltas; //Numero de voltas para fechar um ciclo
int valorLM35; //soma das leituras do LM35
int valorLDR; //soma das leituras do LDR

void setup() {
  //Configuracao dos pinos
  pinMode(B10K, INPUT);
  pinMode(LDR, INPUT);
  pinMode(LM35, INPUT);
 
  for(int p=0;p<sizeof(RGB);p++){
    pinMode(RGB[p], OUTPUT);
    digitalWrite(RGB[p], LOW);
  }
 
  voltas = 0;
  valorLM35 = 0;
  valorLDR = 0;
 
  Serial.begin(9600);
  Serial.println("Iniciando...");
}

void loop() {
  //Em quanto nao fechar o ciclo, somar valores
  if (voltas < voltasPorCiclo){
    valorLM35 += analogRead(LM35);
    delay(intervalorLeitura);
    
    valorLDR = analogRead(LDR);
    delay(intervalorLeitura);
    
    //O sensor B10K eh somente para controlar a luz dos leds
    //Posteriormente sera trocado por um medidor de bateria.
    LigarLedRGB(analogRead(B10K));
    
    voltas++;
  }
 
  //Quando atingir um ciclo completo
  //Calcular os valores e mostrar media.
  if (voltas == voltasPorCiclo ){
      float vLidoLM35 = valorLM35 / voltasPorCiclo;
      float vLidoLDR = valorLDR / voltasPorCiclo;
      
      Serial.print("Seg/Ciclo: ");
      Serial.print(segundoPorCiclo);
      Serial.print("Seg");
      
      Serial.print(" - Voltas/Ciclo: ");
      Serial.print(voltasPorCiclo);
      
      Serial.print(" - Intervalo leitura: ");
      Serial.print(intervalorLeitura);
      Serial.println("ms");
      
      Serial.print("Temperatura: ");
      Serial.print(LeituraParaGraus(vLidoLM35));
      Serial.print("C");
      
      Serial.print(" - Luminosidade: ");
      Serial.print(LeituraParaGraus(vLidoLDR));
      
      Serial.print(" - Potenciometro: ");
      Serial.println(analogRead(B10K));
      
      Serial.println("");
      
      voltas = 0;
      valorLM35 = 0.00;
      valorLDR = 0.00;      
  }
 
  //calculo do intervalo de tempo necessario para gerar as voltas
  //e completar um ciclo com o tempo definido na constante: segundoPorCiclo e voltasPorCiclo
  delay( (int) ( (segundoPorCiclo*1000) / voltasPorCiclo ) - (intervalorLeitura*2) );
}

//Conversao da leitura para graus, simplificada por 20.
float LeituraParaGraus(float Leitura){
  return (Leitura * 25) / 51.15;
}

//Define a cor do led RGB sendo 341 o valor de 1023 / 3
//ja que sao 3 cores basicas, por hora 3 cores ta bom.
void LigarLedRGB(int leitura){
 
  //Melhorar depois a logica para definir a cor atual
  //Ainda esta muito manual, precisa automatizar, para
  //atender depois um maior numero de cores.
  if (leitura <= 341 ){
    digitalWrite(RGB[1], LOW);
    digitalWrite(RGB[2], LOW);
    digitalWrite(RGB[0], HIGH);
  }else if (leitura > 341 && leitura <= 682 ){
    digitalWrite(RGB[2], LOW);
    digitalWrite(RGB[0], LOW);
    digitalWrite(RGB[1], HIGH);
  }else if (leitura > 682){
    digitalWrite(RGB[1], LOW);
    digitalWrite(RGB[0], LOW);
    digitalWrite(RGB[2], HIGH);
  }
 
}

Exibições: 2504

Responder esta

Respostas a este tópico

Sobre as portas digitais.

No site do arduino diz que cada porta pode prover corrente de até 40mA, mas o correto, é que a arquitetura da ATMEL usa "conjuntos" de portas, assim, os pinos 1,2,3,4,5, 6, 7, 8 são um conjunto, que provem uma certa corrente, acima disso, ou arreia ou queima o conjunto de portas.

Nesse tópico do arduino nos discutimos sobre isso.

http://arduino.cc/forum/index.php/topic,148320.msg1114995.html#msg1...

Marcelo, e para essa questão das várias medições, como pode ser solucionado? Eu também preciso fazer 3 tipos diferentes de medições mas me preocupo com esse detalhe.

Pelo que achei quando estamos tendo esse tipo de problema devemos fazer assim.

Colocar um resistor de 10KR entre o sensor e a porta Analógica.

Selecionar o PINO, sem fazer leitura

Aguardar 10 milisegundos

Fazer a leitura do pino,

Exemplo com dois Pinos

analogRead(PIN_0); // Aqui não faz a leitura, apenas endereça o PINO

delay(10); // Aguarda 10ms para estabilizar a entrada do ADC

valor = analogRead(PIN_0); // Faz a leitura do pino

delay(20); // Não sei se fica irrelevante, mas mantive para o caso de ser necessário.

analogRead(PIN_2);

delay(10);

valor_2 = analogRead(PIN_1);

Valeu Marcelo, vou testar quando chegar em casa e te digo como me sai. Obrigado!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço