[Solucionado] Preguntas sobre Timers

Hola. El número de Post ya indica que recién me he registrado en la en la web y por tanto soy nuevo.
Al tema. Estoy empezando con Arduino para mezclar programación con la electrónica (el concepto que me falta) y revisando documentación e info sobre los timers en diversas webs y en esta misma (en inglés) Me surgen ciertas dudas:

Esto es lo que entiendo y he usado los tres métodos:

  • Un delay interrumpe TODO
  • La función millis() al guardar el dato en una variable desbordará la memoria tras 50 días.
  • No se puede instanciar un TimerOne.h más de una vez

Si un proyecto, por ejemplo: Luces acuario, o luces invernadero, necesitasen un periodo continuado (más de 50 días) y más de un Timer....

  • ¿Hay forma de tener varios?
  • ¿Mis conceptos a la hora de aplicar la lógica a Arduino es incorrecta y esto se hace de otras formas o con shields de hardware?
  • Hasta ahora he visto TimerOne.h (que funciona bien) y echado un ojo a otro ¿Alguna recomendación en cuanto aotra librería para usar?
  • ¿Estoy entendiendo mal la libería y sí se pueden hacer varios?
  • En esta web informa que con esa librería hay problemas con analogWrite() y hay que usar pwm(). En mi caso para un led RGB funciona sin usar eso ¿Se debe a que los estoy poniendo en las entradas digitales y no en las analógicas?

Pondré mi código para que se entienda mi prueba:

//Ejemplo timer1
//Documentaciones:
//https://www.pjrc.com/teensy/td_libs_TimerOne.html
//https://github.com/PaulStoffregen/TimerOne
#include <TimerOne.h>

byte outPins[]  = {4, 5, 6}; // R B G (orden LED)
boolean led_status = false; // boolean de encendido y apagado

void setup() {
  Serial.begin(9600);
  randomSeed(analogRead(0)); //pin0 desconectado para el seed del rnd
  
  Timer1.initialize(3000000);
  Timer1.attachInterrupt(blinkLed);
  
  //myTimer(3000000,blinkLed); //Prueba de punteros innecesario en este caso.
}

void loop() {
  //AQUÍ NO HAY INTERRUPCIONES DURANTE LOS TIMERS
  Serial.println("No me afecta el timer a diferencia del delay");
}

void blinkLed(){
  for(byte i = 0; i < sizeof(outPins) / sizeof(outPins[0]); i++ ){  //recorremos los pins
    analogWrite( outPins[i], ((led_status) ? 0 : random(0, 255)) ); //Si está encendido, lo apagamos y viceversa (colores aleatorios)
  }
  led_status = !led_status; //Cambiamos el estado
  Timer1.setPeriod((led_status) ? 1000000 : 5000000); //Cambiamos el periodo, 1 seg para con el LED encendido, 5 seg con el LED apagado.
}

/*void myTimer(unsigned long microsec, void (*f)(void) ) { //Probando el uso de punteros en Arduino
  Timer1.initialize(microsec);
  Timer1.attachInterrupt((*f));
}*/

¿Es posible añadir otro timer para otro (o X números) de Led RGB? ¿Para dicho concepto se usa otra forma de hacer las cosas?

No se piden códigos. Sólo consejos o webs de información. C no es problema, uno de tantos lenguajes que conozco, mi problema es unir la lógica al hardware (Recién empiezo así que disculpen las molestias).

Bienvenido al foro Arduinito, da gusto leer una consulta asi de bien planteada y con todo el objetivo explicado.
Normalmente esto no se hace en el primer post y tenemos que ir sacando las cosas con saca corchos (saca bocados o como le digan).

Mucha tela para cortar con tu múltiple pregunta:
Veamos algunas consultas y sus posibles respuestas:

Un delay interrumpe TODO

Correcto.

La función millis() al guardar el dato en una variable desbordará la memoria tras 50 días.

Si, es correcto, pero eso no quita que puedas seguir usando tu código como si eso no pasara. En realidad ha sido debatido ampliamente en el foro y tu puedes seguir haciendo operaciones con millis() olvidándote del desborde que tendras porque no afecta las cuentas. Una variable tomada un momento antes del desborde y su valor luego del mismo dará una respuesta correcta para tu control de tiempos.

No uses TimerOne, busca una librería que use timer1 y que permita instancias.

Si un proyecto, por ejemplo: Luces acuario, o luces invernadero, necesitasen un periodo continuado (más de 50 días) y más de un Timer....
¿Hay forma de tener varios?

Yo usaría millis() ya te he dado las razones.

¿Mis conceptos a la hora de aplicar la lógica a Arduino es incorrecta y esto se hace de otras formas o con shields de hardware?

En este punto creo interpretar que tu asumes que hay Shields que resuelven lo que estas consultando? No. Los shields son hard y hacen lo que Arduino hace o tiene programado.
Somos nosotros los que tenemos las limitaciones (salvo limitaciones propias del Arduino claro). Tal vez esto sea confunso pero lo encuadro en lo que estoy afirmando antes.

Hasta ahora he visto TimerOne.h (que funciona bien) y echado un ojo a otro ¿Alguna recomendación en cuanto aotra librería para usar?
¿Estoy entendiendo mal la libería y sí se pueden hacer varios?

Yo he visto librerías que permiten varios pero ahora no recuerdo. Seguramente cuando la encuentre te la posteo o edito este msg.

Respecto de tu código, la forma de responderte requiere algo de tiempo, observando la librería. Queda pendiente mi respuesta aunque este hilo va a tener muchas respuestas.

Timer1 instanciable enlace

surbyte:
Si, es correcto, pero eso no quita que puedas seguir usando tu código como si eso no pasara. En realidad ha sido debatido ampliamente en el foro y tu puedes seguir haciendo operaciones con millis() olvidándote del desborde que tendras porque no afecta las cuentas. Una variable tomada un momento antes del desborde y su valor luego del mismo dará una respuesta correcta para tu control de tiempos.

No uses TimerOne, busca una librería que use timer1 y que permita instancias.
Yo usaría millis() ya te he dado las razones.

Gracias, más claro agua.

surbyte:
En este punto creo interpretar que tu asumes que hay Shields que resuelven lo que estas consultando? No. Los shields son hard y hacen lo que Arduino hace o tiene programado.

Supuse que no sería posible ya que por mucho shield, la base es Arduino y si no le dices haz X, estás en las mismas, pero como en hardware soy un cero (Van 6 días con Arduino y 5 se los he dedicado a leer) llegué a pensar que lo mismo se me estaba escapando algo. "Nunca dar las cosas por sentadas", pero disculpa si la pregunta no tenía sentido.

surbyte:
Timer1 instanciable enlace

Gracias, nuevamente por la orientación. Me pongo a ello.
Siguiendo la filosofía de conocimiento libre en la programación (similar al concepto open o free de Arduino) espero ser de ayuda más adelante.

Un saludo.

Por si alguien lee el post y usa dicha librería:

surbyte:
Timer1 instanciable enlace

TimedAction tiene mal referenciadas las librerías:

Se soluciona rápido cambiando el #include "WProgram.h" del TimedAction.h pero es que los ejemplos igual da otros errores.

Seguiré buscando. Si alguien conoce alguna librería que permita instanciar varios timers lo agradezco.
A último remedio usaré milis por cada Led y controlaré cada desbordamiento.

Saludos.

Encontrado lo que se buscaba.
Por si a alguien le interesa: RBD_Timer.

documentación y descarga.

Github.

Ejemplo modificado:

// Arduino RBD Timer Library v1.3.0 Example - A three second interval timer that prints to serial.
// https://github.com/alextaujenis/RBD_Timer
// Copyright 2016 Alex Taujenis
// MIT License

#include <RBD_Timer.h> // https://github.com/alextaujenis/RBD_Timer

RBD::Timer timer;
RBD::Timer timer2;

void setup() {
  Serial.begin(9600);
  timer.setTimeout(3000);
  timer.restart();

  timer2.setTimeout(6000);
  timer2.restart();
}

void loop() {
  if(timer.onRestart()) {
    Serial.println("Three seconds passed");
  }
  if(timer2.onRestart()) {
    Serial.println("Six seconds passed");
  }
}

Excelentes librerias