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:
Postar um comentário