Quiero que me ayuden con mi programa, no soy tan bueno en arduino, tengo un sensor de movimiento, el programa funciona bien, solo que quiero que cuando no detecte movimiento el led aun siga encendido por un tiempo determinado.
const int sensor = 7;
const int luz = 8;
int estado;
void setup() {
pinMode(sensor, INPUT);
pinMode(luz, OUTPUT);
digitalWrite(luz, LOW);
}
void loop() {
estado = digitalRead(sensor);
if (estado == HIGH){
digitalWrite(luz, HIGH);
}
else {
digitalWrite(luz, LOW);
}
}
A ver si esto te sirve.
He creado una etiqueta RETARDO que tiene el tiempo que quieres que el led permanezca en ON
Ese tiempo esta dado en seg x 1000 = X milisegundos.
Lo demás queda igual salvo cuando se produce de haber detectado movimiento a que ya no detecta.
En ese momento paso de 1 a 0 o de HIGH a LOW. BUeno ahi inicio una variable llamada start con el valor de millis() + RETARDO.
millis() es un contador de milisegundos que arranca cuando Arduino se energiza.
Imagina que tienes un reloj que arranca cuando se enciende arduino.
Bien... tomas el valor en ese instante. Cuando debería ponerse en low el led.
Entonces se activa una variable que llamé retengoLed.
Esa variable toma el valor de true o HIGH
Cada vez que el código encuentre a retengoLed en HIGH pone el LED en 1
Pero mientras pasa por esta consulta
if (millis() > start)
el contador millis() sigue aumentando y como antes cargue a start con el valor que tenia milis() mas 5 seg ese momento ocurrirá 5 segundos despues.
Cuando eso ocurra, retengoLed pasará a LOW o 0 y el LED se va a apagar.
#define RETARDO 5000 // 5 segundos = 5000 mseg
const byte sensor = 7;
const byte luz = 8;
bool estado, estadoAnt = false;
unsigned long start;
void setup() {
pinMode(sensor, INPUT);
pinMode(luz, OUTPUT);
digitalWrite(luz, LOW);
}
void loop() {
estado = digitalRead(sensor);
if (estado){
digitalWrite(luz, HIGH);
}
if (!estado) {
if (!estado && estadoAnt) { // solo paso una vez por acá. Cuando el PIR pasa de HIGH a LOW
retengoLed = true; // uso estas lineas para inicializar el timer con millis()
start = millis()+ RETARDO;
}
if (retengoLed) {
if (millis()>start) {
retengoLed = false; // se cumplio el tiempo en elque mantengo LED en HIGH
}
}
else
digitalWrite(luz, LOW);
}
}
Hola @rochaco6aaa, el hilo es del 2017 y según las normas del foro debes crear un hilo nuevo para hacer consultas al respecto. Te invito a leer las Normas del foro y hacerlo. Gracias.