Display IoT com Raspberry Pi Pico W Deixe um comentário

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.

Display IoT com Raspberry Pi Pico W
Display IoT com Raspberry Pi Pico W

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:

esquemático Display IoT com Raspberry Pi Pico W
Esquemático – Display IoT com Raspberry Pi Pico W

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.

Faça seu comentário

Acesse sua conta e participe