En este post les voy a explicar como controlar el brillo de varios leds desde el celular mediante bluetooth, Utilizando los pines PWM de arduino.
MATERIALES:
- 1 Arduino UNO
- 3 resistencias de 220 ohms
- 3 Leds de diferente color
- 1 Modulo bluetooth hc-05
SOFTWARE:
- IDE Arduino
- APP Inventor
DIAGRAMA DE CONEXIONES:
INTERFAZ GRAFICA DE LA APP
La aplicación esta compuesta por tres partes:
1.- Botón de conexión bluetooth celular - modulo HC-05: Presionando este botón se nos abre una lista de los dispositivos vinculados con nuestro celular.
Para conectarnos con el modulo bluetooth Hc-05 desde la aplicación, presionamos el botón Conectar BT.

Nos aparecerá una lista de los dispositivos bluetooth que tenemos vinculados con nuestro celular, seleccionamos el dispositivo. En mi caso estoy utilizando el modulo HC-05.

2.- Sliders con valores de 0 a 255 (valor PWM): Moviendo el slider de un lugar a otro, aumentamos o disminuimos el brillo de los leds. Movemos a la derecha para aumentar y a la izquierda para disminuir
3.- Labels: Indican los valores de los sliders (valor PWM).
EXPLICACION DEL CODIGO DE LA APLICACION.
Conexión Celular - modulo HC-05.
Tenemos dos bloques:
1.- When ListPiker1.BeforePicking:

Al presionar Conectar BT, se nos abrirá una lista de elementos con los nombres y direcciones de todos los dispositivos bluetooth que tenemos vinculados a nuestro celular.
2.- When ListPiker1.AfterPicking:

En esta parte se realiza la conexión del modulo bluetooth con nuestro celular
Sliders
Inicializamos 3 variables y las enceramos. En estas variables vamos a almacenar los valores de los sliders que luego enviaremos mediante bluetooth.
En el siguiente bloque, obtenemos el valor de la posición del slider, lo almacenamos en una variable e imprimimos ese valor en un label. Esto lo hacemos para cada uno de los sliders.
Envío de datos a través de bluetooth
Para realizar el envio de datos mediante bluethooth, agregamos un reloj. Este reloj nos va a servir para enviar los datos cada vez que modifiquemos el valor del slider despues de un tiempo determinado.
Dentro del bloque del codigo del reloj:
Comprobamos si el modulo bluetooth esta conectado con nuestro celular. Si esta conectado, enviamos mediante bluetooth una lista con los valores de los sliders. Caso contrario, des-habilitamos los sliders.
Los valores de los sliders se van a enviar en forma de array de la siguiente manera [valor1, valor2, valor3, ... , valorN].
Como en este proyecto estamos utilizando el monitor serial para poder visualizar los valores que nos llegan, tenemos que añadir otro reloj para que el celular pueda recibir esos datos, caso contrario la aplicación dejara de funcionar. Para ello añadimos el siguiente bloque.

Este bloque de código nos sirve para recibir en nuestra app los datos enviados desde el arduino.
EXPLICACION DEL CODIGO DE ARDUINO
Definimos un array con los pines en donde irán conectados los leds, estos pines tienen que tener PWM caso contrario no podremos variar el brillo de los leds
int leds[3] = {5,6,9};
Creamos una variable tipo string, esta variable va a almacenar en forma de string el valor que nos llega mediante el puerto serial.
String str = "";
Definimos una constante con el valor del sigiente caracter: ' , '. Este caracter nos va a servir después para separar los valores del array que nos llega mediante bluetooth desde el celular.
const char separador = ',';
Definimos una variable y le damos el valor del numero de datos que nos van a llegar mediante el puerto serie, en este caso es 3 porque desde la aplicación enviamos 3 valores de los 3 sliders.
const int numeroDeDatos = 3;
Definimos un array el cual lo utilizaremos para almacenar los datos enviados desde la aplicación a través de bluetooth (previamente separados), también servirá para definir los valores de pwm para los leds
int dato[numeroDeDatos];
En el boid setup, inicializamos el puerto serie y declaramos los pines en donde están conectados los leds como salidas
void setup() { Serial.begin(9600); for (int i = 0; i < 4; i++){ pinMode(leds[i], OUTPUT); } }
En el void setup tenemos lo siguiente:
Cada vez que recibamos datos, los vamos a almacenar dentro de el string previamente declarado: "str", los datos no llegan de la siguiente forma [dato1, dato2, dato3, ... , datoN], para poder utilizar estos valores tenemos que extraer los parámetros separados por comas, para ello primero tenemos que leer el string hasta " ] ". Esto lo hacemos con la siguiente linea de código.
str = Serial.readStringUntil(']');
Haciendo eso, el string nos queda de la siguiente manera:
[123, 23, 200
Para poder utilizar estos datos sin ningún problema el siguiente paso es quitarle el primer elemento: " [ ", esto lo hacemos con la siguiente linea de código.
str.remove(0,1);
Haciendo eso, el string nos queda de la siguiente manera:
123, 23, 200
El siguiente paso es extraer los parámetros del string para poder usarlos por separado, para ello usamos el siguiente código
for (int i = 0; i < numeroDeDatos ; i++) { int index = str.indexOf(separador); dato[i] = str.substring(0, index).toInt(); str = str.substring(index + 1); }
Haciendo eso, tenemos los datos de la siguiente manera:
dato[0] = 123 dato[1] = 23 dato[2] = 200
Por ultimo vamos a asignarle a cada led un valor, esto podemos hacerlo de dos formas una normal y una simplificada.
Normal:
analogWrite(leds[0], dato[0]); analogWrite(leds[1], dato[1]); analogWrite(leds[2], dato[2]);
Simplificada:
for (int i = 0; i < numeroDeDatos; i++) { analogWrite(leds[i], dato[i]);
CODIGO COMPLETO:
int leds[3] = {5, 6, 9}; String str = ""; const char separador = ','; const int numeroDeDatos = 3; int dato[numeroDeDatos]; void setup() { Serial.begin(9600); for (int i = 0; i < 4; i++) { pinMode(leds[i], OUTPUT); } } void loop() { if (Serial.available()) { str = Serial.readStringUntil(']'); str.remove(0, 1); for (int i = 0; i < numeroDeDatos ; i++) { int index = str.indexOf(separador); dato[i] = str.substring(0, index).toInt(); str = str.substring(index + 1); } } for (int i = 0; i < numeroDeDatos; i++) { analogWrite(leds[i], dato[i]); } }
Publicar un comentario