Galera,
Boa noite à todos!
Estou com dificuldade em fazer o SKETCH de um programa que irá medir duas tensões simultaneamente provenientes de 2 potenciometros, onde esarão ligados em duas portas analogicas A0 e A1.
Tags:
Entendo que seria isso abaixo, se quiser ver mais lento no MS aumente os tempos de delay. Isso vai possibilitar ler o valor dos pots, ~0 a 1023 se quiser ler tensão basta fazer as modificações para ler 0 a 255 sendo 255 o valor de +5V por exemplo.
#define pot A0 //Define pot como A0
#define pot A1 //Define pot como A1
int potvalor; //Cria variável para armazenar o valor do potenciômetro
void setup()
{
Serial.begin(9600); //Inicia a serial com Baud Rate de 9600
}
void loop()
{
potvalor = analogRead(A0); //Lê o potenciômetro e armazena na variável potvalor
Serial.print("Valor do Potenciometro1 = "); //Imprime na serial "Valor do Potenciometro = "
Serial.println(potvalor); //Imprime na serial o valor lido
delay(500); //Aguarda 500 milissegundos
potvalor = analogRead(A1); //Lê o potenciômetro e armazena na variável potvalor
Serial.print("Valor do Potenciometro2 = "); //Imprime na serial "Valor do Potenciometro = "
Serial.println(potvalor); //Imprime na serial o valor lido
delay(500); //Aguarda 500 milissegundos
}
Caso fosse para ler a tensão de cada um e não ler apenas o pot apenas como coloquei acima, acho que este abaixo resolve. Abs.
int var = 0;
int pot1 = A0;
int pot2 = A1;
float tensao = 0;
void setup()
{
Serial.begin (9600);
}
void loop(){
var = analogRead (pot1);
var = analogRead (pot2);
tensao = (var * 5.0) / 1023.0;
Serial.print (" Valor = " );
Serial.print (var);
Serial.print ("\n");
Serial.print (" tensao = ");
Serial.print (tensao);
Serial.print (" V");
Serial.print("\n");
delay(2000);
}
dessa forma tb funciona
int pot1 = A0;
int pot2 = A1;
float tensao1 = 0;
int voltagem1 = 0;
float tensao2 = 0;
int voltagem2 = 0;
void setup()
{
Serial.begin (9600);
}
void loop(){
voltagem1 = analogRead (pot1);
voltagem2 = analogRead (pot2);
tensao1 = map(voltagem1,0,1023,0,5);
tensao2 = map(voltagem2,0,1023,0,5);
Serial.println (" Valor pot1 = " );
Serial.println (tensao1);
Serial.print (" V");
Serial.println (" valor pot2 = ");
Serial.println (tensao2);
Serial.print (" V");
delay(2000);
}
Olá,
Da forma como foram escritos os sketchs, a leitura de uma entrada será afetada pela leitura da entrada anterior, devido ao tempo de aquisição do AD. O efeito é mais percebido quando a diferença entre os niveis de tensão das entradas for maior sempre existindo erros de leitura se não forem tomadas as devidas precauções durante a aquisição de cada medição.
Isto é uma deficiência da IDE do Arduino, um preço a ser pago pela sua simplicidade de programação e da filosofia de seus idealizadores em esconder do usuário a parte mais pesada da configuração dos fuse bits e registradores do microcontrolador. Isto é uma boa ideia para facilitar a vida dos iniciantes, mas acaba por se tornar um problema em projetos mais avançados.
No link abaixo é discutido o assunto, e eu explico as causas e uma forma de como resolver o problema.
Abraços.
Wiechert,
Obrigado de minha parte pela explicação, seu conhecimento tem tornado este fórum um lugar de grande valor para muitos, entre eles eu, e elas são sempre oportunas e bem vindas.
Abraço!
No link abaixo podem ver um vídeo que fiz, simulando os dois pot e mostrando os valores de cada um em um LCD display, tem inclusive a indicação proposta pelo Wiechert aqui mesmo neste tópico sobre o delay.
A simulação foi feita com um modulo da Labcenter chamado AVR Arduino Proteus, que tem integrada além dos módulos e Shields uma IDE para programar, e carregar na placa Arduino.
https://www.youtube.com/watch?v=xW9_uY0Ifw8
Abs.
Carlos,
O sketch mostrado no seu vídeo ainda não corrige o problema da interferência de uma entrada sobre a outra no conversor AD.
Onde você escreveu:
{
port1 = analogRead(A0);
delay(10);
Você deveria substituir por:
{
analogRead(A0);
delay(10);
port1 = analogRead(A0);
Desta forma você seleciona a entrada analógica desejada, aguarda o AD estabilizar e então faz a leitura da entrada, corrija o código para a entrada A1 da mesma forma.
Antes que alguém venha questionar que na simulação funciona corretamente, não mostrando a interferência entre as entradas, venho lembrar que o simulador não faz a conversão como o circuito do conversor ADC realmente faria, ele apenas pega o valor lido na entrada e faz a conversão de escala para o valor correspondente na escala do AD 0 - 1023. Nunca podemos esquecer que um simulador é só uma simulação, uma grande ferramenta de grande valia, mas não substitui os testes em bancada.
Abraço.
Bom dia Wiechert,
Fiz a correção, obrigado pela observação, assista o vídeo por favor, https://www.youtube.com/watch?v=mmjF0rdJaBw deixei o vídeo anterior também, com as mudanças no titulo advertindo sobre o erro, já que sempre aprendemos deles (dos erros), nos próximos dias farei outro, mas com componentes reais, não simulado, assim mostro o comportamento com, e sem, a correção no código, creio é uma forma de contribuir com todos transferindo conhecimento.
Um abraço!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por