# Demonstração do uso do ESP01 com o Raspberry Pi Pico
# https://www.filipeflop.com/blog/como-conectar-a-raspberry-pi-pico-ao-wifi-com-esp8266/
import machine
import utime
import json
# Coloque aqui as informações da sua rede
ssid = "Wokwi-GUEST"
password = ""
# Coloque aqui a latitude e longitude da sua cidade
latitude = '-23.427320'
longitude = '-51.936958'
# Mudar para True para mostrar comandos e respostas
debug = False
# Inicia a UART
uart0 = machine.UART(0, baudrate=115200, rxbuf=10000)
# Le uma linha finalizada por \n
def leResp(uart=uart0, timeout=2000, ignoraVazias=True):
resp = b""
try:
limite = utime.ticks_ms()+timeout
while utime.ticks_ms() < limite:
if uart.any():
c = uart.read(1)
if c == b'\r': # ignora \r
continue
if c == b'\n':
if resp != b"" or not ignoraVazias:
break
else:
resp = resp+c
if debug:
print ("RESP: "+resp.decode())
return resp.decode()
except Exception as e:
if debug:
print(e)
return ""
# Envia um comando para o ESP-01 e le a resposta
def enviaCmdESP(cmd, uart=uart0, timeout=2000):
if debug:
print ("CMD: "+cmd)
uart.write(cmd+"\r\n")
leResp(timeout=timeout) # echo do comando
return leResp(timeout=timeout)
# Envia dados
def enviaDadosESP(dados, uart=uart0, timeout=2000):
tam = len(dados)
if enviaCmdESP("AT+CIPSEND="+str(tam), timeout=timeout) == "OK":
uart.write(dados)
while True:
resp = leResp(timeout=timeout)
if resp == 'SEND OK':
return True
if resp == 'ERROR':
return False
if resp == 'SEND FAIL':
return False
if resp == '':
return False
else:
return False
# Le resposta HTTP
def leRespHTTP(uart=uart0, timeout=10000):
leResp(ignoraVazias=False, timeout=timeout)
while not leResp(ignoraVazias=False, timeout=timeout) == "":
pass
resp = ""
while True:
r = leResp(ignoraVazias=False, timeout=500)
resp = resp+r
if r == "":
return resp
# Testa se comunicação OK
def testaESP(uart=uart0):
resp = enviaCmdESP("AT")
return resp == "OK"
# Conecta com a rede WiFi
def conectaWiFi(uart=uart0):
# Coloca no modo Station
if not enviaCmdESP("AT+CWMODE=1") == "OK":
print ("Erro ao colocar no modo Station")
return False
# Dispara conexão
if not enviaCmdESP('AT+CWJAP="'+ssid+'","'+password+'"',
timeout=10000) == "WIFI DISCONNECT":
print ("Resposta inesperada")
return False
if not leResp(timeout=10000) == "WIFI CONNECTED":
print ("Erro ao conectar ao AP")
return False
if not leResp(timeout=10000) == "WIFI GOT IP":
print ("Erro ao solicitar IP")
return False
return leResp() == "OK"
# Faz a consulta à API
def consultaTempo(uart=uart0):
# Connecta ao site
ip = '167.99.8.254'
if not enviaCmdESP('AT+CIPSTART="TCP","'+ip+'",80',
timeout=10000) == "CONNECT":
print ("Erro ao conectar ao site")
return None
leResp() # Lê o "OK"
# Envia a requisição
url = '/bin/civillight.php?lon='+longitude+'&lat='+latitude+ \
'&output=json'
if not enviaDadosESP('GET '+url+ \
' HTTP/1.1\r\nHost: www.7timer.info\r\n\r\n'):
print ("Erro ao enviar a requisição")
return None
# Le a resposta
resp = leRespHTTP(timeout=10000)
try:
return json.loads(resp)
except JSONDecodeError:
print ("Resposta em formato incorreto")
return None
# Dicionario para traduzir a previsao
previsoes = {
'clear': 'limpo',
'mcloudy': 'parcialmente nublado',
'cloudy': 'nublado',
'rain': 'chuva',
'snow': 'neve',
'ts': 'tempestade',
'tsrain': 'tempestade com chuva'
}
# Programa Principal
print()
print('----------------------------------')
if not testaESP():
print ("ESP não respondendo corretamente!")
print ("Conectando à rede...")
if conectaWiFi():
print ("ESP conectado à rede")
print ("Consultando previsão do tempo...")
resp = consultaTempo()
if (not resp is None) and ('dataseries' in resp):
data = str(resp['dataseries'][0]['date'])
print ('Data: '+data[6:8]+'/'+data[4:6]+'/'+data[0:4])
previsao = resp['dataseries'][0]['weather']
if previsao in previsoes:
previsao = previsoes[previsao]
print ('Previsao: '+previsao)