A placa Raspberry Pi Pico W é uma excelente plataforma de IoT, dispondo de comunicação WiFi para acesso à internet e um amplo conjunto de periféricos para conexão de sensores e atuadores. Neste vamos criar um projeto de Display IoT com Raspberry Pi Pico utilizando um display alfanumérico e programá-la para receber a mensagem a apresentar de um browser rodando em um computador ou smartphone conectado na mesma rede WiFi.
Material Necessário para o Display IoT com Raspberry Pi Pico W
- Placa Raspberry Pico W
- Cabo micro USB para conectar a Pico W ao micro para programação
- Barra de pinos
- Display alfanumérico com interface I2C
- Cabos para conexão
Preparação
Conecte a Pico W ao display conforme indicado abaixo:
Siga os passos descritos no artigo “Primeiros Passos com a Pico W” para instalar o MicroPython na Pico W e a IDE Thonny no micro.
Baixe no micro os arquivos .py nos links abaixo:
https://raw.githubusercontent.com/dhylands/python_lcd/master/lcd/lcd_api.py
https://raw.githubusercontent.com/T-622/RPI-PICO-I2C-LCD/main/pico_i2c_lcd.py
Renomeie o segundo arquivo para “i2c_lcd.py”.
- Conecte a Pico W ao micro, execute o Thonny e siga os passos abaixo para copiar estes arquivos .py na Pico W:
- Escolha “Visualizar” no menu e ative a opção “Arquivos”
- Clique com o botão direito do mouse na região abaixo de “Raspberry Pi Pico” na aba “Arquivos” e escolha “Novo diretório”
- Digite “lib” e Enter
- Clique com o botão direito do mouse em “lib” e selecione “Focar”
- Na região “Este Computador” da aba “Arquivos” navegue até onde você salvou os arquivos .py
- Selecione lcd_api.py, clique com o botão direito do mouse e escolha “Enviar para /lib”
- Selecione i2c_lcd.py, clique com o botão direito do mouse e escolha “Enviar para /lib”
- Clique em “Raspberry Pi Pico” na aba “Arquivos” para voltar o foco para a raiz (/)
O Código – Display IoT com Raspberry Pi Pico W
Use o menu Arquivo Novo para criar uma nova aba no Thony. Digite o código abaixo, colocando o SSID e a senha da rede WiFi que será usada.
ssid = 'SuaRede' passwd = 'SuaSenha'
Selecione Arquivo Salvar como, escolha “Raspberry Pi Pico” e forneça o nome secrets.py (não se esqueça de fornecer a extensão .py pois o Thonny não a acrescenta automaticamente).
Use novamente o menu Arquivo Novo para criar uma nova aba no Thony, digite o código abaixo e salve no Pico W com o nome mensIoT.py.
import secrets import time import network import socket import rp2 from ubinascii import unhexlify import machine from machine import I2C from lcd_api import LcdApi from i2c_lcd import I2cLcd # Inicia o display LCD_ADDR = 0x27 LCD_NUM_ROWS = 2 LCD_NUM_COLS = 16 LCD_SDA = 16 LCD_SCL = 17 i2c = I2C(0, sda=machine.Pin(LCD_SDA), scl=machine.Pin(LCD_SCL), freq=400000) lcd = I2cLcd(i2c, LCD_ADDR, LCD_NUM_ROWS, LCD_NUM_COLS) lcd.putstr('Conectando WiFi') # Inicia o WiFi rp2.country('BR') wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect(secrets.ssid, secrets.passwd) # Connecta print('conectando...') max_wait = 10 while max_wait > 0: if wlan.status() < 0 or wlan.status() >= 3: break max_wait -= 1 time.sleep(1) # Aborta se deu erro if wlan.status() != 3: raise RuntimeError('não conseguiu conectar!!!') print('conectado') status = wlan.ifconfig() ipserv = status[0] print('ip = ' + ipserv) lcd.clear() lcd.putstr(ipserv) # Nossa tela html = """<!DOCTYPE html> <html> <head> <title>Pico W</title> </head> <body> <h1>Pico W</h1> <p>Bem-vindo</p> <p> <form method="post"> <label for="msg">Mensagem:</label><br> <input type="text" id="msg" name="mensagem" maxlength="16" size="16" ><br> <input type="submit" value="Mostra"> </form> </body> </html> """ # decodificação (simplificada) da resposta def txtDecode(txt): res = '' i = 0 while i < len(txt): car = txt[i] if car == '+': car = ' ' elif car == '%': code = unhexlify(txt[i+1:i+3]) if (code[0] >= 32) and (code[0] < 127): car = str(code)[2:-1] else: car = '?' i = i + 2 if (car >= ' ') and (car <= '~'): res = res + car i = i + 1 else: res = res + '?' i = i + 1 return res # Aguarda conexoes addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1] s = socket.socket() s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(addr) s.listen(1) print('Aguardando conexão em ', addr) # Listen for connections while True: try: cl, addr = s.accept() print('Cliente conectou de ', addr) request = cl.recv(1024) req = str(request)[2:-1] if req[0:5] == 'POST ': print ('POST') pos = req.find('mensagem=') if pos != -1: resp = (txtDecode(req[pos+9:]) + 16*' ')[0:16] lcd.move_to(0,1) lcd.putstr(resp) cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n') cl.send(html) cl.close() print('conexao encerrada') except OSError as e: cl.close() print('conexao encerrada')
Clique no botão de execução (o triângulo verde) na aba “Shell deve aparecer algo como:
O endereço IP também será apresentado no display conectado à Pico W.
Anote o endereço IP apresentado, é o endereço que a placa ganhou na rede e que será usado para acessá-la.
Apresentando uma Mensagem
Em um micro ou celular (conectado à mesma rede WiFi), abra o navegador e acesse a Pico W digitando na barra de endereço o IP que você anotou acima seguido de Enter. Será apresentada a tela abaixo:
Digite uma mensagem de até 16 caracteres e aperte o botão “Mostra” (ou digite Enter). A mensagem será apresentada na segunda linha do display.
Entendendo o Código
A primeira coisa que fazemos no nosso código é iniciar o display, usando as bibliotecas que instalamos em /lib.
Em seguida nos conectamos à rede WiFi e apresentamos o nosso endereço IP.
A comunicação entre um browser e um servidor segue um protocolo chamado http, que por sua vez usa o protocolo TCP para trocar mensagens. A Pico W vai se comportar como um servidor e fica aguardando (“listening”) conexões na porta 80 (o protocolo TCP usa portas para distinguir o tráfego das várias aplicações no mesmo dispositivo).
Quando digitamos um endereço e Enter na barra de endereços de um browser, ele faz uma conexão na porta 80 do endereço e envia uma requisição que começa com a palavra GET. O nosso programa responde enviando um texto que começa com ‘HTTP/1.0 200 OK’ (indicando sucesso) e inclui o código HTML que será usado pelo browser para desenhar a tela. Após receber esta resposta o browser encerra a conexão.
O nosso código HTML é bastante simples, contém algumas mensagens, um campo de entrada de dados e o botão “Mostra”.
Quando o botão é apertado, o browser vai enviar uma nova requisição que começa com a palavra POST e contém no final o texto que foi digitado no campo (precedido de “mensagem=”)
Existe uma última dificuldade: o texto enviado está codificado. Os espaços são substituídos por ‘+’ e caracteres acentuados e especiais são colocados no formato “%XX” onde XX é um código hexadecimal. A função txtDecode faz uma decodificação simplificada e converte os caracteres não disponíveis no display (como acentuados) em ‘?’.
Como exercício para confirmar que você entendeu o código, experimente deixar de apresentar o IP no display e acrescentar na tela um campo para a mensagem a apresentar na primeira linha.
Rodando Desconectado do Micro
Após a carga do programa, a Raspberry Pi Pico W não precisa estar conectada a um micro para funcionar. Para o código ser executado automaticamente, salve ele com o nome “code.py”.
Você pode alimentar a Pico W com um carregador de celular USB ou, para maior mobilidade, com um “power bank”.
Colocando a PicoW, o display e um power bank em uma caixa, você tem um display programável portátil e muito versátil.
Conclusão
Neste artigo vimos como é simples ligar um display alfanumérico a uma Raspberry Pico W e comandá-lo remotamente via browser. Não é preciso muito esforço para adaptar este exemplo a outros tipos de display. Com um pouco mais de programação é possível usar telas e formulários HTML mais sofisticados.
Use os comentários para contar os usos que você pretende dar para este exemplo e nos siga no Instagram para ficar a par dos novos artigos aqui no blog.