quinta-feira, março 09, 2023

Examinando um Display e-paper - Parte 4

Nestes últimos dias estive experimentando usar o display com o  nano-gui (https://github.com/peterhinch/micropython-nano-gui), uma biblioteca para uso de displays com o MicroPython. Os resultados foram mistos.


O primeiro passo foi criar o driver para o display. Aqui surgiu um dos pontos onde eu me sinto desconfortável com Python: a inexistência de interfaces formais. A filosofia do Python é o "duck typing" - se você se comportar como um pato é um pato. A questão é que comportamentos eu preciso ter para me comportar como um pato? O projeto também não tem muita documentação e jeito foi olhar os outros drivers para display e-paper. Só que existe uma grande variação entre eles, alguns seguem o padrão de começar com underline os nomes de membros particulares outros não. O resultado final está no branch  mh-et-live-154 do fork que eu fiz do projeto: https://github.com/dquadros/micropython-nano-gui/tree/mh-et-live-154.

Um ponto importante é que o projeto não tem tratamento especial para e-paper, é responsabilidade da aplicação cuidar de colocar o display para dormir após atualizar e re-iniciá-lo antes de atualizar (para acordar).

Concluída esta etapa, eu experimente o exemplo aclock.py, alterando para só atualizar a cada 3 minutos. O resultado não ficou bom. Primeiro que o texto ficou muito pequeno. Segundo que a borda retangular no relógio ficou esquisita. E por último o círculo com espessura de 1 ponto não ficou legal. Minha conclusão é que pelo menos o elemento dial (usado para o relógio) não fica bem na resolução deste display e-paper.


Resolvi brincar com os outros fontes de letra disponível e outros elementos. Os resultados foram melhores, mas tive alguns problemas. O primeiro foi ao usar o textbox (que apresenta várias linhas de texto), obtive erro de falta de memória. Encostei isso e substituí por vários labels. O problema foi que eu julguei errado o quanto de texto ia caber no espaço. A lógica do elemento label é que, quando o texto não cabe, ele recalcula a posição inicial do texto. Como errei rude, o X inicial ficou negativo. Só entendi o que aconteceu depois de colocar vários prints de debug e estudar o código.

O resultado final, que está na foto lá em cima, ficou bem razoável. O código correspondente está abaixo.

# epdemo.py
# (C) 2023, Daniel Quadros

import utime

from color_setup import epd  # Create a display instance
from gui.core.nanogui import refresh  # Color LUT is updated now.
refresh(epd, True)  # Initialise and clear display.
epd.sleep()
print("clear")
utime.sleep(180)

# Now import other modules
import cmath
from gui.core.writer import CWriter

# Font for CWriter
import gui.fonts.freesans20 as freesans20
import gui.fonts.arial35 as arial35
from gui.core.colors import *

from gui.widgets.label import Label
#from gui.widgets.textbox import Textbox
from gui.widgets.meter import Meter

def drawScreen():
    # Instantiate CWriter
    CWriter.set_textpos(epd, 0, 0)
    wri = CWriter(epd, freesans20, verbose=False)
    wri.set_clip(True, True, False)
    wri2 = CWriter(epd, arial35, verbose=False)
    wri2.set_clip(True, True, False)

    # Screen Title
    lblTitle = Label (wri2, 2, 40, "DQSoft")
    
    # Meter
    met = Meter (wri, 50, 2, height=100, width=20,
                 style=Meter.BAR, legends=('0', '1', '2'),
                 value = 0.7)
    
    # Textbox
    #tb = Textbox (wri, 50, 40, 140, 3)
    #tb.append ("Mussum Ipsum,\ncacilds vidis\nlitro abertis.")
    lbl1 = Label (wri, 50, 50, "Mussum Ipsum,")
    lbl2 = Label (wri, 70, 50, "cacilds vidis")
    lbl3 = Label (wri, 90, 50, "litro abertis")
        
    # Show Screen
    epd.init()
    refresh(epd)
    epd.sleep()
    print ("update")
    utime.sleep(180)

drawScreen()

A grande dúvida é se compensa usar esta biblioteca. Uma alternativa é aproveitar algumas ideias, arregaçar as mangas e escrever uma versão minha, mais voltada para ePaper. Não sei ainda se vou seguir isso.

A outra questão é que projeto fazer com este display. Está claro que tem que ser algo que não mostre muita informação e que não necessite de atualizações frequentes.

Nenhum comentário: