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

Seguinte: vc testou os programas antigos (com os circuitos separados) na nova montagem? Se sim, o que rolou?

OI tenta colocar um valor nos delay dos sensores,  1000 ate menos e adicionar um delay depois do voltas++

void loop() {
  //Em quanto nao fechar o ciclo, somar valores
  if (voltas < voltasPorCiclo){
    valorLM35 += analogRead(LM35);
    delay( 1000);
    
    valorLDR = analogRead(LDR);
    delay( 1000);
    
    //O sensor B10K eh somente para controlar a luz dos leds
    //Posteriormente sera trocado por um medidor de bateria.
    LigarLedRGB(analogRead(B10K));
    
    voltas++;

   delay( 1000);

Isso é normal em qualquer uC. Da uma olhada no datasheet. Nunca  deve-se medir um sinal analógico de uma fonte de alta impedância, em últimos casos se precisar  fazer, tem que calcular o tempo de amostragem para ser no minimo de 5RC. Onde C é capacitância interna do conversor AD, e o R é o somatório de todas as resistências vista pela conversor , inclusive a interna do uC.

Qual é o valor do resistor do LDR?

Você tem como medir a voltagem Vcc e GND para ver se está variando?

Estou passando pelo mesmo problema, mas não só com medições.

Tenho um conjunto de Leds(em todas as portas PWM e 3 Analógias) e um Potenciômetro em Uma Analógica que Comanda a Velocidade e Brilho desses Leds.

Quando aumento a Resistencia do Potenciômetro(leds ficariam mais fracos e devagar) os 3 Leds nas portas analógicas abacabam recebendo menos energia e apagam bem antes de todos.

Alguém tem alguma dica sobre isso?

Pensei em criar outro tópico mas acho que aqui seria interessante.

Não sei se as portas analógicas são PWM, acho que não. E elas não funcionam como saida analógica. No meu blog, autômatoBr tem uns posts sobre multiplexação que ensinam como controlar "n" LEDs usando-se apenas 3 portas do Arduino, talvez seja-lhe útil. O fonte está disponível e vc pode adaptá-lo à sua necessidade. 

http://automatobr.blogspot.com.br/2012/07/como-parte-de-um-projeto-...

Mauro, valeu pela resposta.

Eu consegui controlar pela porta analógica até certo ponto, depois, deu problema e acho que pelo mesmo motivo dito pelo Pedro Henrique.

Com certeza vou conferir o seu blog. Obrigado!

Mauro, nesse caso que você colocou no seu blog, os Leds funcionarão apenas em HIGH e LOW ou tem como variar a tensão para cada um deles? Eu preciso controlar a luminosidade dos meus LEDS.

Obrigado!

A minha não tem a funcionalidade de PWM embutida, mas vc pode alterá-la para isso ou implementar um PWM "por fora", num loop.

Cheguei a começar a fazer o PWM para ela, mas não deu tempo de terminar.

Mauro, e se ao invés de usar a multiplexação, eu utilizar uma matriz?

Acha que daria certo? Eu não sei usar matriz(ainda) mas pensei nisso pq preciso de 9 leds e poderia usar 3 col e 3 lin.

Matriz tem função PWM?

Valeu Marcelo, vou dar uma olhada!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço