Comunicación y control local por dispositivo celular


 1. MODULO ESP-01

Definición:

Es un pequeño módulo basado en el chip ESP8266 que permite añadir conectividad WiFi a cualquier microcontrolador, com la Raspberry Pi Pico; actúa como un puente que recibe comandos por cable (UART) y los traduce a señales inalámbricas.





2. COMUNICACIÓN UART (UNIVERSAL ASYNCHRONOUS RECEIVER-TRANSMITTER)

Definición:

Es un protocolo de comunicación serie que permite que dos dispositivos intercambien datos usando solo dos cables: Tx (transmisión) y Rx (recepción). 


3. COMANDO "AT" UTILIZADOS EN ESTA SESIÓN

Definición:

Los comandos AT son instrucciones textuales que se envían al ESP-01 para configurarlo, conectarlo a WiFi y crear servidores. Cada comando comienza con "AT" (attention) seguido de una instrucción específica.


4. PROTOCOLO TCP/IP  Y SERVIDOR

Definición:

TCP/IP es el conjunto de reglas qeu permite que los dispositivos se comuniquen a través de una red. Un servidor es un programa que espera pasivamente a que otros dispositivos (clientes) se conecten a él.


Puerto de red es como un "número de habitación¨en la dirección IP de un dispositivo. La IP es la dirección de la casa, el puerto es la puerta específica por donde se comunican los programas.


5. APP "TCP CLIENT"


Definición:

Es una aplicación gratuita para celular que permite conectarse a servidores TCP/IP y enviar mensajes de texto. En este proyecto, se usa para enviar los comandos ON y OFF al ESP-01.



PRACTICA GUIADA


Recuerda que las lineas de texto y contenido que tengan al inicio un símbolo de # no se considera como código, solo es para nuestra lectura, como una nota.

El docente recuerda a los estudiantes que pueden copiar y pegar el código completo en Thonny y funcionará.  No olvides cambiar el nombre de tu SSID y tu clave de red PASSWORD.

1. El docente guía a los estudiante a ingresar la primera Sección:

# ============================================
# SECCIÓN 1: IMPORTACIÓN DE BIBLIOTECAS
# ============================================
from machine import UART, Pin
import time

2. El docente guía a los estudiantes a ingresar los códigos a las sección Variables:

# ============================================
# SECCIÓN 2: VARIABLES Y CONSTANTES
# ============================================
# LED integrado de la Raspberry Pi Pico
LED = Pin(14, Pin.OUT)

# Configuración de la comunicación UART con el ESP-01
UART_BAUDRATE = 115200
UART_TX_PIN = 4    # GP4 conectado al RX del ESP-01
UART_RX_PIN = 5    # GP5 conectado al TX del ESP-01

# Configuración de tu red WiFi
# ============================================
# ¡¡¡CAMBIAR POR LOS DATOS DE TU WiFi!!!
# ============================================
SSID = "coloca la tuya"        # <--- Ejemplo: "MOVISTAR_1234"
PASSWORD = "coloca la tuya"      # <--- Ejemplo: "miclave123"
# ============================================

# Configuración del servidor TCP
PUERTO_SERVIDOR = 5000

# Estado inicial del LED
LED.value(0)  # LED apagado

3. El docente guía a los estudiantes a ingresar el código en la sección 3 correspondiente a Configuración de Hardware.

# ============================================
# SECCIÓN 3: CONFIGURACIÓN DE HARDWARE
# ============================================
# Inicializar comunicación UART con el ESP-01
uart = UART(1, baudrate=UART_BAUDRATE, tx=Pin(UART_TX_PIN), rx=Pin(UART_RX_PIN))
time.sleep(2)  # Pausa para estabilizar

def enviar_comando(comando, tiempo_espera=2):
    """
    Envía un comando AT al ESP-01 y retorna la respuesta.
    """
    uart.write(comando + "\r\n")
    time.sleep(tiempo_espera)
    respuesta = ""
    while uart.any():
        respuesta += uart.read().decode('utf-8')
    print(f"CMD: {comando} -> {respuesta.strip()}")
    return respuesta

print("=" * 50)
print("INICIANDO CONFIGURACIÓN DEL ESP-01")
print("=" * 50)

4. El docente guía a los estudiantes a colocar el código en la cuarta sección sobre Funciones.

# ============================================
# SECCIÓN 4: FUNCIONES AUXILIARES
# ============================================
def conectar_wifi():
    """
    Conecta el ESP-01 a la red WiFi configurada.
    Retorna True si conecta exitosamente, False en caso contrario.
    """
    print(f"\n1. Conectando a WiFi: {SSID}")
    
    # Configurar modo estación (cliente)
    enviar_comando("AT+CWMODE=1", 2)
    
    # Conectar a la red WiFi
    respuesta = enviar_comando(f'AT+CWJAP="{SSID}","{PASSWORD}"', 10)
    
    if "GOT IP" in respuesta or "CONNECTED" in respuesta:
        print("   ✅ WiFi conectado exitosamente")
        return True
    else:
        print("   ❌ Error al conectar a WiFi")
        return False

def crear_servidor():
    """
    Crea un servidor TCP en el ESP-01 para recibir comandos.
    """
    print("\n2. Configurando servidor TCP...")
    
    # Permitir múltiples conexiones
    enviar_comando("AT+CIPMUX=1", 1)
    
    # Crear servidor en el puerto especificado
    enviar_comando(f"AT+CIPSERVER=1,{PUERTO_SERVIDOR}", 1)
    print(f"   ✅ Servidor creado en puerto {PUERTO_SERVIDOR}")

def mostrar_ip():
    """
    Muestra la dirección IP del ESP-01 en la red.
    """
    print("\n3. Obteniendo dirección IP...")
    enviar_comando("AT+CIFSR", 2)

def controlar_led(mensaje):
    """
    Analiza el mensaje recibido y controla el LED.
    """
    if "ON" in mensaje or "on" in mensaje:
        LED.value(1)
        print("   💡 LED ENCENDIDO")
        # Enviar confirmación al celular
        enviar_comando("AT+CIPSEND=0,14", 0.2)
        uart.write("LED ENCENDIDO\r\n")
        return True
    elif "OFF" in mensaje or "off" in mensaje:
        LED.value(0)
        print("   💡 LED APAGADO")
        # Enviar confirmación al celular
        enviar_comando("AT+CIPSEND=0,13", 0.2)
        uart.write("LED APAGADO\r\n")
        return True
    return False

5. El docente guía a los estudiantes para la escritura del código sobre la última sección y así hacer funcionar todo el conjunto en armonía.

# ============================================
# SECCIÓN 5: EJECUCIÓN PRINCIPAL Y BUCLE
# ============================================
def main():
    """
    Función principal que ejecuta la configuración y el bucle de control.
    """
    # Conectar a WiFi
    if not conectar_wifi():
        print("\n⚠️ No se pudo conectar a WiFi. Reiniciando...")
        while True:
            LED.value(1)
            time.sleep(0.2)
            LED.value(0)
            time.sleep(0.2)
    
    # Mostrar IP
    mostrar_ip()
    
    # Crear servidor
    crear_servidor()
    
    # Mostrar instrucciones finales
    print("\n" + "=" * 50)
    print("✅ SISTEMA LISTO")
    print("=" * 50)
    print("\n📱 CONFIGURACIÓN EN LA APP TCP CLIENT:")
    print("   ┌─────────────────────────────────┐")
    print("   │  Protocolo: TCP Client                                                        │")
    print("   │  IP: (ver arriba en AT+CIFSR)                                            │")
    print(f"  │  Puerto: {PUERTO_SERVIDOR}                                     │")
    print("   │  Name: (cualquiera, ej. Pico)                                              │")
    print("   └─────────────────────────────────┘")
    print("\n📲 COMANDOS PARA ENVIAR:")
    print("   ┌─────────────────────────────────┐")
    print("   │  Escribe 'ON'  → LED enciende                                          │")
    print("   │  Escribe 'OFF' → LED apaga                                              │")
    print("   └─────────────────────────────────┘")
    print("\n" + "=" * 50)
    print("ESPERANDO COMANDOS DESDE EL CELULAR...")
    print("=" * 50)
    
    # Bucle principal: escuchar comandos
    while True:
        if uart.any():
            datos = uart.read()
            if datos:
                try:
                    mensaje = datos.decode('utf-8')
                    print(f"\n📲 Mensaje recibido: {mensaje[:50]}...")
                    controlar_led(mensaje)
                except Exception as e:
                    print(f"Error al decodificar: {e}")
        
        time.sleep(0.05)  # Pequeña pausa para no saturar

# ============================================
# PUNTO DE ENTRADA DEL PROGRAMA
# ============================================
if __name__ == "__main__":
    main()
    

6. El docente guía a los estudiantes para interconectar los componentes sobre el protoboard.

El docente guía a los estudiantes para la colocación de los componentes electronicos a utilizar en el proyecto en el protoboard    



Comentarios