
# El programa escrito en Micropython utiliza la libreria BLE.py y
# permite establecer una conexion serial UART Bluetooth con un ESP32. 

# Por medio de la conexion se envian comandos como las letras "A", "a" y "b" 
# para cambiar el estado de un led conectado en el pin 2 del ESP32. 

# Una letra "A" pone el led en ON.
# Una letra "a" pone el led en OFF.
# Una letra "b" pone el led en BLINK.

# Tambien se puede conectar un display de 7 segmentos para enviar comandos
# y visualizar caracteres en el display (digitos, letras, etc).

# Se recomienda usar una app móvil Serial Bluetooth Terminal para 
# conectarse al ESP32 y enviarle los comandos que modifiquen el estado 
# del led o del display de 7 segmentos.

from machine import Pin
import bluetooth
from BLE import BLEUART
import time

# Aqui se definen los caracteres a desplegar en el display de 7 segmentos
# de acuerdo al diagrama que se muestra.
# ===============================================
#    Correspondencia de
#   Segmentos del display      Display 7 segmentos de cátodo común
#      GPIO <---> pin                  (numeración pines)

#           D2 2
#         #######
#        #       #                        4 3 g 2 1
#        #       #                        | | | | |
#   D4 3 #       # D15 1                  ---------
#        # D16 4 #                        |       |
#         #######                         |Display|
#        #       #                        |       |
#        #       #                        ---------
#  D17 5 #       # D18 7                  | | | | |
#        #       #                        5 6 g 7 8
#         #######  # D19 8
#           D5 6
#
# ==============================================

ninguno = {15:0, 2:0, 4:0, 16:0, 17:0, 5:0, 18:0, 19:0}
cero  =   {15:1, 2:1, 4:1, 16:0, 17:1, 5:1, 18:1, 19:0}
uno   =   {15:1, 2:0, 4:0, 16:0, 17:0, 5:0, 18:1, 19:0}
dos   =   {15:1, 2:1, 4:0, 16:1, 17:1, 5:1, 18:0, 19:0}
tres  =   {15:1, 2:1, 4:0, 16:1, 17:0, 5:1, 18:1, 19:0}
cuatro=   {15:1, 2:0, 4:1, 16:1, 17:0, 5:0, 18:1, 19:0}
cinco =   {15:0, 2:1, 4:1, 16:1, 17:0, 5:1, 18:1, 19:0}
seis =    {15:0, 2:1, 4:1, 16:1, 17:1, 5:1, 18:1, 19:0}
siete =   {15:1, 2:1, 4:0, 16:0, 17:0, 5:0, 18:1, 19:0}
ocho =    {15:1, 2:1, 4:1, 16:1, 17:1, 5:1, 18:1, 19:0}
nueve =   {15:1, 2:1, 4:1, 16:1, 17:0, 5:1, 18:1, 19:0}
osup =    {15:1, 2:1, 4:1, 16:1, 17:0, 5:0, 18:0, 19:0}
oinf =    {15:0, 2:0, 4:0, 16:1, 17:1, 5:1, 18:1, 19:0}
punto =   {15:0, 2:0, 4:0, 16:0, 17:0, 5:0, 18:0, 19:1}

# Esta funcion despliega el caracter indicado en el display 7 segmentos
# encendiendo los pines necesarios segun sea el caracter.
def despliega(caracter):
    for i in caracter:
        if caracter[i]==1:
            pin=Pin(i,Pin.OUT)
            pin.on()
        else:
            pin=Pin(i,Pin.OUT)
            pin.off()

def efecto():
    for i in range(0,5):
        despliega(oinf)
        time.sleep(0.2)
        despliega(osup)
        time.sleep(0.2)
    despliega(ninguno)

def contar():
   secuencia = [cero, uno, dos, tres, cuatro, cinco, seis, siete, ocho, nueve]
   for i in secuencia:
       despliega(i)
       time.sleep(0.5)
   despliega(ninguno)

# Aqui se define el pin 2 para el control del led en estados  ON, OFF y BLINK
# Nota Se puede usar el pin 19 para emplear el punto del display en vez del led 

# pin = Pin(2, Pin.OUT) 
pin = Pin(19, Pin.OUT)
pin.off()

nombre = input("Dar un nombre: \n")
print ("Nombre bluetooth: "+nombre+"\n")
ble = bluetooth.BLE()
uart = BLEUART(ble,nombre)
despliega(ninguno)

def on_rx():
    rx_recibe = uart.read().decode().strip()    
    uart.write("ESP32 ha recibido ->"+str(rx_recibe)+"\n")
    print("Se ha recibido -> ",rx_recibe)

    if rx_recibe == "A":
        pin.value(1)
    if rx_recibe == "a":
        pin.value(0)
    if rx_recibe == "b":
        for n in range(0,10):
            pin.value(1)
            time.sleep(0.1)
            pin.value(0)
            time.sleep(0.1)
    if rx_recibe == "0":
        despliega(cero)
    if rx_recibe == "1":
        despliega(uno)
    if rx_recibe == "2":
        despliega(dos)
    if rx_recibe == "3":
        despliega(tres)
    if rx_recibe == "4":
        despliega(cuatro)
    if rx_recibe == "5":
        despliega(cinco)
    if rx_recibe == "6":
        despliega(seis)
    if rx_recibe == "7":
        despliega(siete)
    if rx_recibe == "8":
        despliega(ocho)
    if rx_recibe == "9":
        despliega(nueve)
    if rx_recibe == "blanco":
        despliega(ninguno)
    if rx_recibe == "osup":
        despliega(osup)
    if rx_recibe == "oinf":
        despliega(oinf)
    if rx_recibe == ".":
        despliega(punto)
    if rx_recibe == "efecto":
        efecto()
    if rx_recibe == "efecto2":
        contar()

uart.irq(handler=on_rx)    


