from machine import Pin, PWM #Para usar na manipilação das GPIOs
import time #Para usar nas temporizações
import network #Para usar na conexão com a rede e no access point
import socket #Para construção a página http
#As linhas abaixo são opcionais (mas deixam o processamento mais leve):
import esp #Para usar na remoção de mensagens de sistema do ESP
import gc #Para remoção dos objetos não usados
esp.osdebug(None) #Desliga as mensagens de debug da espressif
gc.collect() #Garbage Collector - Limpa os objetos não usados da memória do microcontrolador
#Ajustando alguns objetos:
led = Pin(2,Pin.OUT) #Utilizando o led 2 (built-in) como saída
wlan = network.WLAN(network.STA_IF) # criação da station interface
wlan.active(True) # ativação de interface
botao = Pin(4,Pin.IN,Pin.PULL_UP) #Utilizando o pino 4 como interface de botão
repique = time.ticks_ms()
#Ajustando funções:
#Função que se conecta à rede:
def conectar(rede,senha):
global wlan
if (not wlan.isconnected()):
wlan.connect(rede,senha)
while (not wlan.isconnected()):
pass
return True
#Função que mostra a página de acordo com o led da placa:
def pagina():
if led.value():
estado="Ligado"
else:
estado="Desligado"
html ="""
<html>
<head>
<title>Servidor Web de Chico</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="icon" href="data:,">
<style>
html{font-family: Helvetica; display:inline-block; margin: 0px auto; text-align: center;}
h1{color: #449944; padding: 4vh;}
p{font-size: 1.5rem;}
.button{
background-color: #FFFF00;
border-radius: 10px;
padding: 16px 40px;
font-size: 30px;
margin: 2px;
}
.button2{background-color: #0000FF;}
</style>
</head><body> <h1>Servidor WEB de Chico</h1>
<p>LED está: <strong>""" + estado + """</strong></p>
<p><a href="/?ligaLED"><button class="button">Liga</button></a></p>
<p><a href="/?desligaLED"><button class="button button2">Desliga</button></a></p></body>
</html>"""
print('Esp Iniciado!')
if conectar('H4ck3R','caBelo21'):
print('Conectado à rede:', wlan.ifconfig())
#Criando um socket para ficar ouvindo os requests de página (porta 80)
#A resposta ao request será o envio da página na variável html
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #criando um socket TCP/IP
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #Deixa reutilizar um IP
s.bind(('',80)) #ajusta para receber conexões de um determinado IP (vazio para qualquer IP) na porta 80
s.listen(4) #número máximo de conexões recebidas=4
#Loop pra ficar ouvindo requisições e lendo a interação dos usuários com o servidorzinho:
while True:
conexao, endr = s.accept() #método para aceitar a conexão, salvando em endr o endereço, enquanto conexao fica com a troca de pacotes do socket s
print(f"Conexão recebida de {endr}")
request = conexao.recv(1024)
request = str(request)
print(f"Solicitação recebida: {request}")
#lendo se houve request para apagar/acender o LED:
if request.find('/?ligaLED') == 6:
print('Ligando o LED!')
led.value(1)
if request.find('/?desligaLED') == 6:
print('Desligando o LED!')
led.value(0)
#lendo o botao físico:
if ((not botao.value()) and (time.ticks_ms()-repique > 300)):
repique = time.ticks_ms()
led.value(not led.value())
resposta = pagina() #carrega em "resposta" a página atualizada pela função "pagina"
#Finalmente, manda a página atualizada pro acessante:
conexao.send('HTTP/1.1 200 OK\n')
conexao.send('Content-Type: text/html\n')
conexao.send('Connection: close\n\n')
conexao.sendall(resposta)
conexao.close() #E encerra a conexão!