El ESP32 es un microcontrolador altamente versátil que permite realizar conexiones con una variedad de dispositivos, entre ellos pantallas OLED y TFT. En esta sección, exploraremos cómo interfazar una pantalla OLED SSD1306 con el ESP32 utilizando la comunicación I2C, y cómo realizar operaciones gráficas básicas como mostrar texto, cambiar tamaños de fuente, dibujar formas y mostrar imágenes en formato bitmap.
Conexión de la pantalla OLED SSD1306 con ESP32
El SSD1306 es una pantalla OLED de bajo consumo que se puede conectar al ESP32 a través del protocolo I2C. Para ello, se utilizan los pines SCL y SDA del ESP32, que son responsables de la transmisión de datos. Una vez realizadas las conexiones adecuadas, es necesario instalar las bibliotecas Adafruit_GFX y Adafruit_SSD1306 en el entorno de desarrollo Arduino IDE. A continuación, se debe cargar el siguiente código en el ESP32 para que la pantalla comience a mostrar información.
El código que mostramos a continuación realiza varias funciones, entre ellas, mostrar texto, cambiar el tamaño de la fuente, dibujar formas y mostrar imágenes en formato bitmap. El siguiente fragmento de código utiliza la biblioteca Adafruit_SSD1306 para controlar la pantalla OLED de 128x64 píxeles.
Este código demuestra cómo interactuar con la pantalla OLED SSD1306 mediante el microcontrolador ESP32. Cada operación gráfica se realiza limpiando primero la pantalla, luego aplicando la acción gráfica correspondiente, actualizando la pantalla y finalmente introduciendo una pequeña pausa antes de pasar a la siguiente operación.
Conexión de la pantalla TFT ILI9341 con ESP32
La pantalla TFT ILI9341, que emplea el protocolo SPI para la transferencia de datos y una interfaz I2C para la entrada táctil, ofrece una solución eficiente tanto para mostrar gráficos de alta resolución como para permitir la interacción del usuario mediante una pantalla táctil. Para conectar esta pantalla TFT al ESP32, se deben hacer las conexiones correctas utilizando los pines correspondientes del ESP32 y la pantalla. En el siguiente ejemplo, se utiliza la biblioteca Adafruit_ILI9341 y Adafruit_FT6206 para gestionar tanto la visualización de información en pantalla como la entrada táctil.
El siguiente código de ejemplo muestra cómo interactuar con la pantalla TFT utilizando estas bibliotecas.
Este código muestra cómo utilizar una pantalla táctil TFT para mostrar un menú interactivo, cambiando el color de un área específica al tocarla. El proceso se repite continuamente, permitiendo la interacción del usuario con la pantalla.
Conceptos clave para comprender la interacción con pantallas
A lo largo de este capítulo, hemos aprendido a interactuar con dos tipos de pantallas populares: OLED y TFT. Sin embargo, es importante que el lector comprenda no solo cómo realizar las conexiones y cargar el código, sino también algunos aspectos adicionales que son fundamentales para trabajar con pantallas en proyectos con microcontroladores.
Primero, es esencial tener en cuenta que la comunicación mediante I2C y SPI tiene sus ventajas y desventajas. El protocolo I2C es más sencillo y requiere menos pines de conexión, pero puede ser más lento, mientras que SPI ofrece mayor velocidad, pero consume más pines. En proyectos donde se necesite mayor rendimiento gráfico, como en pantallas TFT, SPI es una opción preferida.
Segundo, a la hora de trabajar con pantallas táctiles como la ILI9341, la calibración de la pantalla táctil es un factor crucial para lograr una interacción precisa. La correcta mapeo de las coordenadas táctiles a la resolución de la pantalla garantiza que las acciones del usuario se traduzcan con exactitud en la interfaz gráfica.
Por último, si bien el uso de bibliotecas facilita enormemente la programación y el manejo de pantallas, es importante familiarizarse con la documentación oficial de las bibliotecas que se utilizan para comprender todos los parámetros y métodos disponibles. Esto permitirá a los desarrolladores ajustar las pantallas a sus necesidades específicas de manera más eficiente.
¿Cómo funciona el protocolo Wi-Fi y BLE en ESP32?
El protocolo Wi-Fi Direct, que permite la creación de redes ad-hoc sin la necesidad de un enrutador central, ofrece capacidades excepcionales de comunicación entre dispositivos. En este contexto, el ESP32 puede funcionar como un punto de acceso (Access Point, AP) o como cliente conectado a una red Wi-Fi. Al configurar el ESP32 en modo SoftAP, un dispositivo puede actuar como el propietario de un grupo (Group Owner), estableciendo una red en la que otros dispositivos pueden conectarse directamente. La configuración de la red, incluyendo el nombre de la red (SSID) y la contraseña, se realiza mediante las funciones proporcionadas por la librería WiFi de Arduino.
Al activar el modo SoftAP, el ESP32 establece una dirección IP específica para el punto de acceso, permitiendo a otros dispositivos conectarse con facilidad. La comunicación se maneja a través de un objeto WiFiServer, que escucha conexiones en el puerto 80, el cual se configura para aceptar conexiones de clientes. Estos clientes, al conectar, pueden recibir un mensaje simple desde el punto de acceso, y a su vez, pueden enviar mensajes de respuesta de vuelta.
El ciclo principal del programa (loop) controla el flujo de datos entre el servidor y los clientes. El código verifica continuamente si hay datos disponibles de los clientes utilizando el método client.available(). Cuando se recibe un mensaje, este se imprime en el monitor serial para su visualización. Al finalizar la transmisión de datos o cuando el cliente se desconecta, la conexión se detiene usando client.stop(), garantizando así que el servidor esté listo para nuevas conexiones.
Una vez comprendido cómo funciona el punto de acceso y la comunicación entre el servidor y el cliente, es necesario considerar la implementación en el lado del cliente. En este caso, el segundo ESP32 actúa como un cliente Wi-Fi, buscando conectarse al grupo creado por el primer ESP32. Utilizando el método WiFi.begin(), el cliente se conecta a la red Wi-Fi del grupo propietario y, al lograr la conexión, establece una comunicación con el servidor. Este cliente también es capaz de leer el mensaje recibido y responder al servidor, completando así el ciclo de comunicación.
Es fundamental tener en cuenta que para lograr una comunicación fluida entre los dispositivos, se deben asegurar los detalles de la configuración, como el nombre de la red (SSID) y la contraseña. Además, ambos dispositivos deben estar dentro del alcance de la señal para garantizar una conexión exitosa. Los monitores seriales de ambos dispositivos permiten visualizar el flujo de comunicación, donde se puede observar la conexión al grupo propietario y los mensajes transmitidos entre los dispositivos.
Al abordar la parte de la conectividad, es relevante notar que el ESP32 no solo ofrece una capacidad impresionante de comunicación Wi-Fi, sino que también cuenta con funcionalidades avanzadas en otras áreas, como Bluetooth. El siguiente paso en este recorrido es entender cómo funciona la comunicación mediante Bluetooth de baja energía (BLE), otra característica que hace al ESP32 un dispositivo extremadamente versátil.
El protocolo BLE está diseñado para facilitar la comunicación entre dispositivos de manera eficiente y con bajo consumo de energía. Es ideal para aplicaciones donde la duración de la batería es crucial, como dispositivos de monitoreo de salud, wearables, o automatización del hogar. El protocolo BLE sigue una arquitectura de maestro-esclavo, en la que un dispositivo actúa como maestro, iniciando y controlando la comunicación, y el resto como esclavos. Los dispositivos BLE pueden intercambiar pequeños paquetes de datos en ciclos rápidos de conexión y desconexión, lo que optimiza el uso de la batería.
El ESP32 se distingue por su capacidad de soportar tanto Bluetooth clásico como BLE, lo que le permite interactuar con una amplia gama de dispositivos. En el caso de BLE, el ESP32 puede actuar tanto como dispositivo central como periférico. En el rol de dispositivo central, puede buscar otros dispositivos BLE y conectarse con ellos. Como periférico, puede hacer publicidad de sus servicios y esperar que otros dispositivos se conecten.
El soporte para perfiles genéricos de atributos (GATT) es otra ventaja significativa del ESP32. Este perfil es esencial para la interacción de dispositivos BLE, ya que define cómo se intercambia la información entre ellos. El uso de APIs de alto nivel simplifica el desarrollo de aplicaciones BLE, permitiendo a los desarrolladores centrarse en la lógica de la aplicación sin preocuparse por los detalles complejos del protocolo Bluetooth.
Además de la simplicidad en el desarrollo, la flexibilidad que ofrece el ESP32 al soportar múltiples modos de comunicación lo convierte en una excelente opción para proyectos IoT. El uso combinado de Wi-Fi y BLE abre nuevas posibilidades para diseñar dispositivos que no solo se conectan a redes Wi-Fi tradicionales, sino que también pueden interactuar con otros dispositivos cercanos mediante Bluetooth.
Es crucial que al implementar aplicaciones basadas en Wi-Fi o BLE, los desarrolladores tengan en cuenta las limitaciones de alcance y consumo energético, especialmente en el caso de BLE, que está optimizado para intercambios de datos esporádicos y de bajo consumo. La implementación eficiente de estos protocolos permitirá la creación de dispositivos IoT robustos y de largo alcance, capaces de ofrecer experiencias de usuario innovadoras y sostenibles.
¿Cómo usar el ESP32 como cliente BLE para la interacción con dispositivos y servicios?
En el mundo de la conectividad Bluetooth de baja energía (BLE), el ESP32 se destaca como una herramienta versátil que puede funcionar tanto como servidor como cliente. En este capítulo, abordaremos el uso del ESP32 como cliente BLE, explorando cómo establecer conexiones con servidores BLE y cómo interactuar con sus servicios y características.
Cuando configuramos el ESP32 como cliente BLE, el dispositivo se convierte en un participante activo en el ecosistema BLE. En este caso, el cliente es responsable de iniciar la conexión, recuperar datos y controlar las funcionalidades del servidor BLE al que se conecta. A diferencia de las conexiones tradicionales de Bluetooth, los clientes BLE están diseñados para ser eficientes en términos de consumo energético, lo que los hace ideales en aplicaciones donde la duración de la batería es una prioridad.
La funcionalidad básica de un cliente BLE incluye varios aspectos clave:
-
Descubrimiento de servicios: El cliente BLE comienza por escanear los dispositivos cercanos y descubrir los servicios que estos ofrecen. Cada servicio está relacionado con un conjunto específico de características o capacidades.
-
Interacción con características: Dentro de cada servicio, existen características que contienen datos o puntos de control. Un cliente BLE puede leer, escribir o incluso habilitar notificaciones en estas características para recibir actualizaciones en tiempo real.
-
Intercambio de datos: A través de la conexión establecida con un servidor BLE, el cliente puede intercambiar datos, lo que habilita aplicaciones como la monitorización de salud, el control de dispositivos de automatización del hogar, o la gestión remota de dispositivos IoT.
-
Control remoto: Los clientes BLE también tienen la capacidad de controlar varios aspectos del servidor, como ajustar el brillo de luces inteligentes o modificar la configuración de un dispositivo wearable.
-
Interacción en segundo plano: Aunque el cliente BLE no esté conectado activamente, puede realizar tareas de sincronización periódica de datos o actualizar información en segundo plano, optimizando la eficiencia energética del dispositivo.
El código que se proporciona para demostrar cómo usar el ESP32 como cliente BLE está basado en ejemplos de la biblioteca BLE de Arduino. A continuación, se describen los pasos fundamentales para establecer la conexión y comunicarse con el servidor BLE.
El Código del Cliente BLE
Este código utiliza las librerías de BLE para Arduino, y su propósito es establecer una comunicación con un servidor BLE específico. Comienza definiendo los UUIDs del servicio y la característica con la que el cliente desea interactuar. Luego, mediante una serie de flags y funciones de callback, se maneja la conexión y las acciones del cliente.
El código establece un flujo lógico en el que, primero, el cliente escanea dispositivos BLE cercanos, luego se conecta al servidor BLE deseado, lee las características, y finalmente, realiza operaciones sobre ellas, como escribir nuevos valores.
El Proceso de Conexión y Lectura de Características
Al ejecutar este código en el ESP32, el dispositivo actúa como un cliente BLE que se conecta a un servidor BLE previamente configurado. Durante la conexión, el cliente obtiene acceso a los servicios y características del servidor. Si el servidor tiene habilitada la notificación, el cliente puede recibir datos en tiempo real. En el código, después de establecer una conexión exitosa, se muestra la lectura de la característica definida en el código en el monitor serial.
Este ejemplo ilustra cómo un cliente BLE puede ser utilizado para interactuar con un servidor y leer sus características, pero también podría modificarse para escribir datos en el servidor, permitiendo que el cliente actúe no solo como receptor, sino también como emisor de información.
BLE como Publicidad de Beacon
Una aplicación común del BLE es la publicidad de beacons, que permite a los dispositivos transmitir su presencia y otra información relevante a los dispositivos cercanos. Los beacons BLE envían paquetes de datos pequeños, llamados anuncios, que pueden ser detectados por otros dispositivos BLE. Estos anuncios contienen información como el UUID del beacon, el valor mayor y menor, que permiten una identificación más precisa, y la potencia de la señal recibida (RSSI). Esta capacidad de publicidad es especialmente útil en escenarios como la navegación en interiores, marketing basado en la ubicación y otros servicios contextuales.
Los beacons funcionan de forma eficiente en cuanto a energía, permitiendo que los dispositivos operen durante largos períodos con una sola batería. Pueden usarse en aplicaciones como:
-
Detección de proximidad: Permite que los dispositivos detecten su cercanía a lugares específicos, útil para campañas de marketing personalizadas.
-
Navegación en interiores: Proporcionan información de ubicación dentro de edificios, facilitando la orientación de los usuarios en grandes espacios como centros comerciales, museos, o aeropuertos.
El uso de beacons BLE ha revolucionado la manera en que los dispositivos interactúan con su entorno, convirtiéndolos en herramientas clave para mejorar la experiencia del usuario en diversas aplicaciones.
La utilización de BLE como cliente no solo se limita a la interacción básica con servicios y características. Los dispositivos que operan como clientes BLE pueden tener diversas configuraciones para optimizar la experiencia del usuario. Es importante considerar que, aunque los dispositivos BLE son de bajo consumo, la gestión eficiente de las conexiones y el manejo adecuado de las características del servidor son esenciales para garantizar un rendimiento óptimo, especialmente en aplicaciones móviles o de IoT.
¿Cómo conectar y gestionar sensores en un hogar inteligente utilizando ESP32?
Comenzamos nuestro recorrido analizando el diagrama de conexiones para dar vida a nuestra visión de hogar inteligente. En cada habitación, excepto en la sala de estar, mantenemos una configuración constante de sensores para registrar y monitorear el entorno. Cada habitación cuenta con un sensor DHT para medir la temperatura y la humedad, un módulo LDR para los niveles de luz y un sensor de movimiento para detectar la presencia humana.
Las conexiones para estos sensores son las siguientes y se pueden observar en el diagrama de la figura 8.2:
-
Sensor DHT:
-
VCC: Conectado a una fuente de alimentación de 3.3V o 5V.
-
GND: Conectado a tierra (0V).
-
Datos (D12): Conectado al pin D12 del microcontrolador ESP32.
-
-
Módulo LDR:
-
VCC: Conectado a una fuente de alimentación de 3.3V o 5V.
-
GND: Conectado a tierra (0V).
-
Datos (D13): Conectado al pin D13 del microcontrolador ESP32.
-
-
Sensor de movimiento:
-
VCC: Conectado a una fuente de alimentación de 3.3V o 5V.
-
GND: Conectado a tierra (0V).
-
Datos (D14): Conectado al pin D14 del microcontrolador ESP32.
-
Para la sala de estar, se introduce un componente adicional: el motor servo, que se utiliza para simular un sistema de cerradura de puerta. Este motor se activa cuando recibimos un mensaje MQTT, como se ilustra en la figura 8.3. Las conexiones para este motor son:
-
Motor servo (sala de estar):
-
Datos (D15): Conectado al pin D15 del ESP32.
-
VCC: Conectado a una fuente de alimentación de 3.3V o 5V.
-
GND: Conectado a tierra (0V).
-
Este diagrama de conexiones asegura que cada componente en todas las habitaciones funcione de manera coherente para registrar datos y proporcionar monitoreo en tiempo real, lo que permite una recolección eficiente de datos y control, manteniendo la estabilidad eléctrica y la funcionalidad fácil de usar.
Una vez realizadas las conexiones, podemos escribir el código para leer los datos de los sensores. Para ello, abrimos el IDE de Arduino y subimos el siguiente código al microcontrolador ESP32 para que lea los datos de los sensores DHT22, sensor de movimiento y LDR. El código está disponible en GitHub en: https://github.com/PacktPublishing/Programming-ESP32-with-Arduino-IDE/tree/main/chapter%208/read_sensors.
El código comienza definiendo los pines de los sensores: DHTPIN para el sensor DHT22, LDR para el resistor dependiente de luz, y motionsensor para el sensor de movimiento. La función setupSensors() es la encargada de inicializar los sensores, comenzando por el sensor DHT y obteniendo la información del sensor, así como configurando los pines del LDR y el sensor de movimiento como entradas.
La función readSensors() lee los datos de los sensores, obteniendo la temperatura y humedad del sensor DHT, el estado del sensor de movimiento y el nivel de luz del LDR. Luego, imprime los datos en el Monitor Serial.
En el setup(), la comunicación serial se inicia a una velocidad de baudios de 115200, y se llama a la función setupSensors() para inicializar los sensores. La función loop() lee continuamente los datos de los sensores usando readSensors() y luego agrega un retraso de 1 segundo antes de la siguiente lectura.
Los resultados de esta lectura se muestran en el monitor serial. A continuación, vamos a enviar estos datos a la base de datos InfluxDB. Para ello, debemos configurar una cuenta de InfluxDB Cloud.
InfluxDB es una base de datos de series temporales de alto rendimiento y código abierto, diseñada para almacenar y consultar de manera eficiente los datos con marcas de tiempo. Es especialmente adecuada para aplicaciones que recogen y analizan datos que cambian con el tiempo, como las lecturas de sensores, métricas de aplicaciones y datos de monitoreo de sistemas. Los datos de series temporales son aquellos en los que cada punto de datos está asociado con una marca de tiempo específica.
Por ejemplo, supongamos que tenemos un sensor DHT que mide temperatura y humedad. El sensor realiza lecturas a intervalos regulares y las almacena con marcas de tiempo. Aquí se muestra una representación simplificada de los datos de series temporales de un sensor DHT:
| Timestamp | Temperatura (°C) | Humedad (%) |
|---|---|---|
| 2023-11-01 10:00:00 | 25.2 | 45.3 |
| 2023-11-01 10:05:00 | 25.4 | 45.2 |
| 2023-11-01 10:10:00 | 25.25 | 45.6 |
| 2023-11-01 10:15:00 | 25.3 | 45.2 |
En este ejemplo, el sensor DHT registra mediciones de temperatura y humedad a intervalos de 5 minutos, y cada punto de datos está asociado con una marca de tiempo específica. Este arreglo cronológico de puntos de datos permite analizar cómo cambian la temperatura y la humedad a lo largo del tiempo, lo que lo convierte en un ejemplo clásico de datos de series temporales.
InfluxDB es una base de datos ideal para almacenar y consultar estos datos de manera eficiente. Ahora procederemos a configurar la base de datos InfluxDB Cloud para almacenar estos datos.
Para crear una cuenta en InfluxDB Cloud, primero dirígete a https://www.influxdata.com/products/influxdb-cloud/. Luego, inicia sesión con tu cuenta de Google, Microsoft o correo electrónico. Si es la primera vez que accedes, se te harán algunas preguntas sobre tu rol y organización. Una vez que inicies sesión, accederás al Centro de Recursos.
El siguiente paso es crear un bucket. Un bucket es un concepto fundamental en InfluxDB utilizado para organizar y almacenar datos de series temporales. Los buckets actúan como contenedores de datos y determinan cómo se retiene y consulta la información. Cada bucket tiene una política de retención de datos, que define cuánto tiempo se conserva la información y qué sucede con los datos antiguos cuando llegan nuevos. Esta capacidad de organizar y gestionar los datos facilita su almacenamiento y análisis.
Después de crear el bucket, obtendrás un ID de bucket y un nombre de bucket (en este caso "Home data") que necesitarás para almacenar los datos. Además, necesitarás obtener la URL del clúster y el ID de la organización para realizar el seguimiento de los datos correctamente.
Es importante destacar que la correcta integración y gestión de los sensores y la base de datos es esencial para garantizar un monitoreo eficiente, obtener datos precisos y garantizar el control remoto adecuado en un hogar inteligente. Además, se debe considerar que los sistemas de hogar inteligente no solo deben ser funcionales, sino también seguros. La implementación de protocolos de seguridad, la encriptación de datos y el uso de plataformas de almacenamiento confiables son aspectos cruciales para proteger tanto la privacidad como la integridad de los datos generados por los dispositivos del hogar.
¿Puede la democracia sobrevivir al autoritarismo presidencial y al abandono del trabajador?
¿Cómo afectan los campos magnéticos a los materiales elásticos y su capacidad de adherencia?
¿Qué es la ingeniería de prompts y cómo optimiza la interacción con ChatGPT?
¿Cómo hacer deliciosos bocados saludables con ingredientes naturales?

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский