from machine import Pin, ADC, Timer
import time
# ---------------------------
# Configuración del ADC
# ---------------------------
sensor = ADC(Pin(34))
sensor.atten(ADC.ATTN_11DB) # Rango 0 - 3.3V
sensor.width(ADC.WIDTH_12BIT) # Resolución de 12 bits (0 - 4095)
# ---------------------------
# Parámetros de muestreo
# ---------------------------
Fs = 50 # Frecuencia de muestreo (Hz)
Ts = int(1000 / Fs) # Periodo en ms
lecturas = [] # Buffer para almacenar valores
N = 10 # Tamaño de ventana para filtros
# ---------------------------
# Filtros digitales
# ---------------------------
def filtro_mediana(valores, n=5):
datos = valores[-n:]
datos = sorted(datos)
return datos[len(datos)//2]
def promedio_movil(valores, n=10):
return sum(valores[-n:]) / n
def filtro_exponencial(nueva_lectura, anterior, alpha=0.1):
return alpha*nueva_lectura + (1-alpha)*anterior
# ---------------------------
# Variables del filtro
# ---------------------------
y_exp = 0 # Para el filtro exponencial
# ---------------------------
# Selección de filtro
# ---------------------------
print("\n--- Selección de filtro ---")
print("1 → Promedio móvil")
print("2 → Mediana")
print("3 → Exponencial")
opcion = input("Elige filtro (1/2/3): ")
if opcion == "1":
filtro_activo = "promedio"
elif opcion == "2":
filtro_activo = "mediana"
elif opcion == "3":
filtro_activo = "exponencial"
else:
print("⚠️ Opción no válida, se usará Promedio móvil")
filtro_activo = "promedio"
print("✅ Filtro seleccionado:", filtro_activo)
# ---------------------------
# Función de muestreo
# ---------------------------
def muestrear(t):
global lecturas, y_exp
valor_adc = sensor.read()
voltaje = valor_adc * (3.3 / 4095)
# Guardamos en buffer
lecturas.append(valor_adc)
if len(lecturas) > 100: # Máximo 100 muestras en memoria
lecturas.pop(0)
# Aplicamos el filtro seleccionado
if len(lecturas) >= N:
if filtro_activo == "promedio":
valor_filtrado = promedio_movil(lecturas, N)
elif filtro_activo == "mediana":
valor_filtrado = filtro_mediana(lecturas, N)
elif filtro_activo == "exponencial":
y_exp = filtro_exponencial(valor_adc, y_exp, alpha=0.1)
valor_filtrado = y_exp
print("ADC:", valor_adc,
"| Voltaje:", round(voltaje,3),
"| Filtrado:", round(valor_filtrado,2))
# Guardar en archivo CSV
with open("datos_adc.csv", "a") as f:
f.write("{},{},{}\n".format(valor_adc,
round(voltaje,3),
round(valor_filtrado,2)))
# ---------------------------
# Configuración del Timer
# ---------------------------
timer = Timer(0)
timer.init(period=Ts, mode=Timer.PERIODIC, callback=muestrear)
# ---------------------------
# Loop principal
# ---------------------------
while True:
time.sleep(1) # El Timer hace el muestreo automático