Go Down

Topic: Programar Sensor de movimiento (Read 3860 times) previous topic - next topic

wilbergabriel

May 04, 2017, 04:52 am Last Edit: May 04, 2017, 11:28 pm by surbyte Reason: El código debe verse en el post
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.
Code: [Select]
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);
 }

}

surbyte

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

Code: [Select]
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.


Code: [Select]
#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);
}
}

Go Up