Buenas tardes:
Normalmente los tiners se hacen con millis (), alguna idea cómo podría empezar a hacer lo mismo y hacer TOF y TON con ayuda de la librería de RTC?
Gracias.
Buenas tardes:
Normalmente los tiners se hacen con millis (), alguna idea cómo podría empezar a hacer lo mismo y hacer TOF y TON con ayuda de la librería de RTC?
Gracias.
BrewGold:
... hacer TOF y TON ...
Einnnn ...
Timer ON , Timer OFF
#include <RTClib.h>
RTC_DS3231 rtc;
unsigned long inicia=0;
int tiempo =1;
void setup(){
if (! rtc.begin()) {
Serial.println("Modulo RTC3231 no conectado");
while (1);}
}
void loop() {
DateTime now = rtc.now();
if(now.minute()-inicia>=tiempo){
inicia=now.minute();
}
Y porque no usas TimeAlarms? El RTC ajusta el reloj del sistema y TimeAlarms hace el trabajo para el cual fue diseñado.
Mira este hilo en el que estamos debatiendo otros problemas con @jazpiroz
He encontrado algo en la librería RTClib.cpp , no se si es cómo tener tu propio millis?
// RTC_Millis implementation
long RTC_Millis::offset = 0;
void RTC_Millis::adjust(const DateTime& dt) {
offset = dt.unixtime() - millis() / 1000;
}
DateTime RTC_Millis::now() {
return (uint32_t)(offset + millis() / 1000);
}
Por segunda vez te pregunto, viste los ejemplos de TimeAlarms?
Si no los viste para que sigues buscando soluciones si te acabo de dar la mejor solución posible?
Claro que eres libre de hacer yusar la librería que gustes pero TimeAlarms te permite definir alarmas reptidas, alarmas que se ejecutan 1 vez. timers, todo lo que necesites en conformidad con un RTC venga de donde venga la hora sea NTP, sea GPS, sea un RTC como hemos dicho.
Quieres que se dispare todos los dias a las 8:34:25 pues eso ejecuta una rutina y luego accionas otra a las 13:50:00 y acciona otra rutina distinta.
Asi que una inicia por ejemplo un rele y la otra lo apaga.
Quieres que ocurra un dia de la semana, lo mismo.
Creating Alarms
Alarms are used to call a function at a specific time of the day.Alarm.alarmRepeat(hours, minutes, seconds, function);
Create an alarm that will call a function every day at a particular time.Alarm.alarmRepeat(dayofweek, hours, minutes, seconds, function);
Create an alarm that will call a function every week on a specific day at a particular time.
"dayofweek" can be dowSunday, dowMonday, dowTuesday, dowWednesday, dowThursday, dowFriday, or dowSaturday.Alarm.alarmOnce(hours, minutes, seconds, function);
Create an alarm that will call a function tomorrow at a particular time.Alarm.alarmOnce(dayofweek, hours, minutes, seconds, function);
Create an alarm that will call a function once, at specific day and time.
Por eso te sugeri el otro hilo para que vieras ejemplos.
Perdona mi insistencia pero das vuelta sobre el mismo tema y tal vez no terminaste de entender los alcances de esta librería.
No me interesa una alarma, sólo un cronómetro, explico un poco mi proyecto:
Tengo 2 termómetros, uno en la base del calentador y otro en el líquido, el primero es una sonda K y el segundo DS18B20 que me interesa precisión
Un relé para activar una resistencia
Una salida PWM para una bomba de velocidad variable (3 fases 400Hz 24VDC)
Un relé para activar un agitador.
RTC.
Funcionamiento
Escalones de temperatura y control de tiempo una vez alcanzada la consigna ejemplo 45 minutos
Funcionamiento de la bomba temporizado, ejemplo cada 3 minutos
Programar el inicio a una hora dada.
Entre otras funciones
Todo programado desde una App (hc-05) y una pantalla de 20x4 LCD para la visualización del proceso
Disculpa, pero no lo veía con alarmas ya que eran cronómetros, aunque también podría ser sumando la hora actual más la consigna y programar una alarma.
He creado mi propio equivalente a millis en minutos del RTC, veo que salen muchas líneas de código, lo voy a comparar con la primera opción.
¡Alarm.alarmOnce !
Mejorando un poco
Contador de segundos desde setup (0 segundos) con esto ya puedo programar mis timers.
Comentarios?
// Date and time functions using just software, based on millis() & timer
#include <Wire.h> // this #include still required because the RTClib depends on it
#include "RTClib.h"
#if defined(ARDUINO_ARCH_SAMD)
// for Zero, output on USB Serial console, remove line below if using programming port to program the Zero!
#define Serial SerialUSB
#endif
int dia, hora, minuto;
long segundos;
RTC_Millis rtc;
void setup () {
Serial.begin(9600);
DateTime now = rtc.now();
segundos=now.unixtime();
}
void loop () {
DateTime now = rtc.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.println(now.unixtime());
Serial.println();
delay(3000);