Material de referência sobre conversão A/D e o Arduino UNO
Arduino.cc - Tutoriais - Analog Read Serial
Arduino UNO - Sensor de temperatura interno
Em um sketch no simulador o código acima é "estável" (as leituras não variam)
Na prática é possível observar que os valores lidos (valor_convertido) variam bastante.
Como solução temos 2 sugestões que ajudam a "diminuir" essa instabilidade.
1) Colocar um capacitor em paralelo a entrada do conversor A/D.
Arduino UNO - Sensor de temperatura interno
/*
* convAd_1_0_0.ino
*
* Conversor A/D - Exemplo
* Leitura de Pino de entrada analógica (A0) e apresentação no LCD
*
* Conexões com o Arduino UNO
* LCD I2C – SDA/A4 SCL/A5
* Potenciômetro - Extremos Vcc e GND - Central/variável A0
*
* Versão:
* 0.0.0 -> Uso do exemplo de ligação do LCD por I2C
* https://pilger-arduino.blogspot.com/2018/11/blog-post_80.html
* https://www.robocore.net/tutoriais/primeiros-passos-com-modulo-i2c.html
* 1.0.0 -> Inclusão Pino A0
* Exemplo/01.Basics/AnalogReadSerial
* https://www.arduino.cc/en/Tutorial/BuiltInExamples/AnalogReadSerial
*
* Data: 20/04/2021
* Autor: Luiz Oscar Ruschel Pilger
*/
// inclusão de bibliotecas
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// apelidos
#define pinoAnalogico A0
// variáveis globais
int valorAnalogico;
LiquidCrystal_I2C lcd(0x27,16,2); // Criando um LCD de 16x2 no endereço I2C 0x27 PCF8574T
//LiquidCrystal_I2C lcd(0x3F,16,2); // Criando um LCD de 16x2 no endereço I2C 0x3F PCF8574AT
//função setup executa 1 vez no início
void setup(){
lcd.init(); // Inicializando o LCD
lcd.backlight(); // Ligando o BackLight do LCD
lcd.print("Coversor A/D"); // Exibindo no LCD texto
lcd.setCursor(0,1); // posiciona o cluros no início da 2ª linha
lcd.print("Valor = "); // imprime o texto
}
// função loop com código principal
void loop(){
leituraAnalogica();
atualizaLcd();
}
void leituraAnalogica (void){
valorAnalogico=analogRead(pinoAnalogico); // Lê o conversor A/D
delay(1); // atraso para estabilizar o conversor
}
void atualizaLcd (void){
lcd.setCursor(9,1); // posiciona o cursor
lcd.print(valorAnalogico); // imprime o valor analógico
lcd.print(" "); // imprime 3 espaços para "apagar" numeros de 4 dígitos
}
Instabilidade do Conversor A/D
Em um sketch no simulador o código acima é "estável" (as leituras não variam)
Na prática é possível observar que os valores lidos (valor_convertido) variam bastante.
Como solução temos 2 sugestões que ajudam a "diminuir" essa instabilidade.
1) Colocar um capacitor em paralelo a entrada do conversor A/D.
Dentro do conversor A/D existe um capacitor que armazena uma tensão para ser convertida.
Um capacitor na entrada, acaba ficando "em paralelo" com este capacitor interno, e como capacitâncias em paralelo são somadas, isso faz com que o capacitor que forneça o valor a ser convertido tenha maior carga acumulada.
2) Fazer várias leituras (10 por exemplo) e tirar uma média dos valores
Um capacitor na entrada, acaba ficando "em paralelo" com este capacitor interno, e como capacitâncias em paralelo são somadas, isso faz com que o capacitor que forneça o valor a ser convertido tenha maior carga acumulada.
2) Fazer várias leituras (10 por exemplo) e tirar uma média dos valores
Com isso o código de leitura do conversor:
valorAnalogico=analogRead(pinoAnalogico); // Lê o conversor A/D
delay(1); // atraso para estabilizar o conversor
Pode ser substituído por:
valorAnalogico=0; // zera a variável
for(int i=0; i<leituras; i++){ // laço com repetição de "leituras"
valorAnalogico = valorAnalogico + analogRead(pinoAnalogico); // Acumula a nova leitura do Conv.A/D
delay(1); // atraso para estabilizar o conversor
}
valorAnalogico = valorAnalogico/leituras; // faz a média de leituras
Lembrando que nesse código é usado um apelido "leituras" que deve ser criado
#define leituras 10