Secuencia con2 sensores pir

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.

A ver como trabaja esta versión de tu código.

#include <Adafruit_NeoPixel.h>

#define INTERVALO 2000UL
#define PIN 6
#define NUM_LEDS 16
#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 = false;
int pirState_2 = false;
bool val_1 = 0, val_1Ant = false;
int val_2 = 0, val_2Ant = false;
int enciendoLedsInverso = false;
int enciendoLeds        = false;
int apagoLeds           = false;
int apagoLedsInverso    = false;
unsigned long start ;
void encenderLeds();
void apagarLeds();
void encenderLedsInverso();
void apagarLedsInverso();
int cont2 = false;


void setup() {
  strip.begin();
  strip.show();
  pinMode(PIR_PIN_1, INPUT);
  pinMode(PIR_PIN_2, INPUT);
  Serial.begin(115200);
}

void loop() {
  val_1 = digitalRead(PIR_PIN_1);
  val_2 = digitalRead(PIR_PIN_2);
  
  // Control del primer sensor de movimiento
  if (val_1 && !val_1Ant) {
    pirState_1 = 1-pirState_1;
    Serial.println(pirState_1?"Pir1 ON":"Pir1 OFF");
    if (!pirState_1) {
        Serial.println("Enciendo leds");
        enciendoLeds = true;
    }
    else {
        Serial.println("Apago leds");
        apagoLeds = true;
    }
    start = millis();
  }
  val_1Ant = val_1;

  // Control del segundo sensor de movimiento (inverso)
  if (val_2 && !val_2Ant) {
    pirState_2 = 2-pirState_2;
    Serial.println(pirState_2?"Pir2 ON":"Pir2 OFF");
    if (!pirState_2) {
        Serial.println("Enciendo leds Inverso");
        enciendoLedsInverso = true;
    }
    else {
        Serial.println("Apago leds Inverso");
        apagoLedsInverso = true;
    }
    start = millis();
  }
  val_2Ant = val_2;

  if (enciendoLeds) {
      encenderLeds();
      if (millis() - start > INTERVALO) {
        enciendoLeds = false;
      }
  }

  if (apagoLeds) {
      apagarLeds();
      //Serial.println("Contador: " +String(cont2++));
      //Serial.println(millis() - start);
      if (millis() - start > INTERVALO) {
        apagoLeds = false;
      }
  }

  if (enciendoLedsInverso) {
      encenderLedsInverso();
      if (millis() - start > INTERVALO) {
        enciendoLedsInverso = false;
      }
  }

  if (apagoLedsInverso) {
      apagarLedsInverso();
      if (millis() - start > INTERVALO) {
        apagoLedsInverso = false;
      }
  }
}

void encenderLeds() {
  for (int i = false; 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();
  }
}

void apagarLeds() {
  for (int i = false; i < NUM_LEDS; i += 10) {
    for (int j = i; j < (i + 10); j++) {
      strip.setPixelColor(j, strip.Color(0, 0, 0));
    }
    strip.show();
  }
}

void encenderLedsInverso() {
  
  for (int i = NUM_LEDS - 1; i >= false; 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();
  }
}

void apagarLedsInverso() {

  for (int i = NUM_LEDS - 1; i >= false; i -= 10) {
    for (int j = i; j > (i - 10); j--) {
      strip.setPixelColor(j, strip.Color(0, 0, 0));
    }
    strip.show();
  }
}

Gracias por el código lo pruebo y te comento gracias

No funciona, cuando detecta movimiento enciende 10 leds y cuando vuelve a detectar se apagan, pero gracias por el tiempo invertido

Bueno peléalo, ahi tienes como se usa con millis()

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().

Gracias compañero, los milis aún no los tengo dominados, me lo voy a estudiar un poco, saludos

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.