#include <Arduino.h>
#include "soc/gpio_struct.h"
#define ADC_PIN 0 // Pino do potenciômetro (ADC)
// GPIOs usados para os 10 LEDs da barra
int leds[10] = {1,2,3,4,5,6,7,8,9,10};
// Variáveis para filtro de média móvel
int amostras[5]; // Guarda 5 leituras anteriores
int indice = 0; // Posição atual da amostra
int soma = 0; // Soma das leituras
void configurarGPIO()
{
for(int i=0;i<10;i++)
{
GPIO.enable_w1ts.val = (1 << leds[i]); // Configura GPIO como saída
GPIO.out_w1tc.val = (1 << leds[i]); // Inicia LEDs desligados
}
}
int lerADC()
{
return analogRead(ADC_PIN); // Lê o valor do potenciômetro
}
void atualizarBarra(int nivel)
{
for(int i=0;i<10;i++)
{
if(i<nivel)
GPIO.out_w1ts.val = (1 << leds[i]); // Liga LED correspondente ao nível
else
GPIO.out_w1tc.val = (1 << leds[i]); // Desliga LEDs acima do nível
}
}
void setup()
{
configurarGPIO(); // Configura os LEDs como saída
analogReadResolution(12); // Define ADC com resolução de 12 bits (0-4095)
for(int i=0;i<5;i++)
amostras[i]=0; // Inicializa o filtro
}
void loop()
{
int leitura = lerADC(); // Faz leitura do potenciômetro
soma -= amostras[indice]; // Remove a leitura antiga da soma
amostras[indice] = leitura; // Salva nova leitura
soma += amostras[indice]; // Adiciona nova leitura
indice++; // Avança posição do vetor
if(indice>=5)
indice=0; // Reinicia o índice
int media = soma/5; // Calcula média das 5 leituras
int nivel = (media*10)/4095; // Converte ADC para 0 a 10 LEDs
atualizarBarra(nivel); // Atualiza a barra de LEDs
for(volatile int i=0;i<100000;i++)
__asm__ __volatile__("nop"); // Pequena espera sem usar delay()
}