Arduino: Cómo repetir una tarea hasta que se reciba nuevos datos por Bluetooth.
Estoy tratando de encender y apagar leds en un bucle cuando recibo datos del BT.
Pero cuando envío “r” a través de BT, la tira de LED se enciende y apaga y lo hace en un bucle, pero cuando envío “b” o “g” o “o”, no cambia ni se apaga, sino que sigue dando vueltas en la primera función.
Necesito una forma de detener el “for int” y cambiar a otra función.
todas las funciones necesitan estar siempre en bucle hasta que las cambie a través de BT.
Espero que lo entiendan.
BT = Bluetooth
“`
include "FastLED.h" // biblioteca FastLED.
// Las definiciones fijas no pueden cambiarse sobre la marcha.
define LED_DT 7 // Pin de datos para conectar a la tira.
define COLOR_ORDER GRB // Es GRB para WS2812 y BGR para APA102.
define LED_TYPE WS2812B // Usando APA102, WS2812, WS2801. No olvide cambiar LEDS.addLeds.
define NUM_LEDS 23 // Número de LED's.
struct CRGB leds[NUM_LEDS]; // Inicializar nuestro array de LED.
int val;
void setup() {
Serial.begin(9600); // Inicializar el puerto serie para la depuración.
delay(1000); // Inicio suave para facilitar el flujo de electrones.
LEDS.addLeds<ledtype, leddt,="" colororder="">(leds, NUMLEDS);
}
void loop () {
if (Serial.available())
{
val = Serial.read();
if (val == 'r') // rojo
{
red();
}
if (val == 'g') // verde
{
green();<br />
}
<pre><code>if (val == 'b') // azul
</code></pre>
{
blue();
}
if (val == 'o') //apagado
{
FastLED.clear ();
}
}
}
void red()
{
<pre><code>fill_solid(leds, NUM_LEDS, CRGB::Red);
FastLED.show(); // pantalla de administración de energía
FastLED.delay(1000);
FastLED.clear ();
FastLED.delay(1000);
</code></pre>
}
void green()
{
for(int i = 0; i < 1000; i++)
{
fillsolid(leds, NUMLEDS, CRGB::Green);
FastLED.show(); // pantalla de administración de energía
FastLED.delay(1000);
FastLED.clear ();
FastLED.delay(1000);
}
}
void blue()
{
for(int i = 0; i < 1000; i++)
{
fillsolid(leds, NUMLEDS, CRGB::Blue);
FastLED.show(); // pantalla de administración de energía
FastLED.delay(1000);
FastLED.clear ();
FastLED.delay(1000);
}
}
“`</ledtype,>
davy.ai
Parece que necesitas agregar una declaración de
break
al buclefor
en cada una de tus funciones. Esto permitirá que se interrumpa el bucle cuando se cumpla la condición y el programa pasará a la siguiente función. Por ejemplo, en la funciónred()
, podrías agregar la siguiente línea:if (val == 'r') {
break;
}
Esto hará que el bucle se interrumpa cuando el valor de
val
sea'r'
, y el programa pasará a la siguiente función. Puedes agregar declaraciones debreak
similares a las otras funciones también.