from machine import Pin, I2C, ADC
from ssd1306 import SSD1306_I2C
import math
import time
# Configuración de la pantalla OLED (ajusta según tu placa y conexión)
i2c = I2C(-1, scl=Pin(22), sda=Pin(21)) # Pin SCL y SDA, ajusta según tu placa
oled = SSD1306_I2C(128, 64, i2c)
# Configuración de los potenciómetros (ajusta según la conexión)
potentiometer_freq = ADC(Pin(34)) # Pin analógico para la frecuencia
potentiometer_amplitude = ADC(Pin(35)) # Pin analógico para la amplitud
# Configuración de los botones (ajusta según la conexión)
button_square = Pin(26, Pin.IN, Pin.PULL_UP) # Botón para activar la onda cuadrada
button_triangle = Pin(27, Pin.IN, Pin.PULL_UP) # Botón para activar la onda triangular
# Dimensiones de la pantalla OLED
width = 128
height = 64
function_selected = "sine" # Función predeterminada: senoidal
def draw_sine_wave():
for x in range(width):
y = amplitude * math.sin(2.0 * math.pi * frequency * x / width) + amplitude
oled.pixel(x, int(y), 1)
def draw_square_wave():
for x in range(width):
y = amplitude * math.sin(2.0 * math.pi * frequency * x / width)
if y >= 0:
y = amplitude
else:
y = amplitude-10
oled.pixel(x, int(y), 1)
def draw_triangle_wave():
# Calcula el período de la onda triangular asegurándote de que sea mayor que cero
half_period = max(1, width // (2 * frequency))
for x in range(width):
y = amplitude - abs((x % (2 * half_period)) - half_period) * (2 * amplitude / half_period)
oled.pixel(x, int(y), 1)
try:
while True:
oled.fill(0) # Borra la pantalla
# Lee los valores de los potenciómetros para la frecuencia y la amplitud
frequency = (potentiometer_freq.read_u16() / 4095.0) * 10.0 # Escala la frecuencia (0-10 Hz)
amplitude = potentiometer_amplitude.read_u16() // 256 # Escala la amplitud (0-255)
if button_square.value() == 0: # Botón para activar la onda cuadrada
function_selected = "square"
elif button_triangle.value() == 0: # Botón para activar la onda triangular
function_selected = "triangle"
else:
function_selected = "sine"
if function_selected == "sine":
draw_sine_wave()
elif function_selected == "square":
draw_square_wave()
elif function_selected == "triangle":
draw_triangle_wave()
oled.show()
time.sleep(0.1) # Controla la velocidad del desplazamiento
except KeyboardInterrupt:
pass