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')



 

 

NO YOUTUBE


NOSSO PODCAST