from machine import Pin
import math
import time
# Configurar los pines una sola vez fuera de las funciones
gpio_pins = [Pin(p, Pin.OUT) for p in [11,10,9,8,7,6,5,4,3,2]]
def salp(datos):
ii = 512
cbin = ""
for pin in gpio_pins:
if ((datos & ii) != 0):
pin.value(1)
cbin += "1"
else:
pin.value(0)
cbin += "0"
ii = ii >> 1
return cbin
def dac(valor, vmin, vmax):
v = int((valor - vmin) * 1023 / (vmax - vmin))
if v < 0: v = 0
if v > 1023: v = 1023
return v
def fourier_general(nmax):
ancho_grafica = 40 # Qué tan ancha será la gráfica en la terminal
T = 60
w = 2 * math.pi / T
x = 0
while x < T:
a0 = 4 * (1 - math.exp(-0.5))
suma = a0 / 2
for n in range(1, nmax + 1):
an = (4 * (1 - math.exp(-0.5))) / ((4 * math.pi * n)**2 + 1)
bn = (16 * math.pi * n * (1 - math.exp(-0.5))) / ((4 * math.pi * n)**2 + 1)
suma += an * math.cos(n * w * x) + bn * math.sin(n * w * x)
# 1. Salida física (DAC)
salida_digital = dac(suma, -1, 1)
cadena_binaria = salp(salida_digital)
# 2. Generar "gráfico" de asteriscos
# Mapeamos 'suma' (-1 a 1) al rango (0 a ancho_grafica)
posicion = int((suma - (-1)) * ancho_grafica / (1 - (-1)))
if posicion < 0: posicion = 0
if posicion > ancho_grafica: posicion = ancho_grafica
grafica = " " * posicion + "*"
# 3. Impresión combinada
print("f(x)={:6.3f} | bin={} | {}".format(suma, cadena_binaria, grafica))
x += 1
time.sleep_ms(30) # Un poco más lento para poder ver la forma
while True:
fourier_general(40)