Estimados, luego de haber conectado el reloj al arduino uno, y haberlo probado con las funciones básicas me surge la necesidad de ejecutar un evento todos los días.
He visto varios ejemplos usando timeAlarms, pero me parece que no sería necesario tanto, la pregunta es como puedo quedar esperando en el loop a que pasen 24 horas y ejecutar nuevamente??, pero sin interferir en el proceso que ya hoy está definido en el arduino.
Desde ya muchas gracias,
Saludos
Juan
O sea que quieres hacer algo similar a TimeAlarms sin usar lo que ya esta hecho?
Eso se llama reinventar la rueda.
Claro que puedes, fija tu hora, minuto y haz las comparaciones correspondientes para que tu evento se cumpla en ese momento ya verás que haces con los segundos o bueno, he ahi parte de las decisiones a tomar.
Me olvidaba que algunas buenas librerias de RTC tienen también la posibilidad de usar las alarmas disponibles en el RTC.
Solo debes buscar esto, RTC Alarm
Hay ejemplos en google.
Estimado, para no inventar la rueda, voy por el camino de la alarma y para esto tengo el siguiente código:
#include <Time.h>
#include <TimeLib.h>
#include <TimeAlarms.h>
// Librería para la comunicación I2C y la RTClib
#include <Wire.h>
#include "RTClib.h"
// Declaramos un RTC DS3231
RTC_DS3231 rtc;
int hora;
int minuto;
void setup () {
Serial.begin(9600);
delay(3000);
// Comprobamos si tenemos el RTC conectado
if (! rtc.begin()) {
Serial.println("No hay un módulo RTC");
while (1);
}
//Alarm.alarmRepeat(0,0,0, Mensaje); // 8:30am every day
// Ponemos en hora, solo la primera vez, luego comentar y volver a cargar.
// Ponemos en hora con los valores de la fecha y la hora en que el sketch ha sido compilado.
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
void loop () {
DateTime now = rtc.now();
Serial.print(now.day());
delay(3000);
//seteo valor de la alarma
//recibo mensaje y seteo alarma
Alarm.alarmRepeat(hora,minuto,0, Mensaje); // 8:30am every day
}
void Mensaje() {
Serial.println("ejecuto algo");
}
La pregunta es como hago para des habilitar la alarma???? en determinado momento????
gracias
Hola... yo tengo entendido que los Alarm.alarmRepeat sólo pueden ir en el Setup y no en el Loop... aunque no estoy del todo seguro.
Respondo.
ALarm.Repeat pueden ir donde quieras pero no tiene mucho sentido que en cada loop lo vuelvas a accionar.
Si tuvieras un menu que ajustara una alarma, pues podrías configurarla en el loop tmbien.
Pero requiere de procedimientos auxiliares. como primero dar de baja el objeto usando el ID correspondiente a esa Alarma. No es dificl pero tampoco fácil.
Respeto a las Librerías RTC
Te dije que había librerias RTC que tienen soporte de alarma, aca va una pero esperaba que lo buscaras por tu cuenta
El ejemplo muy simple
#include <RTCZero.h>
/* Create an rtc object */
RTCZero rtc;
/* Change these values to set the current initial time */
const byte seconds = 0;
const byte minutes = 0;
const byte hours = 16;
/* Change these values to set the current initial date */
const byte day = 25;
const byte month = 9;
const byte year = 15;
void setup()
{
Serial.begin(9600);
rtc.begin(); // initialize RTC 24H format
rtc.setTime(hours, minutes, seconds);
rtc.setDate(day, month, year);
rtc.setAlarmTime(16, 0, 10);
rtc.enableAlarm(rtc.MATCH_HHMMSS);
rtc.attachInterrupt(alarmMatch);
}
void loop()
{
}
void alarmMatch()
{
Serial.println("Alarm Match!");
}
Otro ejemplo
Example: Alarm.ino
Estimado voy por el lado de timeAlarm,
tengo este código:
#include <Time.h>
#include <TimeLib.h>
#include <TimeAlarms.h>
// Librería para la comunicación I2C y la RTClib
#include <Wire.h>
#include "RTClib.h"
// Declaramos un RTC DS3231
RTC_DS3231 rtc;
int hora;
int minuto;
AlarmID_t alarmaRTC;
int comienza;
void setup () {
Serial.begin(9600);
delay(3000);
// Comprobamos si tenemos el RTC conectado
if (! rtc.begin()) {
Serial.println("No hay un módulo RTC");
while (1);
}
// Ponemos en hora, solo la primera vez, luego comentar y volver a cargar.
// Ponemos en hora con los valores de la fecha y la hora en que el sketch ha sido compilado.
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
void loop () {
DateTime now = rtc.now();
Serial.println("hora actual");
Serial.println(now.hour(), DEC);
Serial.println(now.minute(), DEC);
delay(3000);
//seteo valor de la alarma
if (comienza = 1){
hora= 5;
minuto= 54;
alarmaRTC = Alarm.alarmRepeat(hora,minuto,0, Mensaje); // every day
comienza = 0;
}
}
void Mensaje() {
Serial.println("ejecuto algo");
}
void DeshabilitarAlarma(){
Alarm.disable(alarmaRTC);
Alarm.free(alarmaRTC);
}
La idea es lanzar la alarma solo si la variable comienza es igual a 1, para que no se ejecute siempre para este ejemplo, el tema está en que la alarma nunca se dispara.
Alguna idea??
Gracias
Te puse antes que habilitar o deshabilitar una alarma usando TimeAlarm :
requiere de procedimientos auxiliares. como primero dar de baja el objeto usando el ID correspondiente a esa Alarma. No es dificl pero tampoco fácil.
Tienes que crear y luego eliminar el objeto.
Lo que estas haciendo ahi es creando un objeto alarma que se va a REPETIR, cual es la razón de hacerlo cuando la variable este en 1?
Explica la idea no basado en TimeAlarm.
Qué quieres hacer?
Acabo de releer tu post inicial y no me queda claro aún
Si en el setup estableces una alarma que se repite dia a dia, lo hara de ese modo.
Cada dia a la hora, min, seg dispara un evento. y no interfiere con tu código.
Eso te sirve?
Algo mas, que acabo de ver.. si usas TimeAlarm no puedes usar delay(). Se usa Alarm.delay() que no es lo mismo.
Te comento la idea,
Al momento de recibir un mensaje de texto con una acción a realizar, la misma se debe ejecutar y debe quedar agendada todos los días a la misma hora que recibió la acción, hasta que el sistema reciba nuevamente un mensaje des habilitando la acción.
Y porque no empezaste por ahi?
Bueno, la respuesta esta con TimeAlarms poniendole algo mas de trabajo.
Deshabilitando el ID anterior cada vez que llegue uno nuevo y habilitando el nuevo como lo estas haciendo.
Ten presente que.. TimeAlarms genera un evento. Con ese evento debes lograr tu objetivo sea Alertar, sea accionar algo, etc.
Yo he respondido cosas similares en el foro. Búscalas y te servirán de guía.
ok, pero por alguna razón este código no despliega en el monitor el mensaje que estoy poniendo, este mensaje evolucionará a una función específica.
Que puede ser??
Será que está faltando el Alarm.delay?????? según la documentación esto dispara el chequeo de la alarma no???
Claro, te dije.. no puedes usar delay con TimeAlarm, debes usar Alarm.delay() que provoca que se actualice el funcionamiento de las alarmas.
Estimados, he revisado un monton de ejemplo en internet,
y sigue sin funcionar la alarma, alguna idea??? gracias!!!!!
#include <Time.h>
#include <TimeLib.h>
#include <TimeAlarms.h>
// Librería para la comunicación I2C y la RTClib
#include <Wire.h>
#include "RTClib.h"
// Declaramos un RTC DS3231
RTC_DS1307 rtc;
int hora;
int minuto;
int comienza;
AlarmID_t alarmaRTC;
void setup () {
Serial.begin(9600);
Alarm.delay(3000);
// Comprobamos si tenemos el RTC conectado
if (! rtc.begin()) {
Serial.println("No hay un módulo RTC");
while (1);
}
// Ponemos en hora, solo la primera vez, luego comentar y volver a cargar.
// Ponemos en hora con los valores de la fecha y la hora en que el sketch ha sido compilado.
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
comienza = 1;
}
void loop () {
DateTime now = rtc.now();
Serial.println("hora actual");
Serial.println(now.hour(), DEC);
Serial.println(now.minute(), DEC);
//seteo valor de la alarma
if (comienza == 1) {
Serial.println("creo alarma");
minuto= 3;
hora = 6;
alarmaRTC = Alarm.alarmRepeat(hora,minuto,0, Mensaje);
comienza = 0;
}
Alarm.delay(0);
}
void Mensaje() {
Serial.println("ejecuto algo----------------");
}
void DeshabilitarAlarma(){
Alarm.disable(alarmaRTC);
Alarm.free(alarmaRTC);
}
Alguna idea, todo aporte es bienvenido,
desde ya muchas gracias
saludos
Estimados el problema estaba en que no estaba poniendo la sentencia setTime,
el código quedaría así
#include <Time.h>
#include <TimeLib.h>
#include <TimeAlarms.h>
// Librería para la comunicación I2C y la RTClib
#include <Wire.h>
#include "RTClib.h"
// Declaramos un RTC DS3231
RTC_DS1307 rtc;
int hora;
int minuto;
int comienza;
AlarmID_t alarmaRTC;
void setup () {
Serial.begin(9600);
Alarm.delay(3000);
// Comprobamos si tenemos el RTC conectado
if (! rtc.begin()) {
Serial.println("No hay un módulo RTC");
while (1);
}
// Ponemos en hora, solo la primera vez, luego comentar y volver a cargar.
// Ponemos en hora con los valores de la fecha y la hora en que el sketch ha sido compilado.
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
comienza = 1;
//minuto= 43;
// hora = 5;
alarmaRTC = Alarm.alarmRepeat(hora,minuto,0, Mensaje);
}
void loop () {
DateTime now = rtc.now();
setTime(now.hour(), now.minute(), now.second(), now.month(), now.day(), now.year());
Serial.println("hora actual");
Serial.println(now.hour(), DEC);
Serial.println(now.minute(), DEC);
//seteo valor de la alarma
if (comienza == 1) {
Serial.println("creo alarma");
minuto= 53;
hora = 5;
alarmaRTC = Alarm.alarmRepeat(hora,minuto,0, Mensaje);
comienza = 0;
}
Alarm.delay(1000);
}
void Mensaje() {
Serial.println("ejecuto algo----------------");
}
void DeshabilitarAlarma(){
Alarm.disable(alarmaRTC);
Alarm.free(alarmaRTC);
}
Pero setTime() debe usarse en el setup no en el loop.