from machine import Pin, I2C, ADC
from ssd1306 import SSD1306_I2C
import time
# === Configuración del display SSD1306 ===
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=400000)
oled = SSD1306_I2C(128, 64, i2c)
# === Entradas ADC joystick ===
joy_x = ADC(0) # GP26
joy_y = ADC(1) # GP27
adc_x = ADC(2)
def draw_axes(xmin, xmax, ymin, ymax, dx, dy, sclx, scly):
oled.fill(0)
# Eje X
y0 = int(HEIGHT * ymax / (ymax - ymin))
oled.hline(0, y0, WIDTH, 1)
# Eje Y
x0 = int(-xmin * dx / sclx)
oled.vline(x0, 0, HEIGHT, 1)
# === Función para escalar de 0–65535 a pantalla 0–127 o 0–63 ===
def escalar(valor, max_display):
return int((valor / 65535) * max_display)
# === Loop principal ===
def graficador(expr, variables):
# Preguntar si se desea ingresar dominio manualmente
# dominio_manual = input("¿Desea ingresar el dominio manualmente? (s/n): ").lower() == 's'
# if dominio_manual:
# xmin = float(input("Valor mínimo de x: "))
# xmax = float(input("Valor máximo de x: "))
# ymin = float(input("Valor mínimo de y: "))
# ymax = float(input("Valor máximo de y: "))
while True:
oled.fill(0)
# Leer ADCs
val_x = joy_x.read_u16()
val_y = joy_y.read_u16()
# Escalar a coordenadas del display
x = escalar(val_x, 127)
y = escalar(val_y, 63)
# Limitar bordes (por si acaso)
x = max(2, min(x, 125))
y = max(2, min(y, 61))
# Dibujar cruz (5 píxeles)
oled.pixel(x, y, 1) # centro
oled.pixel(x-1, y, 1) # izquierda
oled.pixel(x+1, y, 1) # derecha
oled.pixel(x, y-1, 1) # arriba
oled.pixel(x, y+1, 1) # abajo
# Mostrar coordenadas
oled.text("X:{:3}".format(x), 0, 0)
oled.text("Y:{:3}".format(y), 64, 0)
oled.show()
# Leer potenciómetros y ajustar rangos
x_range = 5 + int(adc_x.read_u16() * 10 / 65535) # Rango de 5 a 15
y_range = 1 + int(adc_y.read_u16() * 10 / 65535) # Rango de 1 a 6
xmin = -x_range
xmax = x_range
ymin = -y_range
ymax = y_range
sclx = scly = 1
delta = 0.1
dx = (WIDTH * sclx) / (xmax - xmin)
dy = (HEIGHT * scly) / (ymax - ymin)
draw_axes(xmin, xmax, ymin, ymax, dx, dy, sclx, scly)
# Graficar la función
x = xmin
while x < xmax:
# fx = math.sin(x) # Puede cambiar por cos(x), tanh(x), etc.
fx = exprfx = evaluar_funcion_grafico(expr, x, variables)
xp = int((x - xmin) * dx / sclx)
yp = int(HEIGHT - ((fx - ymin) * dy / scly))
if 0 <= xp < WIDTH and 0 <= yp < HEIGHT:
oled.pixel(xp, yp, 1)
x += delta
oled.show()
time.sleep(0.1)
graficador()
while True: