Aprende a implementar comunicación serial bidireccional entre Arduino y una aplicación móvil creada en App Inventor, utilizando Bluetooth y JSON para transmitir información de forma organizada y estructurada. Control de LEDs, lectura de pulsadores y ajuste de brillo mediante PWM.
Características del Proyecto
🎯 Funcionalidades Incluidas
- Control de dos LEDs: Enciende/apaga desde la app del celular
- Lectura de pulsadores: Envía el estado de vuelta a la app
- Control de brillo: Ajusta intensidad mediante slider (PWM)
- Comunicación JSON: Formato estructurado y organizado
- Bidireccional: Arduino envía y recibe datos simultáneamente
Materiales Necesarios
Componentes Requeridos
- Arduino UNO (o compatible)
- Módulo Bluetooth: HC-05 o HC-06
- 2 LEDs con resistencias (220Ω)
- 2 Pulsadores con resistencias pull-up (10kΩ o internas)
Diagrama de conexiones
Librerías Utilizadas
SoftwareSerial.h
Permite crear un puerto serial adicional en pines digitales específicos (pines 10 y 11 en este proyecto) para comunicarse con el módulo Bluetooth sin interferir con la comunicación USB del Arduino.
#include <SoftwareSerial.h> #define rxPin 10 #define txPin 11 SoftwareSerial mySerial(rxPin, txPin);
ArduinoJson.h
Facilita la conversión de cadenas en formato JSON a variables de Arduino y viceversa. Simplifica la manipulación de datos estructurados.
#include <ArduinoJson.h> JsonDocument doc; deserializeJson(doc, str); serializeJson(doc, mySerial);
Estructura del JSON
Formato de Comunicación
📱 De la app a Arduino:
{"Switch1":true,"Switch2":false,"slider1":128}
🔙 De Arduino a la app:
{"Switch1":"true","Switch2":"false"}
Descripción de campos:
- Switch1, Switch2: Estados booleanos de los LEDs (true/false)
- slider1: Valor PWM del brillo (0-255)
Flujo de Comunicación
Proceso Bidireccional
- De App a Arduino: La app envía un JSON con el estado de los switches (on/off) y el valor del slider (0-255)
- Arduino Procesa: Recibe los datos, descodifica el JSON y controla los LEDs
- Pulsador Presionado: Cuando un usuario presiona un pulsador físico, Arduino lo detecta
- De Arduino a App: Arduino responde enviando un JSON con los estados actualizados
- App Actualiza: La app recibe el JSON y actualiza su interfaz gráfica
Explicación del Código
Control de LEDs y Pulsadores
🔌 Configuración de Pines
int leds[2] = { 13, 3 }; // Pines de LEDs int ledControlBrillo = 6; // Pin PWM para brillo int pulsadores[2] = { 2, 4 }; // Pines de pulsadores
Notas importantes:
- Los pines con ~ (3, 5, 6, 9, 10, 11) en Arduino UNO soportan PWM
- Los pulsadores usan INPUT_PULLUP para simplificar el circuito
- Cada LED necesita una resistencia protectora de 220Ω
Control de LEDs mediante digitalWrite()
Los LEDs se controlan basándose en el array dato[] que contiene los valores booleanos recibidos de la app:
for (int i = 0; i < numeroDeDatos; i++) { digitalWrite(leds[i], dato[i]); }
Control de Brillo con PWM (analogWrite)
El brillo se controla utilizando analogWrite() con el valor recibido del slider (0-255):
analogWrite(ledControlBrillo, valorSlider);
Lectura de Pulsadores con Antirrebote
Se implementa un sistema de antirrebote por software para evitar lecturas falsas:
if (estadoPulsador[i] != estadoPrevio[i] && estadoPulsador[i] == HIGH) { dato[i] = !dato[i]; // Toggle delay(10); // Pausa } estadoPrevio[i] = estadoPulsador[i];
Código Completo
#include <ArduinoJson.h> #include <SoftwareSerial.h> #define rxPin 10#define txPin 11SoftwareSerial mySerial(rxPin, txPin);int leds[2] = { 13, 3 };int ledControlBrillo = 6;int pulsadores[2] = { 2, 4 };String str = "";const int numeroDeDatos = 2;int dato[numeroDeDatos];int valorSlider = 0;bool estadoPrevio[2] = { 0, 0 };void setup() {mySerial.begin(9600);Serial.begin(9600);for (int i = 0; i < numeroDeDatos; i++) {pinMode(leds[i], OUTPUT);digitalWrite(leds[i], LOW);pinMode(pulsadores[i], INPUT_PULLUP);}pinMode(ledControlBrillo, OUTPUT);}void loop() {JsonDocument doc;if (mySerial.available() > 0) {str = mySerial.readStringUntil('}');str.concat("}");Serial.println(str);DeserializationError error = deserializeJson(doc, str);if (error) {Serial.print(F("deserializeJson() failed: "));Serial.println(error.f_str());return;}dato[0] = doc["Switch1"].as<boolean>();dato[1] = doc["Switch2"].as<boolean>();valorSlider = doc["slider1"].as<int>();}bool estadoPulsador[2] = { 0, 0 };for (int i = 0; i < numeroDeDatos; i++) {estadoPulsador[i] = digitalRead(pulsadores[i]);if (estadoPulsador[i] != estadoPrevio[i] && estadoPulsador[i] == HIGH) {dato[i] = !dato[i];doc["Switch1"] = dato[0] ? "true" : "false";doc["Switch2"] = dato[1] ? "true" : "false";serializeJson(doc, mySerial);}delay(10);estadoPrevio[i] = estadoPulsador[i];digitalWrite(leds[i], dato[i]);}analogWrite(ledControlBrillo, valorSlider);}
Repositorio GitHub
📦 Código Disponible
Accede al repositorio completo con el código fuente documentado:
Esquema de Conexión
| Componente | Pin Arduino | Función |
|---|---|---|
| HC-05 RX | Pin 10 (RX) | Recepción Bluetooth |
| HC-05 TX | Pin 11 (TX) | Transmisión Bluetooth |
| LED 1 | Pin 13 | Control digital |
| LED 2 | Pin 3 | Control digital |
| LED Brillo | Pin 6 (PWM) | Control de brillo |
| Pulsador 1 | Pin 2 | Entrada digital |
| Pulsador 2 | Pin 4 | Entrada digital |
✅ Ventajas de esta Implementación
La comunicación JSON proporciona una estructura clara y fácil de expandir. Puedes agregar más sensores, actuadores o datos simplemente añadiendo nuevas propiedades al JSON. La comunicación bidireccional permite que Arduino iniciatice cambios (como presionar pulsadores) que se reflejen inmediatamente en la app del celular.

Publicar un comentario
¡Hola! Nos alegra mucho que hayas llegado hasta aquí y que estés leyendo este artículo en Edeptec.
Este formulario es un espacio abierto para ti: puedes dejar un comentario con tus dudas, sugerencias, experiencias o simplemente tu opinión sobre el tema tratado.
» ¿Te resultó útil la información?
» ¿Tienes alguna experiencia personal que quieras compartir?
» ¿Se te ocurre algún tema que te gustaría ver en próximos artículos?
Recuerda que este espacio es para aprender y compartir, por eso te animamos a participar de manera respetuosa y constructiva. Tus comentarios pueden ayudar a otros lectores que están en el mismo camino, ya sea en electrónica, programación, deportes o tecnología.
¡Gracias por ser parte de esta comunidad de aprendizaje! Tu participación es lo que hace crecer este proyecto.