programacion de timer sin delay

hola, recien estoy empezando a programar en arduino. Lo que quiero hacer es un pov (persistion of vision), por lo tanto necesitaria aprender a programar los timers sin que sea la funcion delay, ya que tengo entendido que al utilizar esa funcion, no se pueden hacer cosas simultaneamente. Muchas gracias

Saludos
En los ejemplos que trae el IDE de arduino hay uno que se llama blinking without delay, donde te da un ejemplo del uso de millis(), que es lo que necesitas.

max_saeta: Saludos En los ejemplos que trae el IDE de arduino hay uno que se llama blinking without delay, donde te da un ejemplo del uso de millis(), que es lo que necesitas.

me comentaron sobre la funcion millis() y el ejemplo que viene en arduino. La verdad que no lo entendi, me lo podrias explicar. Muchas gracias

unsigned long Timer; // Variable para temporizador const unsigned long Tiempo = 10000; // Tiempo para timer (10 segundo)

void setup() { Timer = 0; }

void loop() { if ( condicion para arrancar temporizdor) { Timer=millis() + Tiempo; }

if (Timer > 0 && millis() > Timer ) // Ha transcurrido el tiempo programado? { Timer=0; // codigo a ejecutar al finalizar el tiempo } }

Algo asi?

Saludos
Lo primero es declarar una variable tal como
Unsigned long tiempo;
Luego en un punto del código cuando necesites comenzar el conteo lo igualas a millis()
tiempo= millis();

A partir de allí evaluas si el tiempo recurrido es mayor al deseado
If (millis()-tiempo >= 1000) {ejecuta codigo}

En este ejemplo el tiempo es fijo 1000 pero lo puedes comparar a una variable
int espera = 15000; para esperar 15 segundos
If(millis()-tiempo>=espera){ejecuta codigo}

Es facil ya que no tienes que configurar ningun timer ni prescaler

Algunas cositas, para que tomes en cuenta cuando trabajes con millis,

1 - Tenes micros() que sirve para microSegundos 2 - millis() es un UNSIGNED LONG y si lo comparas tenes que comparar con otra variable de igual tipo. 3 - millis() tiene un límite de algo de 40 días y despues hace un overbuffer y vuelve a 0. Para que lo tomes en cuenta 4 - millis() lleva el conteo del tiempo que el arduino (programa) lleva corriendo. Toma en cuenta que no se puede resetear.

5 - por ahi te conviene crear una clase o una función para manejar distintos relojes. Solo una sugerencia, la ventaja de esto es que podes crear una lista de timers y ir chequeandolos dentro del loop() uno por uno y cada uno ejecuta alguna acción (supongo esto es lo que estas intentando hacer).

Esas son las cosas mas importantes que por ahí no estan en el ejemplo de manera tan explicita. Si me equivoco en algo, disculpen y corrijanme, ya que yo tampoco llevo mas de un mes programando en Arduino.

Muchas gracias, despues me voy a poner a programarlo. Lo que pasaes que estaba acostumbrado a programar los micros en C (usaba el keil), y nunca habia usado un arduino.

algo asi?

http://www.instructables.com/id/persistence-of-vision-display-POV/?lang=es

http://www.instructables.com/id/Arduino-Persistence-of-Vision-Display/?lang=es

http://www.mecs-press.org/ijisa/ijisa-v6-n1/IJISA-V6-N1-11.pdf

y hay muchos mas.

Saludos

Me puede echar alguien una mano....

Estoy intentando realizar un programa utilizando un sensor PIR para que cuando detecta una presencia encienda un led utilizando la funccion millis();, pero necesito que el el led se encienda y se apague progresivo. Una vez encendido el Led aunqhe detecta presencia que pueda poner yo el timpo cuando se puede apagar el led. El led esta conectado en la salida PWM.

Gracias

Hola flavio, claro que te podemos ayudar.

Primero definamos bien el problema;

Tenemos un sensor PIR… que nos va a devolver On.
Una vez que sea On… encender un led… mantenerlo encendido durante un tiempo determinado
es correcto?

Para que requieres el PWM? quieres que se haga un fade al apagarlo? que vaya decreciendo lentamente?

Hola AlexLPD.

Exactamente, una vez que el sensor PIR a detectado va delvover On, mantener el LED encendido un tiempo determinado. Cuando el PIR a detectado devuelve 0 (LOW)

Quiero hacerlo con PWM para que el LED se encienda y apaga lentamente,

He echo un programa con la funccion for(); y delay();.

Quiero hacerlo con la fuccion millis(); , para que el miccrocontroler no se pare.

la funccion millis();, no la controlo muy bien..

Flavio lee las normas del foro, en especial punto 7 como insertar códigos usando TAGs.

Hola flavio... Si, mas o menos es así... por favor usa los tags, para insertar el codigo.

Vamos a ver... Primero que nada... todas tus variables que tengan que ver con el tiempo tienen que ser Unsigned Long

Asi queda;

unsigned long tiempo1      =0;
unsigned long                  =1000;
unsigned long                  =1000;
unsigned long fadeDelay    =100; // este es el "espacio entre escalones" del PWM del fade. 
unsigned long TimmerFade          = 0;    //esta vaiable "anota el tiempo" para usarlo en el fade
byte brillo = 0;                                    //variable para manejar el brillo. 

const byte led1=3; //estos son pines asi que es mejor declararlos asi que como int 
const byte pir1=31;

boolean estado1=false;
boolean estado2=false;

void setup() {
  Serial.begin(9600);
  tiempo1 = millis(); //Aqui... anotamos el tiempo solo para compararlo despues.

void loop(){

//------comienza el pseudocodigo... 

If( PIR == ON) // Si el sensor se ha encendido...
{

If(millis()- timmerFade > fadeDelay) // Si ha pasado mas tiempo que el delay del fade hacer: 
   {
    
    brillo+10; 
    analogWrite(led, brillo); 
    TimmerFade = millis();
   }

}

}

Bueno es un pequeño escalon, es pseucodigo y debes adaptarlo a tus necesidade, ahora bien... no usaremos el for... por que "bloquea" el programa... si entendí bien necesitas usar un soft-delay por que vas a leer o hacer algo mas.

El codigo de arriba lo hace... primero se pregunta; el tiempo actual es mayor que delay del fade? la primera vez si lo es... por que el tiempo se anoto en el setup... en seguida incrementa la variable brillo en 10 (eso lo puedes modificar a tu gusto)... y lo escribe en el pin analogico, finalmente "escribe la hora" asi que el codigo sigue corriendo y digamos que han pasado 50Ms, al hacer la comparación no es mayor que el tiempo del fade... por lo que no "hara nada"... pero quizas en dos o tres vueltas hayan transcurrido digamos 102Ms... que si es mayor que tiempo de fade... por lo que volvera a incrementar el brillo.

Ahora bien... Tu reto es implementarlo debidamente y encontrar la manera de "poner una guarda" para que solo brille hasta 255... una vez que el sensor este encendido... y hasta 0 cuando este apagado... de otra manera la variable hara algo así; 253, 254, 255, 0 , 1, 2 (recuerda que byte solo almacena valores hasta 255 y sin negativos).

Puedes basarte en el ejemplo y regresar con un codigo mas terminado.

Cualquier duda. Estamos para ayudarte en lo posible.

-Alex.

Saludos

Por este post y por otros iguales aqui esta Funcion Millis()

Muchas gracias Alex

La proxima usare los tags

No hace falta una próxima, retrocede y edita tus intervenciones anteriores.

Hola alguien me podria dar una mano con este problema?
Tengo que hacer un simluacion de un semaforo para no videntes, que cuando se pulse un boton se cuenten 10 segundos y se ponga el seamforo en rojo sin importar en que luz este y despues seguir con el ciclo del semaforo normalmente.
Hasta donde se no se puede usar un delay ya que congela el procesador de Arduino y no puede atender interrupciones, he tratado de usar la funcion millis() pero nada me ha dado resultado
PD: dejo adjunto el programa
Gracias

simple.ino (733 Bytes)

Una vez mas se cumple: Recién llegado al foro que no lee las Normas y postea un tema viejo ** **29-03-2015, 14:23:39 a pesar de la advertencia que desde mas de 120 dias no tiene movimiento y en este caso 1 año. Te invito formalmente a : 1. Lee las Normas del foro. 2. Crea un nuevo hilo porque este será cerrado. Si quieres cita este hilo para usarlo de referencia. 3. Códigos que no superen 9000 caracteres (te enteras si es el caso porque no te deja postearlo) deben mostrarse usando tags, no como has hecho con un adjunto. Lo mismo con imágenes y enlaces. Lee otras consultas del foro y verás como debe ser y verse. Hilo cerrado!