# ESP32 + MicroPython
# Señal al osciloscopio por DAC y trazado en OLED SSD1306 (128x64)
# I2C: SDA=21, SCL=22, addr 0x3C
# DAC: GPIO25 (DAC1)
from machine import Pin, I2C, DAC
import time
from ssd1306 import SSD1306_I2C
# --- Configuración de hardware ---
I2C_SDA = 21
I2C_SCL = 22
OLED_W = 128
OLED_H = 64
OLED_ADDR = 0x3C
DAC_PIN = 25 # GPIO25 (DAC1)
i2c = I2C(0, sda=Pin(I2C_SDA), scl=Pin(I2C_SCL), freq=400_000)
oled = SSD1306_I2C(OLED_W, OLED_H, i2c, addr=OLED_ADDR)
dac = DAC(Pin(DAC_PIN))
# --- Datos de la señal (del código original) ---
signalData = [
128, 140, 152, 164, 175, 185, 194, 202, 209, 214,
218, 220, 221, 220, 218, 214, 209, 202, 194, 185,
175, 164, 152, 140, 128, 115, 103, 91, 80, 70,
61, 53, 46, 41, 37, 35, 34, 35, 37, 41,
46, 53, 61, 70, 80, 91, 103, 115,
128, 140, 152, 164, 175, 185, 194, 202, 209, 214,
218, 220, 221, 220, 218, 214, 209, 202, 194, 185,
175, 164, 152, 140, 128, 115, 103, 91, 80, 70,
61, 53, 46, 41, 37, 35, 34, 35, 37, 41,
46, 53, 61, 70, 80, 91, 103, 115,
128, 140, 152, 164, 175, 185, 194, 202, 209, 214,
218, 220, 221, 220, 218, 214, 209, 202, 194, 185,
175, 164, 152, 140, 128, 115, 103, 91, 80, 70,
61, 53, 46, 41, 37, 35, 34, 35, 37, 41,
46, 53, 61, 70, 80, 91, 103, 115
]
# --- Utilidades ---
def map_val(x, in_min, in_max, out_min, out_max):
# Mapea x de un rango a otro (entero)
return int((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
# --- Loop principal (similar al sketch de Arduino) ---
# Dibuja la forma de onda uniendo puntos y envía cada muestra al DAC con retardo
# Nota: el array tiene más de 128 puntos; se recorta al ancho o se comprime en X.
compress_to_width = True # True: comprime en X al ancho; False: dibuja primeros 128
while True:
oled.fill(0)
oled.text("Senal DAC->OLED", 0, 0)
n = len(signalData)
if compress_to_width and n > OLED_W:
# Recorre todo el arreglo pero mapea índice i a X en 0..(OLED_W-1)
prev_x = 0
prev_y = map_val(255 - signalData[0], 0, 255, 0, OLED_H - 1)
for i in range(1, n):
x = map_val(i, 0, n - 1, 0, OLED_W - 1)
y = map_val(255 - signalData[i], 0, 255, 0, OLED_H - 1)
# trazar línea
oled.line(prev_x, prev_y, x, y, 1)
prev_x, prev_y = x, y
# salida DAC
dac.write(signalData[i])
# retardo visual similar a delay(10)
time.sleep_ms(10)
else:
# Dibuja hasta el ancho de pantalla (o el largo del array, lo que sea menor)
m = min(n, OLED_W)
for i in range(m - 1):
y1 = map_val(255 - signalData[i], 0, 255, 0, OLED_H - 1)
y2 = map_val(255 - signalData[i+1], 0, 255, 0, OLED_H - 1)
oled.line(i, y1, i + 1, y2, 1)
dac.write(signalData[i])
time.sleep_ms(10)
oled.show()
time.sleep_ms(200)