Neste artigo vamos mostrar como é possível acionar uma Raspberry Pi Pico 2W através da rede WiFi.
A Pi Pico 2 W é um placa de desenvolvimento que possui uma antena para conexão WiFi. No artigo Conectando a Pi Pico 2 W na rede WiFi temos como escanear e conectar a placa na rede WiFi, agora iremos acender e apagar o LED da placa através do navegador instalado no celular, computador ou tablet. É possível também conectar diversas placas que tenham conexão WiFi com a Pi Pico 2 e fazer requisições via rede.
Vídeo de como aplicar este exemplo
https://www.youtube.com/watch?v=mmKc0gI0z64
Síncrono e Assíncrono
Antes de entender o código que iremos utilizar, primeiro precisamos entender o tipo de conexão e processamento que a Pi Pico 2W irá utilizar, que é o método de requisições e respostas assíncrona, onde as requisições não são processadas em sequência, conforme vemos na figura abaixo.
Realizando a conexão
O primeiro passo em nossa aplicação é descobrir qual é o endereço IP que a sua placa Pi Pico recebeu ao se conectar com a sua rede WiFi. Digitamos este endereço no navegador, que aciona a Pi Pico 2W que responde à requisição enviando uma string que contém as tags de marcação HTML para o navegador, que por usa vez irá interpretar e montar uma página WEB em sua tela. Se esta página tiver links ou formulários (botões, textos, etc), o o usuário poderá clicar e enviar os dados para a Pi Pico e assim fazer uma nova requisição. Em nosso exemplo a página HTML tem dois botões, que ao serem acionados, enviam uma requisição para a Pi Pico 2W, que acenderá ou apagará o LED.
O modelo de como esta requisição é feita está na figura abaixo.
Código Fonte
Abaixo temos o código fonte utilizado, com as linhas comentadas. A linguagem utilizada foi a micropython na IDE do Thonny.
# Importar Modulos
import network
import asyncio
import socket
import time
import secrets
from machine import Pin
# Credenciais Wi-Fi
# arquivo secrets.py
ssid = secrets.login['ssid'] #Nome da rede
password = secrets.login['password'] #senha
# Define o LED - (led da placa)
led_controle = Pin("LED", Pin.OUT)
led_controle.value(0)
# Inicializa Variável
LED_estado = "DESLIGADO"
# HTML template para a pagina
def webpage(LED_estado):
html = f"""
<!DOCTYPE html>
<html>
<head>
<title>MoocaLAB servidor WEB</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body style="background-color:Black;color:White">
<h1 style="background-color:Darkred;color:White;">MoocaLAB</h1>
<h2>Controle do LED</h2>
<p style="font-size:2em">LED: {LED_estado}</p>
<form action="./LEDligado">
<input type="submit" value="Liga LED" style="font-size: 2.5em; background-color:Green" />
</form>
<br>
<form action="./LEDdesligado">
<input type="submit" value="Desliga LED" style="font-size: 2.5em ;background-color:White"/>
</form>
</body>
</html>
"""
return str(html)
# Inicializa interface Wi-Fi
def init_wifi(ssid, password):
redew = network.WLAN(network.STA_IF)
redew.active(True)
# Conecta na rede
redew.connect(ssid, password)
# Esperar por conexao Wi-Fi
conexao_timeout = 10
while conexao_timeout > 0:
print(redew.status())
if redew.status() >= 3:
break
conexao_timeout -= 1
print('Esperar por conexao')
time.sleep(1)
# Veriifica se conexao sucedida
if redew.status() != 3:
print('Falha para conectar na rede Wi-Fi')
return False
else:
print('Conexao com Sucesso!')
network_info = redew.ifconfig()
print('Endereco IP:', network_info[0])
return True
# Funcoes assincronas para gerenciar requisitos do cliente.
async def handle_client(reader, writer):
global LED_estado
print("Cliente conectado")
requisita_linha = await reader.readline() # co rotina
print('Requisicao:', requisita_linha)
# desconsidera headers HTTP
while await reader.readline() != b"\r\n": #co rotina
pass
request = str(requisita_linha, 'utf-8').split()[1] #LHCB
print('Request:', request)
# Processo de requisição e atualização de variaveis
if request == '/LEDligado?':
print('LED Ligado')
led_controle.value(1)
LED_estado = 'LIGADO'
elif request == '/LEDdesligado?': #LEDdesligado lightoff
print('LED Desligado')
led_controle.value(0)
LED_estado = 'DESLIGADO'
# Gera resposta em HTML
resposta = webpage(LED_estado)
# Envia resposta HTTP e fecha conexao
writer.write('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
writer.write(resposta)
await writer.drain() # co rotina envia resposta
await writer.wait_closed() # fecha conexao
print('Cliente Desconectado')
async def main():
if not init_wifi(ssid, password):
print('Finalizando Programa.')
return
# Inicia o Server e executa o Loop de evento
print('Configurando o Servidor')
server = asyncio.start_server(handle_client, "0.0.0.0", 80)
asyncio.create_task(server)
while True:
# Adicione outras tarefas que necessitar no loop
await asyncio.sleep(5) # co rotina
print('Essa mensagem será impressa a cada 5 segundos')
# Cria o Loop de eventos
loop = asyncio.get_event_loop()
# Cria uma tarefa para rodar a funcao main como co rotina
loop.create_task(main())
try:
# Executa o loop de eventos indefinidamente
loop.run_forever()
except Exception as e:
print('Ocorreu o erro: ', e)
except KeyboardInterrupt:
print('Programa interrompido pelo usuario')