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