Servidor Esp8266 con dos leds Version II




Presentación


Este este segundo proyecto del uso de la libreria "uasyncio" surge a partir de la observacion que me realizara el usuario Manolo Barrera del canal de telegram Canal Micropython que en la Version I al cerrarse la pagina en el navegador no sólo se detenia la rutina del sservidor, sino que se detenían todas las demas corrutinas; asi mismo quiero hacer publico mi agradecimiento al mismo por haberme facilitado un ejemplo del uso de "uasyncio.start_server" que me ha permitido desarrollar el presente proyecto.

En este proyecto tambien se proponen realizar las siguientes tareas:

1.- Un servidor web con una pagina que informa el estado de dos led y permite activar o desactivar su encendido y apagado.

2.- Dos rutinas que cada una maneja el encendido y apagado de uno de los led

3.- Una rutina que solo va acumulando un contador para saber cuantos ciclos se han cumplido y si el programa sigue corriendo


Materiales


Placa Wemos D1 R1

Dos Leds


Montaje del proyecto en la placa Wemos D1 R1


Para utilizar la placa Wemos D1 R1 con MicroPython es necesario flashear primero la misma con el firmware correspondiente. En el caso de la utilizada en este modelo se utilizo el "esp8266-20220618-v1.19.1.bin" provisto por la pagina de Firmware ESP8266

Pueden usar esa version o alguna otra de la pagina, no todas las versiones son compatibles con todas las placas segun mi experiencia.

Para flashear la placa lo hago directamente desde un a terminal de linux abierta en la carperta donde trngo el firmware y utilizo la linea de comando: esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect -fm dout 0 esp8266-20220618-v1.19.1.bin.

Aqui cabe la misma aclaracion realizada con respecto al firmware, no todas las placas admiten la misma linea de comandos para grabar eñ firmware e incluso algunas lo hacen mejor con aplicaciones como Thonny. Hay que animarse y probar cambios cuando no funciona.

Una vez instalado el firmware en la placa utilizando la utilidad que viene provista por el IDE Thonny, o por aquella que ustedes utilicen elimino el archivo boot.py y copio el codigo que se detalla mas adelante

Ademas deben conectarse a la placa los dos leds conforme el diagrama puesto a continuacion:



Código


El código se ha escrito en un unico archivo main.py.




from machine import Pin
import uasyncio
import network
import utime
        
red = '++++++++'
clave = '++++++++'
        
pin_04 = Pin(4, Pin.OUT, value=0)
pin_05 = Pin(5, Pin.OUT, value=0)
        
estado1 = "Inactivo"
estado2 = "Inactivo"
control1 = False
control2 = False
        
        
        
        
def conecta_wifi():
                    wifi = network.WLAN(network.STA_IF)
                    wifi.active(True)
                    wifi.connect(red, clave)
                
                    while wifi.isconnected() == False:
                        pass
                
                    print('Conectada a Wifi')
                    print('************************')
                    print('RED:     %s' % red)
                    print('IP:      %s\nSUBNET:  %s\nGATEWAY: %s\nDNS:     %s' % wifi.ifconfig()[0:4])
                    a = wifi.config('mac')
                    print('MAC:     {:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(a[0],a[1],a[2],a[3],a[4]))
                    print('************************+')
        
        
        
        
def crear_respuesta_http(solicitud):
            global estado1
            global estado2
            global control1
            global control2
        
            if solicitud.find('/?control1=act') == 6:
                print('Activa Led verde')
                estado1 = "Activo"
                control1 = True
            if solicitud.find('/?control1=des') == 6:
                print('Desactiva Led verde')
                control1 = False
                estado1 = "Inactivo"
            if solicitud.find('/?control2=act') == 6:
                print('Activa Led rojo')
                estado2 = "Activo"
                control2 = True
            if solicitud.find('/?control2=des') == 6:
                print('Activa Led rojo')
                control2 = False
                estado2 = "Inactivo"
         
            pagina = """
        <!DOCTYPE html>
        <html>
            <head>
                <title>Esp32</title>
                <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
                <meta name="viewport" content="width=device-width, initial-scale=1">
            </head>
            <body align='center'>
                <h1>Servidor Esp8266</h1>
                <br>
                <h3>Estado del Led Verde:</h3>
                <h4 style='color: #27AE60;'>""" + estado1 + """</h4>
                <button id='boton' type="button" onclick="window.location.href='/?control1=act'; alert('Ud. activo flash led verde');">ACTIVAR</button>  
                <button id='boton' type="button" onclick="window.location.href='/?control1=des'; alert('Ud. desactivo flash led verde');">DESACTIVAR</button>  
                <h3>Estado del Led Rojo:</h3>
                <button id='boton' type="button" onclick="window.location.href='/?control2=act'; alert('Ud. activo flash led rojo');">ACTIVAR</button>  
                <button id='boton' type="button" onclick="window.location.href='/?control2=des'; alert('Ud. desactivo flash led rojo');">DESACTIVAR</button>  
                <h4 style='color: #E74C3C;'>""" + estado2 + """</h4>
                
            </body>
        </html>
        """      
            return (pagina)
        
async def conexion_servidor(lectura, escritura):
            print("Cliente conectado")
            solicitud = await lectura.read(1024)
            solicitud = str(solicitud)
            respuesta = crear_respuesta_http(solicitud)
            escritura.write(respuesta)
            await escritura.drain()
            lectura.close()
            await lectura.wait_closed()
            escritura.close()
            print("Conexion cerrada")
            
async def contador():
            
            contador = 0                      
            while True:               
                print("contador")
                print(contador)
                await uasyncio.sleep(1)
                contador +=1
                
                
                
async def led_verde():
            global control1
            while True:
                if (control1 == True):
                    pin_04.on()
                    print("Led verde encendido")
                    await uasyncio.sleep(3)
                    pin_04.off()
                    print("Led verde apaagado")
                await uasyncio.sleep(3)
         
                
async def led_rojo():
            global control2
            while True:
                if (control2 == True):
                    pin_05.on()
                    print("Led rojo encendido")
                    await uasyncio.sleep(5)
                    pin_05.off()
                    print("Led rojo apagado")
                await uasyncio.sleep(5)
                
        
        
conecta_wifi()
        
print("Servidor funcionando...")
servidor = uasyncio.start_server(conexion_servidor, '0.0.0.0', 80, 5)
loop = uasyncio.get_event_loop()
loop.create_task(servidor)
loop.create_task(contador())
loop.create_task(led_verde())
loop.create_task(led_rojo())
loop.run_forever()              

    


Funcionamiento


Una vez iniciado el programa debemos acceder con un navegador a la IP que nuestra red le haya asignado a la placa y se abrira la siguiente pagina:

En la misma podremos activar alternativamente o en forma simultanea los leds para que empiecen a parpadear cada uno a su propio ritmo y detenerlos cuando deseemos, pudiendo observar asi como la placa realiza tres tareas independientes, el parpadeo de cada led y el funcionamineto del servidor. A su vez en el monitor serial podremos observar una cuarta tarea que funciona ininterrumpidamente mostrandonos un contador. Si cerramos la pagina wn wl navegador veremos que el contador continuara corriendo y los leds seguiran en encendiendose y apagandose si estan activos. Si volvemos a abrir la pagina podremos modificar su estado.

La idea de este proyecto mes ejemplificar un modo sencillo de simular tareas simultaneas utilizando la placa Esp8266 y la libreria uasyncio.


Quedo disposición de quien quiera hacerme consultas o sugerencias mi correo electronico es carlosvaccaro1960@gmail.com