Controlar la intensidad de un LED desde bletooth.

Hola comunidad! Este es mi primer post… y la verdad no se si estoy subiendo el port correctamente…

Tengo un problema y es que quiero controlar la intensidad de un led desde bluetooth con la aplicacion que he hecho en app inventor2.

Aplicacion que lleva la forma de conectarse a un bluetooth y un slider para controlar la intensidad del led.

Se que hay que poner el led conectado a gnd y la otra pata a una salida digital que soporte PWM.

Este problema lo llevo teniendo varios dias y soy un novato, he estado buscando informacion y ningun tutorial me ha servido si que he conseguido varios avances, como que se quede encendida la luz despues de cargar el codigo y otra cosa que me pasaba es que al mover el slider el HC-05 se me desconectaba y la aplicacion de app inventor crasheaba.

Despues

Os dejo aqui el codigo y la aplicacion .aia para que la veais y me decis el que …

-Aplicación.aia

-Codigo:

int led_1 = 5;  //Pin PWM donde va conectado el LED

//Variables de control y/o lectura
char valor;
String estado;

void setup() {

  pinMode(led_1, OUTPUT);
  Serial.begin(9600);
}

void loop() {

  delay(30); 
  while (Serial.available())
  {
    char c = Serial.read();   //Lee el dato entrante y lo almacena en una variable tipo char
    estado += c;     //Crea una cadena tipo String con los datos entrates
  }
  if (estado.length() > 0)  //Se verifica que la cadena tipo String tenga un largo mayor a cero
  {
    analogWrite(led_1, estado.toInt());  //Manda al LED el dato en forma de entero (int)
    estado = "";      //Limpia la variable para poder leer posteriormente nuevos datos
  }
}

Se me ha olvidado colocar el circuito… aqui teneis el link.

CIRCUITO

circuito.PNG

Moderador: Las imágenes deben verse, de este modo resulta mas fácil recibir ayuda.

  1. No hagas consultas de software en una sección que es para proyectos!! Que tiene de proyecto tu consulta? Nada, para eso tenemos secciones. Si hubieras leido detenidamente las normas, hubieras entendido este reclamo que te hago. Tu hilo será movido a Software.

  2. No escribas con mayúsculas. Edita todo lo que has escrito con mayúsculas.

Perdon por las moletias

Eso lo puedes probar simplemente usando el monitor Serie sin usar el BT.

Envia números enteros y verifica que funciona repito sin usar nada en 0,1 como tienes.

La otra solución que te sugiero es que uses SoftwareSerial de este modo y puedas monitorear que esta pasando porque ahora no puedes al conectar el BT a los pines RX y TX

Prueba esto a ver, y lee los datos en el Monitor Serie.
Cambia las conexiones a 4 = TX y 3 = RX

SoftwareSerial myBT(3,4);  // 3 RX 4 TX

int led_1 = 5;  //Pin PWM donde va conectado el LED

//Variables de control y/o lectura
char valor;
String estado;

void setup() {

  pinMode(led_1, OUTPUT);
  Serial.begin(9600);
  myBT.begin(9600);
}

void loop() {

  delay(30); 
  while (myBT.available())   {
    char c = myBT.read();   //Lee el dato entrante y lo almacena en una variable tipo char
    estado += c;     //Crea una cadena tipo String con los datos entrates
  }
  if (estado.length() > 0) { //Se verifica que la cadena tipo String tenga un largo mayor a cero
      Serial.print("estado:");
      int dato = estado.toInt();
      Serial.print(dato);
      analogWrite(led_1, dato);  //Manda al LED el dato en forma de entero (int)
      estado = "";      //Limpia la variable para poder leer posteriormente nuevos datos
  }
}

No hay que poner la libreria de SoftwareSerial.h para hacer puertos de comunicación?

SERMUS23:
No hay que poner la libreria de SoftwareSerial.h para hacer puertos de comunicación?

Solo si pondras el Bluetooth en otros pines que no sea 0 y 1, que es lo recomendable si quieres usar el monitor serie para hacer debug (depuracion de codigo).

A lo que se refiere Surbyte es que el Bluetooth funciona igual que el monitor serie y para probar tu codigo no necesitas el Bluetooth, es decir hacer el trabajo por partes. Primero solo con monitor serie pruebas el codigo.

Ahora vamos al código tienes un pequeño error y es que el while() es demasiado rápido para el Serial.read(), por lo que ni bien lee, borra el buffer y concatena la variable c, el buffer no esta listo se termina el while() y solo capturas un digito. Hay que ponerle un pequeño delay() en medio.

const byte led_1 = 5;  //Ojo en mejor poner const byte que int
//char valor;               //Lo quitas es inutil
String estado;

void setup() {
   Serial.begin(9600);
   pinMode(led_1, OUTPUT);
}

void loop() {
  //delay(30);            //Lo quitas es inutil
  while (Serial.available()){
      char c = Serial.read();
      estado += c;
      delay(10);        //Importante darle tiempo al buffer
   }
   if (estado.length()){    //No es necesario comparar >0
      int valor = estado.toInt();
      if (valor > 255){
         valor = 255;   //Si metes mas de 255 ponle el maximo
      }
      analogWrite(led_1, valor);
      Serial.println(valor);   //Ayuda a entender que capturo
      estado = "";          
   }
}

Luego que entiendas este código recién pones la libreria y activas el bluetooth.