oled — Aitewinrobot Esp32C3 Supermini simulation

An interactive Aitewinrobot Esp32C3 Supermini circuit simulation you can run free in your browser on Velxio, by edelarosagon.

Components

Sketch code

from machine import Pin, I2C, ADC
from ssd1306 import SSD1306_I2C
import math
import time

# Pantalla
i2c = I2C(0, scl=Pin(7), sda=Pin(6))
oled = SSD1306_I2C(128, 64, i2c)

# Potenciómetros
pot_freq = ADC(Pin(4))
pot_amp = ADC(Pin(3))
pot_freq.atten(ADC.ATTN_11DB)
pot_amp.atten(ADC.ATTN_11DB)

ANCHO = 128
ALTO = 64
CENTRO = ALTO // 2

CICLOS_MIN = 0.5
CICLOS_MAX = 6
AMP_MIN = 2
AMP_MAX = 30                  # máximo posible: 31 (media pantalla)

# Tabla de un ciclo completo de seno (se calcula una sola vez)
TAM = 256
tabla = [math.sin(2 * math.pi * i / TAM) for i in range(TAM)]

def leer(pot, minimo, maximo, anterior):
    valor = pot.read_u16()                           # 0 - 65535
    nuevo = minimo + (valor / 65535) * (maximo - minimo)
    return anterior * 0.8 + nuevo * 0.2              # suavizado anti-ruido

def dibujar(ciclos, amplitud, fase):
    oled.fill(0)
    oled.hline(0, CENTRO, ANCHO, 1)                  # eje X
    oled.vline(0, 0, ALTO, 1)                        # eje Y

    y_ant = None
    for x in range(ANCHO):
        idx = int(x * ciclos * TAM / ANCHO + fase) % TAM
        y = CENTRO - int(amplitud * tabla[idx])
        if y_ant is not None:
            oled.line(x - 1, y_ant, x, y, 1)
        y_ant = y

    oled.text("f=%.1f" % ciclos, 0, 0)               # frecuencia (arriba izq.)
    oled.text("A=%d" % amplitud, 80, 0)              # amplitud (arriba der.)
    oled.show()

ciclos = 2.0
amplitud = 20.0
fase = 0

while True:
    ciclos = leer(pot_freq, CICLOS_MIN, CICLOS_MAX, ciclos)
    amplitud = leer(pot_amp, AMP_MIN, AMP_MAX, amplitud)
    dibujar(ciclos, amplitud, fase)
    fase = (fase + 6) % TAM                          # velocidad de desplazamiento
    time.sleep(0.02)

More projects by edelarosagon