Estoy configurando un relé activado por PIR (conectado a algunas luces) usando un Arduino Nano.
Tengo el código PIR funcionando (obtenido de un sitio de terceros) pero me gustaría tener la opción de anular la entrada PIR en función de la entrada de un interruptor de botón pulsador. Para agregar aún más complejidad, me gustaría tener un LED encendido para avisarme cuando el PIR se está anulando manualmente (relé siempre encendido).
El botón es un simple botón pulsador.
Por defecto, quiero que la unidad esté en modo PIR. El relé se activa si se detecta movimiento, y luego de X segundos se apaga. Si presiono el botón una vez, se anula manualmente y el relé se enciende (constantemente) y se enciende el LED azul para informarme que la unidad está encendida constantemente. Si se presiona nuevamente el botón, la unidad regresa al modo PIR.
Aquí está el código que tengo hasta ahora, pero el LED y el relé parecen estar constantemente activos. El PIR sigue leyendo (según el monitor de serie).
/*
* PIR sensor tester
*/
int PIR_override = 3; // the number of the switch pin
int overridestatus = 12; // the number of the led pin
int relaypin = 13; // choose the pin for the LED
int inputPin = 2; // choose the input pin (for PIR sensor)
int pirState = LOW; // we start, assuming no motion detected
int val = 0; // variable for reading the pin status
int DELVAR = 3000; // Delay in milliseconds
int override_state = LOW; // the current state of the output pin
// set states for PIR override switch
int state = LOW; // the current state of the output pin
int reading; // the current reading from the input pin
int previous = HIGH; // the previous reading from the input pin
///////////////////////////////////////////////////////
void setup() {
pinMode(relaypin, OUTPUT); // declare LED as output
pinMode(inputPin, INPUT); // declare sensor as input
Serial.begin(9600);
}
void loop()
{
digitalRead(PIR_override); // read input value of PIR override switch
if (val == LOW)
{ // check if the input is LOW
val = digitalRead(inputPin); // read input value
if (val == HIGH)
{ // check if the input is HIGH
digitalWrite(relaypin, HIGH); // turn LED ON
if (pirState == LOW)
{
// we have just turned on
Serial.println("Motion detected!");
// We only want to print on the output change, not state
pirState = HIGH;
delay(DELVAR); // maximum delay is 32776 millisecons,
// delay(DELVAR); // so add multiple delays together to get
// delay(DELVAR); // so add multiple delays together to get
}
}
else
{
digitalWrite(relaypin, LOW); // turn LED OFF
if (pirState == HIGH)
{
// we have just turned of
Serial.println("Motion ended!");
// We only want to print on the output change, not state
pirState = LOW;
}
else
{
digitalWrite(overridestatus, HIGH); // turn override status LED ON
digitalWrite(relaypin, HIGH); // turn relay ON
}
}
}
}
Aquí está el código que tengo hasta ahora, pero el LED y el relé parecen estar constantemente activos. El PIR sigue leyendo (según el monitor de serie).
Es evidente que hay algo mal con mi bucle if-else, pero no estoy del todo seguro de dónde debo empezar a buscar.
También estoy incluyendo una imagen básica del circuito (¡es mi primer Fritz, así que sé amable!) Además, ignora el pin en el tablero de relés. Estoy usando un SRD-05VDC-SL-C pero está en una placa ligeramente diferente con solo 3 pines (IN, VCC, GND).