▷ Comunicación Serial Bidireccional con Arduino y Bluetooth usando JSON

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.

Comunicación bidireccional Bluetooth Arduino App Inventor

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

  1. 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)
  2. Arduino Procesa: Recibe los datos, descodifica el JSON y controla los LEDs
  3. Pulsador Presionado: Cuando un usuario presiona un pulsador físico, Arduino lo detecta
  4. De Arduino a App: Arduino responde enviando un JSON con los estados actualizados
  5. 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 11

SoftwareSerial 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.

💡 Mejoras Futuras: Considera agregar más sensores (temperatura, humedad, distancia), implementar historial de datos, crear gráficos en tiempo real, o agregar comandos complejos usando JSON más estructurado. La arquitectura permite escalabilidad sin cambios fundamentales.

0/Deja un comentario/Comentarios

¡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.