/*
* Aula: Conversão Analógico-Digital e Condicionamento de Sinal
* Plataforma: ESP32
* Descrição: Lê um sinal analógico, INJETA RUÍDO ARTIFICIAL DIDÁTICO, aplica um
* filtro de média para limpar o sinal, e replica no DAC.
*/
const int pinoADC = 34; // Pino seguro do ADC1 (Apenas Entrada)
const int pinoDAC = 25; // Pino fixo do DAC1 (Saída Analógica Real)
// --- FUNÇÃO DIDÁTICA: GERADOR DE RUÍDO ---
// Lê o pino e injeta uma flutuação aleatória para simular interferência industrial
int lerADCComRuido(int pino) {
int leituraReal = analogRead(pino);
// Gera um ruído aleatório entre -150 e +150 (ajuste a amplitude do ruído aqui)
int ruido = random(-150, 151);
int leituraComRuido = leituraReal + ruido;
// PROTEÇÃO IMPORTANTE: O ADC de 12 bits só entende valores de 0 a 4095.
// O ruído não pode fazer o valor ficar negativo nem ultrapassar 4095.
if (leituraComRuido > 4095) leituraComRuido = 4095;
if (leituraComRuido < 0) leituraComRuido = 0;
return leituraComRuido;
}
void setup() {
Serial.begin(115200);
analogSetAttenuation(ADC_11db); //1.1V - 3.3v
}
void loop() {
long somaLeituras = 0;
int numeroAmostras = 100; // Quantidade de amostras para o filtro
// 1. Captura a "Leitura Bruta" COM RUÍDO para mostrar o problema no gráfico
int leituraBruta = lerADCComRuido(pinoADC);
// 2. Filtro de Média (Oversampling) processando o sinal sujo
for(int i = 0; i < numeroAmostras; i++) {
// Usamos a nossa função com ruído para alimentar o filtro!
somaLeituras += lerADCComRuido(pinoADC);
delay(2);
}
// Calcula a média estabilizada
int mediaADC = somaLeituras / numeroAmostras;
// 3. Conversões Matemáticas
int valorDAC = map(mediaADC, 0, 4095, 0, 255);
float tensaoVolts = (mediaADC / 4095.0) * 3.3;
// 4. Ação: Escreve a tensão contínua no pino 25
dacWrite(pinoDAC, valorDAC);
// 5. Saída formatada para o Plotter Serial (Ide do Arduino)
Serial.print("Bruto:");
Serial.print(leituraBruta);
Serial.print(" Filtrado:");
Serial.print(mediaADC);
Serial.print(" Volts(mV):");
Serial.println(tensaoVolts * 1000);
delay(50);
}