Temporizador redisparable Arduino UNO (Solucionado)

Hola buenos días gente disculpe que los moleste pero necesito su ayuda ( la gente que mas se adentra en este mundo de la programación).
Estoy realizando un pequeño proyecto el cual consta de la siguiente función:

Un sensor de movimiento le manda un pulso al arduino (VCC), este si lo lee como HIGH, arduino activa su temporizador por 1min y manda una señal a un relay Externo para alimentar una carga.( ejemplo de tiempo creo que sera de 10 mins).
Si el sensor de movimiento vuelve a mandar un pulso dentro del tiempo de 1mins, el arduino tiene que recibirlo y volver a contar el tiempo osea 1min. que se reinicie el tiempo sin que corte la señal que le está mandando al relay.

Tantas veces mande señal el sensor, tantas veces se tiene que reiniciar el temporizador a 0 sin cortar la señal.

Pensé lograrlo con la funcion DELAY ( lo mas basico ) pero al mandarle otra señal dentro del rango del tiempo, no hace nada solo continua contando hasta acabar el tiempo señalado.

Se que no es gran cosa pero ya me bloquie.

Estudiante Ing. Electromecánica
MUCHISIMAS GRACIAS DE ANTEMANO.

Saludos

No tengo arduino para probar por los momentos si funciona pero prueba y comenta:

#define sensor 3
#define salida 2
boolean activado=false;
unsigned long tiempo=0; //Control del tiempo 
unsigned long espera=1000; //Tiempo a esperar o temporizar en milisegundos

void setup(){
 pinMode(sensor,INPUT);
 pinMode(salida,OUTPUT);
 digitalWrite(salida,HIGH); // Logica inversa de usarse la directa cambiar a LOW
 digitalWrite(sensor,HIGH); // Resistencias PullUp internas
}

void loop(){
 if(digitalRead(sensor)==LOW){
   activado = true;
   tiempo= millis();
 } 
 if(activado && (millis()-tiempo) < espera){
   digitalWrite(salida,LOW); // Para lagica inversa
 }else
 {
   activado= false;
 }
  
}

Hola buenas noches, gracias por tu tiempo, te comento, lo probé pero solo se me prende el led (simula la activacion del Relay) osea inicia el programa encediendo el LED le mando pulso del sensor (voltaje ) y no hace nada :frowning: me podrías seguir apoyando por favor, lo puse como directo solo le cambie:

digitalWrite(salida,LOW)

if(digitalRead(sensor)==HIGH){

digitalWrite(salida,HIGH);

empezando a leer el programa a partir de arriba, osea no lo puse como inversa

probé la logica inversa que me mandaste pero aun asi se mantiene encendido. gracias por el apoyo

Hola nuevamente, ya hice que prendiera y apagara, el problema que no tengo control de tiempo, le ponga 1 o le ponga 60000, me dura solo 2 segundos prendido, ya lo probé con otro arduino.

:frowning: la modificacion que hice fue esta.

const int sensor = 3;
const int salida = 2;
boolean activado=false;
unsigned long tiempo = 0; //Control del tiempo 
unsigned long espera = 60000; //Tiempo a esperar o temporizar en milisegundos

void setup(){
 pinMode(sensor, INPUT);
 pinMode(salida, OUTPUT);
 digitalWrite(salida, LOW); // Logica inversa de usarse la directa cambiar a LOW
 digitalWrite(sensor, LOW); // Resistencias PullUp internas

}

void loop(){
 if(digitalRead(sensor) == HIGH){
   activado = true;
   tiempo = millis();
 } 
 if(activado && (millis() - tiempo) < espera){
   digitalWrite(salida, HIGH); // Para lagica inversa
 }else{
 digitalWrite(salida, LOW);
 }
 {
   activado = false;
 }
  
}

Normalmente si funciona, si le mando pulsos dentro del rango del tiempo, me reinicia el temporizador , si a alguien le funciono o sabe por qué no tengo control del tiempo GRACIAS

Lo que veo es que consideraron el tiempo para activar el relé (10min = 60x1000 mseg) pero no el tiempo de redisparo del sensor. y ahi esta el problema

Lo veo y luego adjunto la corección.

const int sensor = 3;
const int salida = 2;
boolean activado = false;
boolean disparar = false;
unsigned int presento1 = 0;
unsigned int presento2 = 0;

unsigned long tiempo = 0; //Control del tiempo
unsigned long espera = 60000; //Tiempo a esperar o temporizar en milisegundos
unsigned long redisparo = 1000;  // durante este tiempo si hay nuevos disparos del PIR reinicio la temporización.

boolean presento = false;

void setup(){
	Serial.begin(19200);
	pinMode(sensor, INPUT);
	pinMode(salida, OUTPUT);
	digitalWrite(salida, LOW); // Logica inversa de usarse la directa cambiar a LOW
	//digitalWrite(sensor, LOW); // Resistencias PullUp internas

}

void loop(){
	
	if (digitalRead(sensor) == HIGH) {
		presento1++;
		if (presento1 == 1) {
			Serial.println("Disparo sensor.");
		}
		activado = true;
		tiempo = millis();
	} else presento1 = 0;	  
	
	
	if (activado) { 
	   	
	   if ((digitalRead(sensor) == HIGH) && ( millis() - tiempo < redisparo)) {
		   tiempo = millis();
		   presento2++;
		   if (presento2 == 1) {
		   	   Serial.print("Hubo redisparo. Tiempo =");
			   Serial.println(tiempo);
		       Serial.print("Faltan =");
		       Serial.println(millis() - tiempo);
		   }
	   } else presento2 = 0;
		   
	   if (millis() - tiempo < espera) {
		   digitalWrite(salida, HIGH); // Para lagica inversa
		   
	   } else {
		   digitalWrite(salida, LOW);
		   activado = false;
	   }
    }
}

funciona corectamente, borrar luego todos los Serial.print son para saber que ocurre.

Hola buenas tardes,

les comento, funcionó a la perfección el programa, les agradezco muchisisisisisisimo por la ayuda brindada de verdad, no saben como me han ayudado.

Les dejo el programa final, lo modifique un poco para que funcionara con 2 sensores, ahora solo tengo que intentar adaptarlo con 4 sensores ( normalmente son 2 sensores por cada cuarto ) y hacer que activen diferentes salidas
GRACIAS INFINITAS!!

const int sensor1 = 3;
const int sensor2 = 5;
const int salida = 2;
boolean activado = false;
boolean disparar = false;
unsigned int presento1 = 0;
unsigned int presento2 = 0;

unsigned long tiempo = 0; //Control del tiempo
unsigned long espera = 10*60000; //Tiempo a esperar o temporizar en milisegundos
unsigned long redisparo = 1000;  // durante este tiempo si hay nuevos disparos del PIR reinicio la temporización.

boolean presento = false;

void setup(){
	Serial.begin(19200);
	pinMode(sensor1, INPUT);
        pinMode(sensor2, INPUT);
	pinMode(salida, OUTPUT);
	digitalWrite(salida, LOW); // Logica inversa de usarse la directa cambiar a LOW

}

void loop(){
	
	if ((digitalRead(sensor1) == HIGH)|| (digitalRead(sensor2) == HIGH)) {
		presento1++;
		if (presento1 == 1) {
			Serial.println("Movimiento.");
		}
		activado = true;
		tiempo = millis();
	} else presento1 = 0;	  
	
	
	if (activado) { 
	   	
	   if (((digitalRead(sensor1) == HIGH) || (digitalRead(sensor2) == HIGH)) && ( millis() - tiempo < redisparo)) {
		   tiempo = millis();
		   presento2++;
		   if (presento2 == 1) {
		   	   Serial.print("Hay movimiento. Tiempo =");
			   Serial.println(tiempo);
		       Serial.print("Faltan =");
		       Serial.println(millis() - tiempo);
		   }
	   } else presento2 = 0;
		   
	   if (millis() - tiempo < espera) {
		   digitalWrite(salida, HIGH); // Para lagica inversa
		   
	   } else {
		   digitalWrite(salida, LOW);
		   activado = false;
	   }
    }
    
}

GRACIAS NUEVAMENTE !

1 Like