Aprendiendo a programar radiofrecuencia con Arduino, ESP32...
En mis proyectos de IoT, me han surgido varios escenarios donde la opción de cablear no es viable.
Por ejemplo, mi tío tiene una nave industrial donde la puerta de acceso es la típica puerta motorizada con una puerta de acceso peatonal integrada.
Una imagen vale más que mil palabras 👇
Hace un par de años me pidió una aplicación para abrir y cerrar la puerta con el móvil y además abrirla a distancia, es decir, abrirla sin tener que estar cerca.
Después también me pidió el poder añadir a más usuarios y que él pudiera controlar quién y cuando entra y demás características, para no aburrirte te dejo información de la aplicación 🚀
Bueno, a lo que iba... ahora quería que cuando la puerta se abriera le avisara con una notificación al móvil de que la puerta se había abierto.
Fácil, se le pone un final de carrera de los típicos magnéticos cableados y a correr, pero... ¿cómo lo haces con la puerta peatonal?
Con cable se puede hacer, imposible no es, pero tampoco es fácil.
Tienes que grapar el cable por la puerta, salvar la bisagra que pliega la puerta, después continuar hasta llegar a la bisagra que se une al bastidor y de ahí bajar hasta el motor que es donde está la micro.
Pues con un sensor de puerta que se comunique por rafiofrecuencia lo solucioné rápido, fácil y barato.
Y es eso lo que te quiero contar en este artículo, cómo comunicar remotamente por radiofrecuencia a 433 MHz con tu placa de desarrollo.
Introducción
¿Por qué comunicar por radiofrecuencia?
La comunicación por radiofrecuencia:
- Es segura
- Es barata
- Es universal, es decir, funciona en cualquier país
- Ahorra cable y el taladrar para los soportes de los mismos cables
Posibles casos de uso de la radiofrecuencia
Además del ejemplo que te he puesto de la puerta basculante de la nave industrial, también se me han dado casos de:
- Controlar enchufes a distancia para por ejemplo encender luces, aparatos de aire acondicionado...
- Controlar electroválvulas de riego en macetas que están colgadas y tienen un difícil acceso
Hacer un marcador de pádel para mi club. Uno de los jugadores tiene un mando en su muñequera que se comunica por radiofrecuencia al marcador.
- Te puedes crear una centralita de incendios sin necesidad de cablear los sensores de humo
- Seguro que se te ocurren más aplicaciones
Materiales
Como ya te he dicho, voy a utilizar componentes que se comunican a 433 MHz
En toda comunicación siempre habrá un emisor y un receptor.
Módulo emisor o transmisor
Para escribir este ejemplo me voy a basar en un mando con 4 botones que ya viene liagado a un receptor.
Cada uno de los botones los puedes usar para lo que te parezca, yo voy a hacer un ejemplo en el que cada botón encenderá un led, pero como te imaginas puedes cambiar el encender un led por activar un relé y que ese relé haga algo, o activar un enchufe que se comunica a 433 MHz que son bastante baratos también.
Módulo receptor y decodificador
El receptor con el que te voy a explicar este ejemplo es con el RX480-E.
Este receptor ya decodifica por nosotros la señal del mando y nos la da directamente en entradas para nuestra placa de desarrollo.
Los decodificares universales como este son más versátiles porque te admiten comunicación con más sensores.
Procedimiento
Conexionado
Voy a realizar el ejemplo con una ESP32 de 30 pines.
Configurando el receptor
Una vez que hemos hecho la conexión como se indica en el diagrama del punto anterior, procedemos a alimentar nuestra placa.
El módulo RX480-E tiene tres modos de funcionamiento que podemos consumir:
Configuración de pulso
Para activar este modo pulsa el botón de aprendizaje en el receptor una vez.
Espera 3 segundos.
Pulsa el botón A del control remoto.
Espera 3 segundos.
Listo
Configuración de palanca
Para activar este modo pulsa el botón de aprendizaje en el receptor dos veces.
Espera 3 segundos.
Pulsa el botón A del control remoto.
Espera 3 segundos.
Listo
Configuración de enclavado
Para activar este modo pulsa el botón de aprendizaje en el receptor tres veces.
Espera 3 segundos.
Pulsa el botón A del control remoto.
Espera 3 segundos.
Listo
Para este ejemplo voy a utilizar el modo de pulso, que significa que el led asociado al botón que pulse estará encendido mientras el botón esté encendido.
Aprendiendo qué hace cada pin del receptor
- GND: tierra o polo negativo
- + V: alimentación a DC3.3 ~ 5V
- D0: salida de datos; botón D del mando
- D1: salida de datos; botón C del mando
- D2: salida de datos; botón B del mando
- D3: salida de datos; botón A del mando
- VT: Salida (cuando cualquier pin, D0-D3, emite la señal de activación, VT sale sincrónicamente; VT se utiliza generalmente como indicador de salida).
Programando la placa de desarrollo
Te dejo el código en C++
#define greenLed 23 #define redLed 22 #define blueLed 21 #define yellowLed 19 #define VT 35 #define buttonD 32 #define buttonC 33 #define buttonB 25 #define buttonA 26 void setup() { Serial.begin(115200); while (!Serial) delay(200); pinMode(redLed, OUTPUT); pinMode(blueLed, OUTPUT); pinMode(greenLed, OUTPUT); pinMode(yellowLed, OUTPUT); pinMode(VT, INPUT); pinMode(buttonA, INPUT); pinMode(buttonB, INPUT); pinMode(buttonC, INPUT); pinMode(buttonD, INPUT); Serial.println(" APLICACIÓN INICIADA"); } void loop() { bool vt = digitalRead(VT); if (vt) { bool aButton = digitalRead(buttonA); bool bButton = digitalRead(buttonB); bool cButton = digitalRead(buttonC); bool dButton = digitalRead(buttonD); if (aButton) { digitalWrite(greenLed, 1); Serial.println("BOTÓN A"); } else if (bButton) { digitalWrite(redLed, 1); Serial.println("BOTÓN B"); } else if (cButton) { digitalWrite(blueLed, 1); Serial.println("BOTÓN C"); } else if (dButton) { digitalWrite(yellowLed, 1); Serial.println("BOTÓN D"); } } }
Usando un sensor de puerta
Sensor de puerta mágnético
Asegúrate que el sensor que compres sea de 433 MHz y que utilice el protocolo EV1527.
Receptor 433 MHz universal
Este es el receptor que yo uso.
Conexión
Conectaremos el pin 3.3V en la ESP32 a VCC en su receptor de 433 MHz.
El pin GND al pin GND
El pin RX en el ESP32 al pin DATA en el receptor de 433 MHz
Observa que estoy utilizando un receptor de 433 MHz que funciona a 3,3 V, que es el mismo voltaje al que funciona la ESP32.
Seguimos escribiendo el código que nos muestre las señales de lectura desde el sensor de puerta al monitor serie.
Programando la placa de desarrollo
#include <RMT.h> // Set the RMT channel number #define RMT_CHANNEL 0 void setup() { // Initialize the RMT peripheral RMT.begin(); // Set the input pin pinMode(RMT.rxChannelToInput(RMT_CHANNEL), INPUT); // Set the carrier frequency (38 kHz) RMT.addCarrier(RMT_CHANNEL, 38000); // Set the decoder RMT.setDecoder(RMT_CHANNEL, RMT_MODE_RX, RMT_MEM_64); // Enable the RMT receiver RMT.enableRx(RMT_CHANNEL); } void loop() { // Wait for a signal to be received if (RMT.getRxState(RMT_CHANNEL) == RMT_RX_ACTIVE) { // Get the received signal rmt_item32_t* items = NULL; uint32_t numItems = 0; if (RMT.read(RMT_CHANNEL, &items, &numItems) == ESP_OK) { // Convert the signal to a byte array uint8_t data[numItems / 2]; for (int i = 0; i < numItems / 2; i++) { uint8_t high = items[i * 2].duration1 > items[i * 2].duration0 ? 1 : 0; uint8_t low = items[i * 2 + 1].duration1 > items[i * 2 + 1].duration0 ? 1 : 0; data[i] = (high << 1) | low; } // Print the received data Serial.print("Received data: "); for (int i = 0; i < numItems / 2; i++) { Serial.print(data[i], HEX); Serial.print(" "); } Serial.println(); } // Reset the receiver RMT.rxReset(RMT_CHANNEL); } }
Hasta luego 🖖