El trabajo tiene como herramientas un ESP32 S3, una placa protoboard, unos cables para conectar la placa con el ESP, leds de diferentes colores, un cable USB para conectar el ESP con el ordenador, un móvil para hacer la conexión Bluetooth. Comenzamos haciendo un blinking, para ello cogimos el ESP y lo conectamos al ordenador con el objetivo de que prenda un led como nosotros queramos, en ahí vimos un problema, que resolvimos, el problema era que al ser un ESP necesitaba unos drivers especiales para que el sistema operativo del ordenador detectase la placa, ya que es una placa china. Pero como nosotros ya trabajamos con un ESP8266, pues no se nos hizo muy complicado, puesto que teníamos instalados ya los drivers previamente. Después buscamos el código para hacer el blinking y el montaje en la placa con el ESP. Una vez que ha funcionado, modificamos el código y el montaje para que pueda funcionar como un semáforo, utilizando leds rojo, amarillo y verde. Una vez acabado esto, intentamos conectar el ESP mediante bluetooth a un móvil.
Primero utilizamos un código simple y aparentemente conseguimos conectar el ESP al móvil mediante Bluetooth, pero nos topamos con un error muy común que nos decia que la conexión era fallida.
Después nos recomendaste la aplicación y método RainMaker. Vimos que para poder conectar el código con la aplicación, teníamos que hacer un código aparte para generar un código QR que nos permitiera sincronizar la aplicación con la placa. Desgraciadamente, el código requería más memoria de la que podía proporcionar el ESP32 S3, por lo que el Serial Monitor no podía reproducir el QR.
Afortunadamente, encontré una página web que explicaba como poder conectar el ESP al móvil correctamente.
.
Incluimos las librerías que nos permitirán conectarnos con el ESP. Específicamente estas, están pensadas para dispositivos Bluetooth de baja energía.
Aquí definimos un par de identificadores universales para la conexión bluetooth y la entrada donde estará conectado el led.
La línea BLECharacteristic *pCharacteristic; declara un puntero a un objeto de la clase BLECharacteristic. Un puntero es una variable que almacena la dirección de memoria de otro objeto en lugar de almacenar el valor real del objeto.
En este caso, se declara un puntero pCharacteristic que apunta a un objeto de la clase BLECharacteristic. En este caso, el puntero se utiliza para interactuar con la característica BLE.
La siguiente línea, bool ledState = false; , declara una variable booleana llamada ledState e inicializa su valor en false. Esta variable se utiliza para mantener el estado actual del LED.
Empezamos con el setup que, como ya sabemos, es la parte que se iniciara una única vez al principio del código. Y como avance, abarcará las características del servidor. En primera línea establecemos la velocidad de transmisión de los datos, en este caso, 115200 bits por segundo. Los Serial.pirntln nos servirán para ver información en Serial Monitor, esto lo hacemos para ver que todo esté correcto.
La primera línea, simplemente le ponemos un nombre al ESP, esto con el fin de poder identificarlo más fácilmente.
En la segunda línea creamos el servidor y hacemos que *pService apunte al objeto que acabamos de crear.
La tercera línea de código crea un servicio BLE dentro del servidor BLE y asigna un puntero a ese servicio a la variable pService, lo que te permite interactuar con el servicio BLE recién creado.
En la última lí, se utiliza la función createCharacteristic() del objeto del servicio BLE pService para crear una nueva característica BLE. El resultado de esta función es un puntero al objeto de la característica BLE recién creada.
Esta característica se identifica con el identificador universal que hemos definido anteriormente. Además, se configuran las propiedades de la característica utilizando BLECharacteristic::PROPERTY_READ y BLECharacteristic::PROPERTY_WRITE. Esto nos permite que la característica se puede leer y escribir desde un dispositivo a distancia.
La primera línea es una característica que permite al dispositivo a distancia leer esta y que reciba el texto proporcionado, en este caso “Hello World says El Mesias”.
La segunda línea inicia el servicio pService.
Estas líneas básicamente sirven para que los dispositivos remotos puedan detectar o leer al ESP, esto también es más conocido como publicidad. También incluye la respuesta de escaneo, qué simple y resumidamente hablando proporciona más información sobre el proceso de publicidad y se ejecuta después de esta.
Por último contiene algunas líneas que facilitan la conexión con dispositivos IOS y cuando se ejecuta todo esto correctamente se muestra en el Serial Monitor un mensaje que nos dice que la característica se ha definido y que podemos leerlo en nuestro teléfono.
Esta parte que es el setup simplemente nos sirve para que nuestro ESP32 S3 se conecte con un dispositivo móvil mediante Bluetooth. Ahora veremos la parte del loop que abarcara la parte del loop y en este el cómo se va a encender y apagar el LED.
Abrimos el loop y esta primera línea lee el valor de la característica BLE.
Este bloque de código es bastante sencillo de entender, básicamente dice que si el valor enviado es estrictamente “on”, el led se encenderá y si el valor es estrictamente “off”, el led se apagará. Por último, incluimos un pequeño delay para distinguir las iteraciones en el bucle.
La clase MyCallbacks es una clase derivada de BLECharacteristicCallbacks que nos permite controlar eventos y devoluciones de llamadas relacionados con las caracterisiticas BLE.
MyCallbacks anula la función onWrite() de BLECharacteristicCallbacks. Esta función se ejecutará cuando se realice una escritura en la característica BLE asociada.
Dentro de la función onWrite(), se recupera el valor escrito en la característica BLE mediante pCharacteristic->getValue(). El valor se almacena en una variable std::string llamada value. Esto permite acceder al valor que se ha enviado desde un dispositivo remoto y realizar acciones basadas en ese valor, como controlar un LED o realizar otras operaciones.
El código acaba con este fragmento que ya he mencionado y explicado anteriormente.
Hemos tenido algunos problemas de montaje, nada interesante ni muy importante, ya que era algo que a los minutos solucionábamos.
Al principio del proyecto, en nuestro primer intento para conectar el ESP al móvil y como ya he mencionado en la introducción, aparentemente el ESP aparecía en el móvil, pero no se conectaba correctamente. Fuimos cambiando de métodos hasta encontrar el ya explicado anteriormente.
Intentamos conectar el ESP al móvil mediante la aplicación RainMaker, pero desgraciadamente tuvimos problemas de memoria en el proceso, cosa que nos imposibilitaba el poder conectar el ESP al móvil mediante RainMaker.
Hemos aprendido más sobre las placas ESP y sus funciones, entre otras cosas.