Módulo pantalla

Driver de bajo nivel para el panel e-paper LCMEN2R13EFC1 (Heltec Vision Master E213, 2.13», 122×250 px útiles).

El módulo encapsula:

  • La configuración del bus machine.SPI (SPI3 del ESP32-S3) y de los pines de control del header J2.

  • La carga de las LUTs (tablas de formas de onda) requeridas por el controlador para las transiciones blanco→negro, negro→blanco, etc.

  • Un framebuffer en RAM de 128 × 250 / 8 = 4000 bytes que se envía al panel en cada refresco.

  • Rutinas de dibujo elementales (píxel, líneas, texto con fuentes 8×8 y 12×16).

El panel se maneja en dos orientaciones lógicas:

  • orientacion = 0 → 128×250 (retrato, nativo).

  • orientacion = 90 → 250×128 (apaisado, rotación por software).

Nota

El refresco es bloqueante. La función Pantalla.actualizar() espera al pin BUSY del panel, por lo que puede tardar varios segundos (típicamente ~2 s en modo completo).

Advertencia

Este driver asume que los módulos fuente_8x8 y fuente_12x16 están disponibles en el frozen o en el sistema de archivos del microcontrolador, y que exponen respectivamente los diccionarios PATRONES y PATRONES_12x16.

copyright:
  1. 2024

license:

MIT

pantalla.PIN_DC = 2

Pin GPIO conectado al terminal Data/Command del panel.

Type:

int

pantalla.PIN_CS = 5

Pin GPIO de Chip Select (activo en bajo).

Type:

int

pantalla.PIN_BUSY = 1

Pin GPIO de entrada que indica 1 = libre, 0 = ocupado.

Type:

int

pantalla.PIN_RST = 3

Pin GPIO de reset por hardware (activo en bajo).

Type:

int

pantalla.PIN_VEXT = 18

Pin GPIO que habilita la alimentación externa (VEXT) del panel.

Type:

int

pantalla.PIN_SCK = 4

Pin GPIO de reloj SPI (SCLK).

Type:

int

pantalla.PIN_MOSI = 6

Pin GPIO de datos SPI (MOSI).

Type:

int

pantalla.PIN_MISO = -1

Pin GPIO de MISO. -1 indica que no se usa.

Type:

int

pantalla.ANCHO_FISICO = 128

Ancho físico del controlador en píxeles (el panel usa 122).

Type:

int

pantalla.ALTO_FISICO = 250

Alto físico del panel en píxeles.

Type:

int

pantalla.NEGRO = 1

Valor lógico para píxel encendido (tinta negra).

Type:

int

pantalla.BLANCO = 0

Valor lógico para píxel apagado (fondo blanco).

Type:

int

class pantalla.Pantalla(orientacion=90)[fuente]

Bases: object

Driver del panel e-paper LCMEN2R13EFC1.

Parámetros:

orientacion (int) – 0 para retrato (128×250) o 90 para apaisado (250×128). Cualquier otro valor lanza ValueError.

Variables:
  • orientacion (int) – Orientación lógica actual.

  • ancho (int) – Ancho lógico en píxeles (depende de la orientación).

  • alto (int) – Alto lógico en píxeles (depende de la orientación).

  • buffer (bytearray) – Framebuffer en formato 1 bit por píxel, con ANCHO_FISICO // 8 bytes por fila.

  • inicializado (bool) – True si el panel ya recibió la secuencia de inicialización y aún no se ha dormido.

__init__(orientacion=90)[fuente]

Construye el objeto Pantalla, configura el bus SPI y reserva el framebuffer. No inicializa el panel; eso ocurre de forma perezosa al llamar a inicializar() o actualizar().

Parámetros:

orientacion (int) – 0 (retrato) o 90 (apaisado).

Muestra:

ValueError – Si orientacion no es 0 ni 90.

inicializar()[fuente]

Ejecuta la secuencia de arranque del panel: habilita VEXT, aplica un reset por hardware, espera a que BUSY se libere y carga las LUTs.

Es idempotente: si inicializado ya es True, retorna sin hacer nada.

pixel(x, y, color=1)[fuente]

Escribe un píxel en el framebuffer aplicando la rotación correspondiente a orientacion.

Las coordenadas fuera del área lógica se ignoran silenciosamente.

Parámetros:
  • x (int) – Coordenada horizontal lógica (0 … ancho-1).

  • y (int) – Coordenada vertical lógica (0 … alto-1).

  • color (int) – NEGRO o BLANCO.

limpiar(color=0)[fuente]

Rellena todo el framebuffer con un color uniforme.

Parámetros:

color (int) – BLANCO (por defecto) o NEGRO.

linea_h(x, y, largo, color=1)[fuente]

Dibuja una línea horizontal.

Parámetros:
  • x (int) – Coordenada X del extremo izquierdo.

  • y (int) – Coordenada Y de la línea.

  • largo (int) – Cantidad de píxeles a dibujar hacia la derecha.

  • color (int) – NEGRO o BLANCO.

linea_v(x, y, largo, color=1)[fuente]

Dibuja una línea vertical.

Parámetros:
  • x (int) – Coordenada X de la línea.

  • y (int) – Coordenada Y del extremo superior.

  • largo (int) – Cantidad de píxeles a dibujar hacia abajo.

  • color (int) – NEGRO o BLANCO.

texto(txt, x, y, color=1, tamaño=8)[fuente]

Escribe una cadena usando las fuentes incluidas.

Parámetros:
  • txt (str) – Texto a dibujar. Se admiten únicamente los caracteres presentes en la tabla correspondiente.

  • x (int) – Coordenada X del extremo izquierdo.

  • y (int) – Coordenada Y de la línea base superior.

  • color (int) – NEGRO o BLANCO.

  • tamaño (int) – 8 para la fuente 8×8, 16 para la 12×16.

actualizar()[fuente]

Envía el framebuffer al panel y dispara un refresco completo.

La secuencia es:

  1. PON (0x04) — enciende la fuente de alimentación interna.

  2. DTM1 (0x10) — envía los datos antiguos (todo blanco).

  3. DTM2 (0x13) — envía el framebuffer actual.

  4. DRF (0x12) — ejecuta el refresco (bloqueante).

  5. POF (0x02) — apaga la fuente de alimentación.

Al finalizar, inicializado se restablece a False para forzar una nueva inicialización en el próximo refresco.

Nota

Este método puede tardar varios segundos dependiendo de la cantidad de píxeles que cambien.

dormir()[fuente]

Pone el panel en modo deep sleep (comando DSLP 0x07 con el magic byte 0xA5) y corta la alimentación externa (VEXT = 0).

Cualquier excepción durante el proceso se silencia, de modo que este método puede invocarse de forma segura incluso si el panel nunca llegó a inicializarse.