Tengo un código que hace lo necesario, con 2 sensores pir y un Arduino nano, quiero que al detectar movimiento un sensor comience la secuencia de encender 10 leds cada 2 segundos y al llegar al final de la tira comience a apagar los leds de 10 en 10 cada 2 segundos, si detecta el segundo sensor haga la misma secuencia pero inversa.
Esto lo hace pero hay dos problemas, si a emp`ezado una secuencia aunque detecte el segundo sensor no comienza si secuencia hasta el final de la secuencia que había comenzado, solo necesito si alguien puede decirme cómo hago para que al detectar movimiento haga la secuencia pero sin mirar si la otra secuencia a iniciado o no.
El código es:
.
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define NUM_LEDS 100
#define PIR_PIN_1 2 // Primer sensor de movimiento
#define PIR_PIN_2 3 // Segundo sensor de movimiento
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
int pirState_1 = LOW;
int pirState_2 = LOW;
int val_1 = 0;
int val_2 = 0;
void setup() {
strip.begin();
strip.show();
pinMode(PIR_PIN_1, INPUT);
pinMode(PIR_PIN_2, INPUT);
}
void loop() {
val_1 = digitalRead(PIR_PIN_1);
val_2 = digitalRead(PIR_PIN_2);
// Control del primer sensor de movimiento
if (val_1 == HIGH) {
if (pirState_1 == LOW) {
encenderLeds();
pirState_1 = HIGH;
pirState_2 = LOW;
}
} else {
if (pirState_1 == HIGH) {
apagarLeds();
pirState_1 = LOW;
}
}
// Control del segundo sensor de movimiento (inverso)
if (val_2 == HIGH) {
if (pirState_2 == LOW) {
encenderLedsInverso();
pirState_2 = HIGH;
pirState_1 = LOW;
}
} else {
if (pirState_2 == HIGH) {
apagarLedsInverso();
pirState_2 = LOW;
}
}
}
void encenderLeds() {
for (int i = 0; i < NUM_LEDS; i += 10) {
for (int j = i; j < i + 10; j++) {
strip.setPixelColor(j, strip.Color(127, 127, 127)); // Establecer el color blanco con media intensidad
}
strip.show();
delay(2000);
}
}
void apagarLeds() {
for (int i = 0; i < NUM_LEDS; i += 10) {
for (int j = i; j < i + 10; j++) {
strip.setPixelColor(j, strip.Color(0, 0, 0));
}
strip.show();
delay(2000);
}
}
void encenderLedsInverso() {
for (int i = NUM_LEDS - 1; i >= 0; i -= 10) {
for (int j = i; j > i - 10; j--) {
strip.setPixelColor(j, strip.Color(127, 127, 127)); // Establecer el color blanco con media intensidad
}
strip.show();
delay(2000);
}
}
void apagarLedsInverso() {
for (int i = NUM_LEDS - 1; i >= 0; i -= 10) {
for (int j = i; j > i - 10; j--) {
strip.setPixelColor(j, strip.Color(0, 0, 0));
}
strip.show();
delay(2000);
}
}
Por favor edita tu post presenta el código según se explica en Normas del Foro en Español, punto 7.
Antes de volver a copiarlo, usa la opción Autoformato del menú Herramientas de la IDE para facilitarnos la lectura del código.
Tenés que cambiar de táctica, no puedes anidar lazos for().
Por ej.
void encenderLeds() {
for (int i = 0; i < NUM_LEDS; i += 10) {
for (int j = i; j < i + 10; j++) {
strip.setPixelColor(j, strip.Color(127, 127, 127)); // Establecer el color blanco con media intensidad
}
strip.show();
delay(2000);
}
}
No se sale de esa función hasta haber manejado los 100 LEDs y, para peor, con un delay total de 20 segundos.
El for() interno no es problema, el asunto es el otro y su delay().