from machine import Pin, I2C, ADC
from ssd1306 import SSD1306_I2C
import math
import time
# Configuración del display
WIDTH = 128
HEIGHT = 64
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=400000)
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)
# Configuración de los ADCs para controlar rango
adc_x = ADC(26) # Control de eje X
adc_y = ADC(27) # Control de eje Y
# Ejes
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)
def escalar(valor, max_display):
return int((valor / 65535) * max_display)
# Función principal de graficado
def graficador():
while True:
# 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() * 5 / 65535) # Rango de 1 a 6
# escalamiento de pot
x_esc = escalar(adc_x.read_u16(), 127)
y_esc = escalar(adc_y.read_u16(), 63)
x_esc = max(2, min(x_esc, 125))
y_esc = max(2, min(y_esc, 61))
#oled.show()
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.
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.pixel(x_esc, y_esc, 1) # centro
oled.pixel(x_esc+1, y_esc, 1) # izquierda
oled.pixel(x_esc-1, y_esc, 1) # derecha
oled.pixel(x_esc, y_esc-1, 1) # arriba
oled.pixel(x_esc, y_esc+1, 1) # abajo
oled.text("X:{:3}".format(x_esc), 0, 0)
oled.text("Y:{:3}".format(y_esc), 64, 0)
oled.show()
time.sleep(0.1)
# Ejecutar
graficador()