Introducción a la Conectividad Inalámbrica
El ESP32 es un chip microcontrolador revolucionario que integra Wi-Fi y Bluetooth de doble modo en un único dispositivo de bajo costo y bajo consumo energético. Esta combinación única convierte al ESP32 en la solución ideal para aplicaciones de Internet de las Cosas (IoT) y sistemas mecatrónicos modernos.
Impacto en la Mecatrónica Moderna
La mecatrónica integra electrónica, mecánica, control y sistemas de computación. Con la incorporación de conectividad inalámbrica, permite la interconexión y control remoto de dispositivos, transformando sistemas tradicionales en soluciones inteligentes y conectadas.
Módulos de Conectividad Integrados
Wi-Fi 802.11 b/g/n
Conectividad de alta velocidad para aplicaciones IoT
Bluetooth v4.2
Comunicación de corto alcance y bajo consumo
Modos de Operación Wi-Fi
El ESP32 puede funcionar en tres modos diferentes que permiten adaptarse a diversas necesidades de conectividad en sistemas mecatrónicos:
- Se conecta a router existente
- Acceso a internet
- Cliente en red local
- Ideal para IoT cloud
- Crea su propia red
- Otros dispositivos se conectan
- Control directo local
- Configuración inicial
- Ambos modos simultáneos
- Bridge entre redes
- Configuración avanzada
- Máxima flexibilidad
Implementación Práctica: Servidor Web con Bluetooth
A continuación se presenta un ejemplo completo que demuestra el uso simultáneo de Wi-Fi y Bluetooth en un sistema mecatrónico para control remoto:
// Sistema dual Wi-Fi + Bluetooth para control mecatrónico
#include
#include
#include
#include
// Configuración de red Wi-Fi
const char* ssid = "MiRed_Mecantronica";
const char* password = "Password123";
// Objetos de conectividad
WebServer server(80);
BluetoothSerial SerialBT;
// Variables del sistema mecatrónico
struct SensorData {
float temperatura;
float humedad;
int posicion_motor;
bool estado_actuador;
};
SensorData datos_sistema;
unsigned long ultimo_envio = 0;
const int LED_WIFI = 2;
const int LED_BLUETOOTH = 4;
const int MOTOR_PIN = 5;
// Páginas HTML para la interfaz web
String paginaHTML = R"(
Control Mecatrónico ESP32
🔧 Sistema Mecatrónico ESP32
Estado: CONECTADO
📊 Sensores
🌡️ Temperatura: -- °C
💧 Humedad: -- %
⚙️ Posición Motor: --°
🎮 Controles
)";
void setup() {
Serial.begin(115200);
// Configurar pines
pinMode(LED_WIFI, OUTPUT);
pinMode(LED_BLUETOOTH, OUTPUT);
pinMode(MOTOR_PIN, OUTPUT);
// Inicializar datos del sistema
datos_sistema = {25.5, 60.0, 0, false};
Serial.println("\n=== Sistema Mecatrónico ESP32 Iniciando ===");
// Iniciar Wi-Fi
iniciarWiFi();
// Iniciar Bluetooth
iniciarBluetooth();
// Configurar servidor web
configurarServidorWeb();
Serial.println("Sistema listo para operación");
Serial.printf("IP Wi-Fi: http://%s\n", WiFi.localIP().toString().c_str());
Serial.println("Bluetooth: 'ESP32_Mecantronica'");
}
void iniciarWiFi() {
Serial.print("Conectando a Wi-Fi");
WiFi.begin(ssid, password);
int intentos = 0;
while (WiFi.status() != WL_CONNECTED && intentos < 20) {
delay(500);
Serial.print(".");
intentos++;
}
if (WiFi.status() == WL_CONNECTED) {
digitalWrite(LED_WIFI, HIGH);
Serial.println("\nWi-Fi conectado exitosamente!");
Serial.printf("SSID: %s\n", WiFi.SSID().c_str());
Serial.printf("IP: %s\n", WiFi.localIP().toString().c_str());
Serial.printf("RSSI: %d dBm\n", WiFi.RSSI());
} else {
Serial.println("\nError: No se pudo conectar a Wi-Fi");
// Modo AP como fallback
WiFi.softAP("ESP32_Config", "12345678");
Serial.println("Modo AP activado: ESP32_Config");
}
}
void iniciarBluetooth() {
if (!SerialBT.begin("ESP32_Mecantronica")) {
Serial.println("Error al inicializar Bluetooth");
} else {
digitalWrite(LED_BLUETOOTH, HIGH);
Serial.println("Bluetooth iniciado: 'ESP32_Mecantronica'");
}
}
void configurarServidorWeb() {
// Página principal
server.on("/", HTTP_GET, []() {
server.send(200, "text/html", paginaHTML);
});
// API para datos en tiempo real
server.on("/datos", HTTP_GET, []() {
DynamicJsonDocument doc(200);
doc["temperatura"] = datos_sistema.temperatura;
doc["humedad"] = datos_sistema.humedad;
doc["posicion_motor"] = datos_sistema.posicion_motor;
doc["estado_actuador"] = datos_sistema.estado_actuador;
String json;
serializeJson(doc, json);
server.send(200, "application/json", json);
});
// Control de actuador
server.on("/actuador", HTTP_GET, []() {
datos_sistema.estado_actuador = !datos_sistema.estado_actuador;
digitalWrite(MOTOR_PIN, datos_sistema.estado_actuador);
Serial.printf("Actuador: %s\n", datos_sistema.estado_actuador ? "ON" : "OFF");
server.send(200, "text/plain", "OK");
});
// Control de motor
server.on("/motor", HTTP_GET, []() {
if (server.hasArg("pos")) {
int nueva_posicion = server.arg("pos").toInt();
if (nueva_posicion >= 0 && nueva_posicion <= 180) {
datos_sistema.posicion_motor = nueva_posicion;
// Aquí iría el control del servo motor
Serial.printf("Motor movido a: %d°\n", nueva_posicion);
}
}
server.send(200, "text/plain", "OK");
});
server.begin();
Serial.println("Servidor web iniciado en puerto 80");
}
void loop() {
// Procesar solicitudes web
server.handleClient();
// Simular lectura de sensores
actualizarSensores();
// Manejar comunicación Bluetooth
manejarBluetooth();
// Enviar telemetría periódica
if (millis() - ultimo_envio > 5000) {
enviarTelemetria();
ultimo_envio = millis();
}
// Verificar estado de conexiones
verificarConexiones();
delay(100);
}
void actualizarSensores() {
// Simular variaciones realistas en sensores
static unsigned long ultimo_sensor = 0;
if (millis() - ultimo_sensor > 1000) {
datos_sistema.temperatura += random(-10, 11) / 10.0;
datos_sistema.humedad += random(-20, 21) / 10.0;
// Mantener valores en rangos realistas
datos_sistema.temperatura = constrain(datos_sistema.temperatura, 15.0, 35.0);
datos_sistema.humedad = constrain(datos_sistema.humedad, 30.0, 90.0);
ultimo_sensor = millis();
}
}
void manejarBluetooth() {
if (SerialBT.available()) {
String comando = SerialBT.readString();
comando.trim();
if (comando == "STATUS") {
SerialBT.printf("Temp:%.1f,Hum:%.1f,Motor:%d,Act:%d\n",
datos_sistema.temperatura,
datos_sistema.humedad,
datos_sistema.posicion_motor,
datos_sistema.estado_actuador);
}
else if (comando == "ACTUADOR") {
datos_sistema.estado_actuador = !datos_sistema.estado_actuador;
SerialBT.printf("Actuador: %s\n", datos_sistema.estado_actuador ? "ON" : "OFF");
}
else if (comando.startsWith("MOTOR:")) {
int pos = comando.substring(6).toInt();
if (pos >= 0 && pos <= 180) {
datos_sistema.posicion_motor = pos;
SerialBT.printf("Motor: %d°\n", pos);
}
}
}
}
void enviarTelemetria() {
// Log por Serial
Serial.printf("[TELEMETRY] T:%.1f°C H:%.1f%% M:%d° A:%s\n",
datos_sistema.temperatura,
datos_sistema.humedad,
datos_sistema.posicion_motor,
datos_sistema.estado_actuador ? "ON" : "OFF");
// Enviar por Bluetooth si hay dispositivo conectado
if (SerialBT.hasClient()) {
SerialBT.printf("TELEM:%.1f,%.1f,%d,%d\n",
datos_sistema.temperatura,
datos_sistema.humedad,
datos_sistema.posicion_motor,
datos_sistema.estado_actuador);
}
}
void verificarConexiones() {
// LED Wi-Fi
digitalWrite(LED_WIFI, WiFi.status() == WL_CONNECTED);
// LED Bluetooth
digitalWrite(LED_BLUETOOTH, SerialBT.hasClient());
// Reconexión automática Wi-Fi
if (WiFi.status() != WL_CONNECTED) {
static unsigned long ultimo_intento = 0;
if (millis() - ultimo_intento > 30000) { // Cada 30 segundos
Serial.println("Intentando reconexión Wi-Fi...");
WiFi.reconnect();
ultimo_intento = millis();
}
}
}
Ejercicios Prácticos
Objetivo: Configurar el ESP32 como Punto de Acceso (AP) para crear su propia red WiFi.
Materiales:
- ESP32 DevKit
- Smartphone o PC con WiFi
- Arduino IDE
Resultado: Red "ESP32_AP" accesible desde dispositivos móviles
Objetivo: Enviar datos de sensores desde ESP32 a smartphone vía Bluetooth.
Aplicación: Terminal Bluetooth para monitoreo de temperatura y humedad
Conceptos: Bluetooth Serial, emparejamiento, apps móviles
Objetivo: Integrar WiFi y Bluetooth en un sistema mecatrónico completo.
Funcionalidades: Servidor web, control por Bluetooth, telemetría dual
Aplicación: Control remoto de actuadores con interfaz web y móvil
Aplicaciones de Conectividad en Mecatrónica
Conectividad Dual para Sistemas Inteligentes
La combinación de Wi-Fi y Bluetooth en el ESP32 permite crear sistemas mecatrónicos versátiles que pueden adaptarse a diferentes escenarios de conectividad:
Wi-Fi Applications:
- Conectividad a la nube
- Interfaces web avanzadas
- Sincronización remota
- Telemetría de alta velocidad
Bluetooth Applications:
- Control desde smartphones
- Bajo consumo energético
- Configuración local
- Comunicación segura punto a punto