# Temporizador redisparable con Arduino UNO



## losc (Nov 11, 2014)

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.


----------



## Scooter (Nov 11, 2014)

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


----------



## Edo0707 (Nov 10, 2015)

Scooter dijo:


> 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:


```
#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
{
  
}
```


----------



## Scooter (Nov 10, 2015)

¿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.


----------



## Edo0707 (Nov 10, 2015)

Scooter dijo:


> ¿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.


----------



## Scooter (Nov 10, 2015)

Vale. ¿Que precisión quieres?


----------



## Edo0707 (Nov 11, 2015)

Scooter dijo:


> Vale. ¿Que precisión quieres?



 cuando el switch este en ON,inicie el temporizador 15 segundos y cuando lo el switch este en off reinicie el temporizador en espera de otro ON de igual manera iniciar otros 15 segundos hasta ser reseteado colocando switch en off.


----------



## Scooter (Nov 11, 2015)

Si pero...¿Que precisión quieres?


----------



## Edo0707 (Nov 11, 2015)

Scooter dijo:


> Si pero...¿Que precisión quieres?



explicame que quieres decir con precision, no entiendo que me quieres decir, diria que la respuesta del temporizador sea inmediata segun el ON/OFF.


----------



## Scooter (Nov 11, 2015)

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.


----------



## Edo0707 (Nov 11, 2015)

Scooter dijo:


> 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.


----------



## Scooter (Nov 11, 2015)

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...


----------



## Edo0707 (Nov 13, 2015)

Scooter dijo:


> De 1ms a 1s son mil veces. A ver si concretas, porque me estoy volviendo loco.
> 
> 
> 
> ...



Amigo te soy sincero soy principiante programando arduino, y el pseudocodigo que me muestras no tengo idea como implementarlo.


----------



## Scooter (Nov 13, 2015)

Pues ánimo. Así aprendes.
Intentalo y vas preguntando.


----------

