Tema 2

Sistemas de Comunicaci贸n ESP32

ESP32 - WiFi, Bluetooth y LoRa

Duraci贸n: 20 horas | Evaluaci贸n: 1陋 Evaluaci贸n

Resultados de Aprendizaje y Criterios de Evaluaci贸n

RA 2: Verifica el funcionamiento de equipos de radiocomunicaciones, analizando su estructura interna y sus caracter铆sticas.

Criterios de Evaluaci贸n:

Puntuaci贸n Total RA 2: 2,2 puntos

2.1 WiFi: Modos AP y Station

2.1.1 Modo Station (STA)

El ESP32 act煤a como cliente conect谩ndose a una red WiFi existente:

#include "WiFi.h" const char* ssid = "MiRedWiFi"; const char* password = "miPassword123"; void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.print("Conectando a WiFi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.println("WiFi conectado!"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } void loop() { // Verificar estado de conexi贸n if (WiFi.status() == WL_CONNECTED) { Serial.println("WiFi conectado"); } else { Serial.println("WiFi desconectado"); } delay(5000); }

2.1.2 Modo Access Point (AP)

El ESP32 crea su propia red WiFi:

#include "WiFi.h" const char* ssid = "ESP32_AP"; const char* password = "12345678"; void setup() { Serial.begin(115200); WiFi.mode(WIFI_AP); WiFi.softAP(ssid, password); Serial.println("Access Point iniciado"); Serial.print("SSID: "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.softAPIP()); } void loop() { // Mostrar clientes conectados Serial.printf("Clientes conectados: %d\n", WiFi.softAPgetStationNum()); delay(5000); }

2.2 Protocolos TCP/UDP

2.2.1 Comunicaci贸n TCP

Protocolo orientado a conexi贸n para transmisi贸n confiable:

#include "WiFi.h" #include "WiFiClient.h" WiFiClient client; void setup() { Serial.begin(115200); WiFi.begin("SSID", "password"); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Conectando..."); } Serial.println("Conectado a WiFi"); } void loop() { if (client.connect("192.168.1.100", 8080)) { Serial.println("Conectado al servidor"); // Enviar datos client.println("Hola desde ESP32"); // Recibir respuesta while (client.available()) { String line = client.readStringUntil('\r'); Serial.println(line); } client.stop(); } delay(5000); }

2.2.2 Comunicaci贸n UDP

Protocolo sin conexi贸n para transmisi贸n r谩pida:

#include "WiFi.h" #include "WiFiUdp.h" WiFiUDP udp; void setup() { Serial.begin(115200); WiFi.begin("SSID", "password"); while (WiFi.status() != WL_CONNECTED) { delay(1000); } udp.begin(8080); Serial.println("UDP iniciado en puerto 8080"); } void loop() { // Enviar paquete UDP udp.beginPacket("192.168.1.100", 8080); udp.print("Datos desde ESP32"); udp.endPacket(); // Recibir paquetes int packetSize = udp.parsePacket(); if (packetSize) { char buffer[255]; int len = udp.read(buffer, 255); buffer[len] = '\0'; Serial.println(buffer); } delay(1000); }

2.3 Bluetooth Classic y BLE

2.3.1 Bluetooth Classic

Comunicaci贸n de datos a alta velocidad:

#include "BluetoothSerial.h" BluetoothSerial SerialBT; void setup() { Serial.begin(115200); SerialBT.begin("ESP32_BT"); // Nombre del dispositivo Serial.println("Bluetooth iniciado. Empareja el dispositivo."); } void loop() { // Enviar datos por Bluetooth if (SerialBT.available()) { String received = SerialBT.readString(); Serial.println("Recibido: " + received); // Responder SerialBT.println("Echo: " + received); } // Enviar datos desde Serial if (Serial.available()) { String data = Serial.readString(); SerialBT.println(data); } }

2.3.2 Bluetooth Low Energy (BLE)

Comunicaci贸n de bajo consumo:

#include "BLEDevice.h" #include "BLEServer.h" #include "BLEUtils.h" BLEServer* pServer = NULL; BLECharacteristic* pCharacteristic = NULL; #define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b" #define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8" class MyServerCallbacks: public BLEServerCallbacks { void onConnect(BLEServer* pServer) { Serial.println("Cliente conectado"); }; void onDisconnect(BLEServer* pServer) { Serial.println("Cliente desconectado"); } }; void setup() { Serial.begin(115200); BLEDevice::init("ESP32_BLE"); pServer = BLEDevice::createServer(); pServer->setCallbacks(new MyServerCallbacks()); BLEService *pService = pServer->createService(SERVICE_UUID); pCharacteristic = pService->createCharacteristic( CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE ); pCharacteristic->setValue("Hola BLE"); pService->start(); BLEAdvertising *pAdvertising = BLEDevice::getAdvertising(); pAdvertising->addServiceUUID(SERVICE_UUID); pAdvertising->setScanResponse(true); pAdvertising->setMinPreferred(0x06); pAdvertising->setMaxPreferred(0x12); BLEDevice::startAdvertising(); Serial.println("BLE Server iniciado"); }

2.4 Comunicaciones LoRa

2.4.1 Configuraci贸n de M贸dulo LoRa

Comunicaci贸n de largo alcance con m贸dulos SX1276/SX1278:

#include #define SCK 5 #define MISO 19 #define MOSI 27 #define SS 18 #define RST 14 #define DIO0 26 void setup() { Serial.begin(115200); // Configurar pines SPI LoRa.setPins(SS, RST, DIO0); if (!LoRa.begin(433E6)) { Serial.println("Error iniciando LoRa!"); while (1); } // Configurar par谩metros LoRa.setTxPower(20); LoRa.setSpreadingFactor(7); LoRa.setSignalBandwidth(125E3); LoRa.setCodingRate4(5); Serial.println("LoRa iniciado correctamente"); } void loop() { // Enviar paquete LoRa.beginPacket(); LoRa.print("Hola LoRa!"); LoRa.endPacket(); // Recibir paquetes int packetSize = LoRa.parsePacket(); if (packetSize) { Serial.print("Recibido: "); while (LoRa.available()) { Serial.print((char)LoRa.read()); } Serial.println(); } delay(5000); }

2.5 Antenas y Sistemas Radiantes

2.5.1 Tipos de Antenas

Diferentes tipos de antenas para ESP32:

Antenas integradas:

  • PCB Antenna: Antena impresa en la placa
  • Chip Antenna: Antena de chip cer谩mico

Antenas externas:

  • Dipolo: Antena de media onda
  • Monopolo: Antena de cuarto de onda
  • Helicoidal: Para aplicaciones direccionales

2.5.2 Medici贸n de ROE (Relaci贸n de Ondas Estacionarias)

Verificaci贸n de la adaptaci贸n de impedancia:

// Medici贸n de potencia de transmisi贸n #include "esp_wifi.h" void medirPotenciaTransmision() { int8_t power; esp_wifi_get_max_tx_power(&power); Serial.printf("Potencia m谩xima de transmisi贸n: %d dBm\n", power); // Medir RSSI int32_t rssi = WiFi.RSSI(); Serial.printf("RSSI: %d dBm\n", rssi); // Calcular distancia aproximada float distancia = pow(10, (27.55 - (20 * log10(2400)) + abs(rssi)) / 20.0); Serial.printf("Distancia aproximada: %.2f metros\n", distancia); }

2.6 Protocolos de Comunicaci贸n

2.6.1 MQTT (Message Queuing Telemetry Transport)

Protocolo de mensajer铆a para IoT:

#include "WiFi.h" #include "PubSubClient.h" const char* mqtt_server = "broker.hivemq.com"; WiFiClient espClient; PubSubClient client(espClient); void setup() { Serial.begin(115200); WiFi.begin("SSID", "password"); while (WiFi.status() != WL_CONNECTED) { delay(1000); } client.setServer(mqtt_server, 1883); client.setCallback(callback); } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Mensaje recibido ["); Serial.print(topic); Serial.print("]: "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); // Publicar datos client.publish("esp32/temperatura", "25.5"); delay(5000); } void reconnect() { while (!client.connected()) { if (client.connect("ESP32Client")) { client.subscribe("esp32/comandos"); } else { delay(5000); } } }

2.6.2 HTTP y WebSocket

Comunicaci贸n web en tiempo real:

#include "WiFi.h" #include "WebServer.h" #include "WebSocketsServer.h" WebServer server(80); WebSocketsServer webSocket = WebSocketsServer(81); void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { switch(type) { case WStype_DISCONNECTED: Serial.printf("Cliente [%u] desconectado\n", num); break; case WStype_CONNECTED: Serial.printf("Cliente [%u] conectado\n", num); break; case WStype_TEXT: Serial.printf("Recibido: %s\n", payload); webSocket.sendTXT(num, "Echo: " + String((char*)payload)); break; } } void setup() { Serial.begin(115200); WiFi.begin("SSID", "password"); while (WiFi.status() != WL_CONNECTED) { delay(1000); } server.on("/", []() { server.send(200, "text/html", "" "

ESP32 WebSocket

" "" "" ); }); server.begin(); webSocket.begin(); webSocket.onEvent(webSocketEvent); }

Materiales Necesarios

Actividades Te贸ricas

Pr谩cticas de Laboratorio

Pr谩ctica 2.1: Configuraci贸n WiFi B谩sica

Objetivo: Configurar el ESP32 como cliente y servidor WiFi.

Duraci贸n: 3 horas

Entregables: C贸digo fuente, mediciones de RSSI, informe t茅cnico

Pr谩ctica 2.2: Comunicaci贸n Bluetooth

Objetivo: Implementar comunicaci贸n Bluetooth Classic y BLE.

Duraci贸n: 3 horas

Entregables: Aplicaci贸n m贸vil, c贸digo ESP32, an谩lisis de rendimiento

Pr谩ctica 2.3: Sistema LoRa

Objetivo: Configurar comunicaci贸n LoRa entre dos ESP32.

Duraci贸n: 4 horas

Entregables: Sistema emisor-receptor, mediciones de alcance, informe t茅cnico

Pr谩ctica 2.4: Medici贸n de Antenas

Objetivo: Medir y comparar diferentes tipos de antenas.

Duraci贸n: 3 horas

Entregables: Mediciones de ROE, patrones de radiaci贸n, informe comparativo

Pr谩ctica 2.5: Protocolos de Comunicaci贸n

Objetivo: Implementar MQTT, HTTP y WebSocket.

Duraci贸n: 4 horas

Entregables: Servidor MQTT, interfaz web, an谩lisis de rendimiento

Pr谩ctica 2.6: Sistema Integrado

Objetivo: Crear un sistema de comunicaci贸n completo.

Duraci贸n: 3 horas

Entregables: Sistema completo, documentaci贸n, pruebas de funcionamiento

Criterios de Evaluaci贸n

Instrumentos de evaluaci贸n:

Entregables obligatorios:

Recursos Adicionales