Comunicación Bluetooth demora un poco

Buenas tardes

Tengo una consulta ya que soy algo nuevo el lo del bluethoot, realizo un programa donde controlo 4 leds, dos con alto y bajo y los otros dos usando dímero, pero tarda 1 o 2 segundos en responder, pero si hago los programas separados responde de inmediato, y como puedo lograr que cuando envie el valor del bluethoot solo tome el primero, porque si presiono mas veces, imprime la palabra dos o 3 veces y ya no lo toma.

Saludos y pasen un excelente dia…

#include <SoftwareSerial.h>

//Comunicacion entre adrduino y la computadora

//Crear un objeto
SoftwareSerial miBT(10, 11);

String DATO;
String BRILLO;
long x;
long y;
String S;
int LEDA = 2;
int LEDA2 = 4;
int LEDB = 6;
int LEDB2 = 5;
 
void setup() {

 Serial.begin(9600);
 
 miBT.begin(115200);
 pinMode(LEDA, OUTPUT);
 pinMode(LEDA2, OUTPUT);
 pinMode(LEDB, OUTPUT);
 pinMode(LEDB2, OUTPUT);
}

void loop() 
{
 while (miBT.available()>0) //Devuelve datos cuando es verdadero
 {
   delay(5);
 S = miBT.readString();
 DATO = S;

 x = DATO.toInt();
 y = DATO.toInt();

 while (DATO == "On1")
 {digitalWrite(LEDA, !digitalRead(LEDA));return;}
 
 while (DATO == "On2")
 {digitalWrite(LEDA2, !digitalRead(LEDA2));return;}
 
 while ((DATO <= "1800") && (DATO >= "1000"))
 {analogWrite(LEDB, map(x, 1000, 1800, 0 ,255));return;}
 
 while ((DATO <= "2800") && (DATO >= "2000"))
 {  analogWrite(LEDB2, map(y, 2000, 2800, 0 ,255));return;}

//  miBT.flush(); // Vaciar el búfer para evitar cadenas de texto fragmentadas

 Serial.println(DATO);
 delay(5);
 }
}

Led Dimmer.txt (1.11 KB)

Moderador
Por favor para la próxima postea tu código usando etiquetas de código.

Lee las Normas del foro

Prueba de este modo
Olvida varias cosas.

  1. while es una función que repite lo que tiene dentro hasta tanto se da una condición para salir.
  2. Para colmo cada nueva consulta vuelves a usar While de modo repetitivo seguidos de la nueva sensación que ultimamente encuentro en los programas que se llama return? No se que función cumple.
  3. En los momentos en que esperas accionar analogWrite() usas el mismo dato en forma string como si fuera una condición del tipo entero lo que esta mal. Por eso es que reemplazo cada una por x e y, datos que en su momento conviertes a enteros pero luego no los usas.
  4. Finalmente si esperas que algo sea menor que tal cosa y mayor que otra el operador a usar es & y no &&.
    La razón es que & es AND para operaciones del tipo byte y && es AND para operaciones de tipo bit.

Código corregido que espero pruebes ya que no he verificado es este

void loop() {

	if (miBT.available() >0) { //Devuelve datos cuando es verdadero
		delay(5);
		S = miBT.readString();
		DATO = S;

		x = DATO.toInt();
		y = DATO.toInt();

		if (DATO == "On1") {
			digitalWrite(LEDA, !digitalRead(LEDA));
		}
		if (DATO == "On2") {
			digitalWrite(LEDA2, !digitalRead(LEDA2));
		}

		if (x <= 1800 & x >= 1000) {
			analogWrite(LEDB, map(x, 1000, 1800, 0 ,255));
		}

		if (y <= 2800 & y >= 2000) {  
			analogWrite(LEDB2, map(y, 2000, 2800, 0 ,255));
		}

	//  miBT.flush(); // Vaciar el búfer para evitar cadenas de texto fragmentadas

		Serial.println(DATO);
		delay(5);
	}
}