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