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