Programando em C no Arduino, é fácil trabalhar num nível abaixo e acessar direto os registradores e atualizar os oito pinos de dados de uma vez. Nest post vamos ver a maneira "pythonica" de fazer isso.
O resultado deste segundo programa é:
O CircuitPython possui uma biblioteca nativa chamada displayio para interagir com displays gráficos. Especializações desta classe (chamadas de forma meio confusa de drivers) contém as sequências de iniciação para controladores específicos. O construtor da classe displayio recebe como parâmetro uma referência a um objeto DisplayBus, que implementa a transferência de dados para o controlador do display. Exemplos de classes derivadas de DisplayBus são I2CDisplay, FourWire e ParallelBus, que implementam comunicação via I2C, SPI e de forma paralela. A implementação destas classes (principalmente ParallelBus) vai variar conforme a placa usada. Tipicamente, ParallelBus vai querer que os pinos de dados estejam mapeados em um mesmo registrador, o que limita os pinos que podem ser usados.
Vou usar aqui a Franzininho WiFi, que é baseado no ESP32-S2. A mesma forma de programação pode ser usada com outras placas que suportem suportem o CircuitPython e a classe ParallelBus. No ESP32-S2 é necessário que o bit zero de dados seja o pino IO8, o bit um o IO9 e assim por diante até o bit 7 ligado no IO15. Os demais sinais de controle podem ser conectados a qualquer pino de entrada ou saída, no meu teste usei as conexões abaixo:
- RST: IO3
- CS: IO4
- RS: IO5
- WR: IO6
- RD: IO7
- D0 a D7: IO8 a IO15
- GND: GND
- 3V3: 3V3
Para um primeiro teste, já com o CircuitPython instalado na Franzininho, baixe as bibliotecas da Adafruit e instale adafruit_ili9341.mpy e adafruit_display_text/. no diretório lib da plaquinha.
O programa abaixo escreve "Olá Franzininho" no meio do display:
import board import displayio import terminalio import adafruit_ili9341 from adafruit_display_text import label displayio.release_displays() display_bus = displayio.ParallelBus(data0=board.IO8, reset=board.IO3, chip_select=board.IO4, command=board.IO5, write=board.IO6, read=board.IO7) display = adafruit_ili9341.ILI9341(display_bus, width=320, height=240) text = "Olá, Franzininho" font = terminalio.FONT color = 0xFF0000 text_area = label.Label(font, text=text, color=color) text_area.x = 100 text_area.y = 80 display.show(text_area)
Explicando o funcionamento:
- release_displays() cancela displays que tenham sido criados, liberando os pinos associados.
- displayio.ParallelBus cria o display bus, especificando os pinos usados (reparar que só data0 é especificado, é assumido que os demais são consecutivos)
- display = adafruit_ili9341.ILI9341(display_bus, width=320, height=240) cria o objeto displayio que será usado para interagir com o display
- label.Label cria uma área de texto que pode ser apresentada no display
- display.show(text_area) apresenta a área de texto no display
O resultado é:
Usando outras classes e métodos podemos montar telas mais complexas:
import board import displayio import terminalio import adafruit_ili9341 from adafruit_display_text import label from adafruit_display_shapes.roundrect import RoundRect from adafruit_display_shapes.rect import Rect from random import randrange # Inicia o display displayio.release_displays() display_bus = displayio.ParallelBus(data0=board.IO8, reset=board.IO3, chip_select=board.IO4, command=board.IO5, write=board.IO6, read=board.IO7) display = adafruit_ili9341.ILI9341(display_bus, width=320, height=240) # Cria um grupo splash = displayio.Group() display.show(splash) # Constroi um fundo e acrescenta ao grupo color_bitmap = displayio.Bitmap(320, 240, 1) color_palette = displayio.Palette(1) color_palette[0] = 0x3FFF5F bg_sprite = displayio.TileGrid(color_bitmap, x=0, y=0, pixel_shader=color_palette) splash.append(bg_sprite) # Desenha um retângulo com bordas arredondadas roundrect = RoundRect(80, 10, 161, 41, 10, fill=0x0000FF, outline=0x00, stroke=4) splash.append(roundrect) # Coloca um texto dentro do retângulo text = "DQSoft" font = terminalio.FONT color = 0xFFFFFF text_area = label.Label(font, text=text, color=color) text_area.x = 140 text_area.y = 30 splash.append(text_area) # Vamos fazer um gráfico de barras aleatórias for x in range(20, 300, 20): y = randrange (30, 180) color1 = randrange (0, 180) color2 = randrange (0, 180) color3 = randrange (0, 180) interior = (color1 << 16)+(color2 << 8)+color3 rect = Rect(x, 230-y, 16, y, fill=interior, outline=0, stroke=2) splash.append(rect)
Nenhum comentário:
Postar um comentário