Temporizador redisparable con Arduino UNO

#1
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.:cry:
 
#2
Delay hay que tirarla al de un pozo y no usarla ni nombrarla nunca mas. Es 99,999999% inútil (por no decir 100%) solo le veo utilidad para retardos de unos pocos muy pocos ms
Usa las interrupciones del timer2 y tendrás libertad de hacer lo que quieras mientras esperas, en lugar de matar el sistema.
http://playground.arduino.cc/Main/MsTimer2
 
#3
Delay hay que tirarla al de un pozo y no usarla ni nombrarla nunca mas. Es 99,999999% inútil (por no decir 100%) solo le veo utilidad para retardos de unos pocos muy pocos ms
Usa las interrupciones del timer2 y tendrás libertad de hacer lo que quieras mientras esperas, en lugar de matar el sistema.
http://playground.arduino.cc/Main/MsTimer2
Aprovechando el tema, tengo una consulta con respecto a esta libreira MsTimer2.
te cuento un poco, yo activo el timer con un boton (inicio), y otro de paro. Pero internamente el arduino lleva su conteo, lo que necesito es que siempre que toque el boton de inicio el conteo este de 0.

Me explico con el codigo:

Código:
#include <MsTimer2.h>
 int r1;
 const char a  = 21;
 const char Sp1  = 22; 

 
void setup() {
  MsTimer2::set(1500,sw);//espera para iniciar
  MsTimer2::start();

  pinMode(Sp1,INPUT);
  pinMode(a,OUTPUT);
}

void sw() 
{
  if(digitalRead(Sp1) == HIGH)
{
  digitalWrite(a,HIGH);
}

else
{
  digitalWrite(a,LOW);  
}

void loop
{
  
}
 
#4
¿Que quieres hacer? No entiendo muy bien tu código.
Así verificas un pulsador cada 1500ms entiendo yo. Pero lo que pase entremedio lo pierdes.
 
#5
¿Que quieres hacer? No entiendo muy bien tu código.
Así verificas un pulsador cada 1500ms entiendo yo. Pero lo que pase entremedio lo pierdes.
Lo que necesito es que cuando pulse un switch sp1 (ON), envie una señal, y se inicie el temporizador , por ejmplo enciende un led luego de esos 1500 ms , cuando lo apague el temporizador se reinicie el tem. Y cuando vuelva pulsar SP1 el temporizador otra vez inicie desde o para esperar los 1500 ms.
 
#10
Precisión, no se como definirla sin emplear la misma palabra...
Tolerancia. Tu dices 1500ms ¿Que error es admisible? ¿1ms?...

La palabra "inmediata" es absurda en un sistema muestreado, como pronto tardaría un ciclo de máquina en responder, si va a 16MHz... 1/16000000 s
En uns istema continuo también es absurda, al menos tardará el tiempo de propagación de la puerta o temporizador, que a "ojos de un humano" es instantáneo, pero no lo es.
 
#11
Precisión, no se como definirla sin emplear la misma palabra...
Tolerancia. Tu dices 1500ms ¿Que error es admisible? ¿1ms?...

La palabra "inmediata" es absurda en un sistema muestreado, como pronto tardaría un ciclo de máquina en responder, si va a 16MHz... 1/16000000 s
En uns istema continuo también es absurda, al menos tardará el tiempo de propagación de la puerta o temporizador, que a "ojos de un humano" es instantáneo, pero no lo es.
Listo una tolerancia de 1ms a 1 segundo no sería problema. Te agradezco la explicación.
Si puedes ayudarme con ese muestreo.
 
#12
De 1ms a 1s son mil veces. A ver si concretas, porque me estoy volviendo loco.



Bueno, te doy una orientación...
Yo pondría la interrupción "automática" con un ciclo del valor de tu precisión. Eso cuando sepas cual es. Cuanto mas "impreciso" menos marea la interrupción.
En la rutina de interrupción decrementas un contador. Si ya es cero no hace nada.
En el bucle principal si el conteo es cero activas el pin (o lo desactivas)
Si el pulsador se acciona, reseteas la cuenta al valor deseado y desactivas el pin (o lo activas)
En el resto del tiempo del bucle principal haces lo que creas conveniente de todo lo demás.

Ojo para trabajar con interrupciones las variables se tienen que declarar como volatile

Para acceder a la cuenta desde distintas rutinas tiene que ser variable global o hacelo por punteros como en C

Esto mismo se puede hacer sin interrupción con los tics del sistema pero ojo que cada cierto tiempo desbordan y hay que tenerlo en cuenta para que no haga un ciclo mal hecho.



Pseudo código con los tics:

Bucle principal{
si se pulsa el botón{ final=tics+1500: enciende}
si tics>final{ apaga}
}
Los tics ya van ellos solos por interrupciones...
Hay que pensar algo para cuando desborde, ahora no estoy muy despierto...
 
Última edición:
#13
De 1ms a 1s son mil veces. A ver si concretas, porque me estoy volviendo loco.



Bueno, te doy una orientación...
Yo pondría la interrupción "automática" con un ciclo del valor de tu precisión. Eso cuando sepas cual es. Cuanto mas "impreciso" menos marea la interrupción.
En la rutina de interrupción decrementas un contador. Si ya es cero no hace nada.
En el bucle principal si el conteo es cero activas el pin (o lo desactivas)
Si el pulsador se acciona, reseteas la cuenta al valor deseado y desactivas el pin (o lo activas)
En el resto del tiempo del bucle principal haces lo que creas conveniente de todo lo demás.

Ojo para trabajar con interrupciones las variables se tienen que declarar como volatile

Para acceder a la cuenta desde distintas rutinas tiene que ser variable global o hacelo por punteros como en C

Esto mismo se puede hacer sin interrupción con los tics del sistema pero ojo que cada cierto tiempo desbordan y hay que tenerlo en cuenta para que no haga un ciclo mal hecho.



Pseudo código con los tics:

Bucle principal{
si se pulsa el botón{ final=tics+1500: enciende}
si tics>final{ apaga}
}
Los tics ya van ellos solos por interrupciones...
Hay que pensar algo para cuando desborde, ahora no estoy muy despierto...
Amigo te soy sincero soy principiante programando arduino, y el pseudocodigo que me muestras no tengo idea como implementarlo. :eek::cry::confused:
 
Arriba