# 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)
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT