TODOPIC

Otros Microcontroladores / Dispositivos programables => Arduino => Mensaje iniciado por: NicaUnlock en 17 de Mayo de 2021, 18:51:50

Título: Rango de horario y días RS3231
Publicado por: NicaUnlock en 17 de Mayo de 2021, 18:51:50
Buenas tardes.

Primeramente, les agradezco a todos por su amable colaboración. En el siguiente código lo que quiero es que se ejecute un código "x" de lunes a sábado y de 06:30 - 20:00 horas, lo de los días ya lo tengo resuelto, sin embargo, me está matando el horario de 06:30, si yo tuviera un horario de las 06:00 - 20:00 horas no hay problema, es la bendita media hora que me tiene que no se cómo hacerle, a continuación les remito parte del código:

Código: [Seleccionar]

#include <RTClib.h>
#include <LiquidCrystal.h>
#include <Wire.h>

RTC_DS3231 rtc;                                                               // Crea objeto del tipo RTC_DS3231
const int rs = 4, en = 5, d4 = 6, d5 = 7, d6 = 8, d7 = 9;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup () {
 lcd.clear();                                                                 // Se limpia la pantalla primero
 lcd.begin (16,2);                                                            // Inicializa el LCD, en este caso el LCD1602
 if (! rtc.begin()) {                                                         // Si falla la inicializacion del modulo de reloj
 lcd.setCursor (0,0);                                                         // Posiciona el cursor en la columna 0 fila 0
 lcd.print("Modulo RTC");                                                     // Muestra mensaje de error columna 1
 lcd.setCursor (0,1);                                                         // Posiciona el cursor en la columna 0 fila 1
 lcd.print("No encontrado!");                                                 // Muestra mensje de error columna 2.
 while (1);                                                                   // Bucle infinito que detiene ejecucion del programa
}
//rtc.adjust(DateTime(2021,5,17,14,50,0));                                    // funcion que permite establecer fecha y horario
                                                                              // Esta línea se usa solamente una vez, por esa razón está
}                                                                             // Comentada.(Año, mes, día, hora, minutos, segundos)

void loop () {
 DateTime fecha = rtc.now();                                                  // Funcion que devuelve fecha y horario en formato
                                                                              // DateTime y asigna a variable fecha.
 if ((fecha.dayOfTheWeek() >= 1) && (fecha.dayOfTheWeek() < 7)){              // La venta trabaja de lunes a sábado
  if (((fecha.hour() >= 6) && (fecha.minute() >=30))){                           // Y en horario de las 06:00 - 20:00 horas
   if (((fecha.hour() >= 7) && (fecha.hour() <20))){
               
                             [CODIGO.......]

    }
  }
}

 

A como pueden ver, el código solo funciona en cada hora de las 6 hasta las 20 en minutos despues o iguales a 30, osea que 06:01, 08:15, 15:29 no los muestra.

Muchas gracias!

Título: Re:Rango de horario y días RS3231
Publicado por: elreypic2 en 17 de Mayo de 2021, 22:05:00
Te recomiendo que utilices las alarmas del circuito y que cuando estas se activen, generen una interrupción por el pin INT.
De esa forma puedes hacerlo compeltamente programable en cualquier hora.

elreypic.
Título: Re:Rango de horario y días RS3231
Publicado por: NicaUnlock en 17 de Mayo de 2021, 23:02:32
Me podrías dar un ejemplo por favor.
Título: Re:Rango de horario y días RS3231
Publicado por: humberto 02 en 18 de Mayo de 2021, 09:33:26
Hola. Al desconocer tu nivel educativo voy a ponerte títulos para que te puedas informar (como corresponde) y así resolver tu problema.

Conversión grados, minutos y segundos.
Conversión Hora, minutos y segundos.

Cuando yo necesito realizar una tarea a una Tarea pre determinada con un intervalo establecido “saber cómo hacer las conversiones es fundamental”.
Ante una eventual posibilidad de que en un futuro debas cambiar “el tiempo” para hacer la ejecución de una tarea hace que debas realizar una subrutina de conversión.
Los que pintamos canas aprendimos esto; cuando la crisis del 1999 al 2000 nos puso en jaque nuestros programas asistidos por computadoras. Es de ahí mi “sano consejo”.

Dicho esto. Te digo que tu elemento de base es el milisegundo (en base a las conversiones HHMMSS). Pero tu problema no termina ahí. Recién comienza, porque si se corta la luz se romperá tu ciclo. Por ello deberás tener en cuenta trabajar con EEPROM como apoyo fundamental.

Ahora bien. O me apoyo en un programa Externo (C++, VFP, BASIC, etc.) a través de el Puerto Serial entre el control del rango y Arduino o al Arduino le agrego un Módulo Reloj Ds3231 Alta Precisión Eeprom 24c32 Ard Pic

Ahora si no te interesa nada y solo queres el intervalo. Bueno mi amigo tendrás que hacer una “subrutina” de control a partir del milisegundo. salvo que exista una librería que lo haga por vos (si hay; no la conozco).

Te deseo lo mejor en tu decisión. Un cordial saludo.
Título: Re:Rango de horario y días RS3231
Publicado por: elreypic2 en 18 de Mayo de 2021, 09:46:45
Me podrías dar un ejemplo por favor.

La propia librearía RTClib contiene un ejemplo de alarma con el DS3231. Siempre te recomiendo que veas los datasheet de los componentes y los propios ejemplos de las librerías. Esa es la mejor documentación que tendrás para realizar las tareas necesarias.

saludos,

elreypic.
Título: Re:Rango de horario y días RS3231
Publicado por: Eduardo2 en 18 de Mayo de 2021, 10:10:24
Me podrías dar un ejemplo por favor.

Están en tu PC en  libraries\RTClib\examples\DS3231_alarm


Para lo que querés hacer, lo mejor lejos, es usar justamente la alarma del reloj.
En 2do lugar, hacer una conversión a minutos (1 dia son 1440 min) y comparar salvo que sea domingo.
En 3er lugar y lo peor, parecido a lo que estabas haciendo pero separando entre activo e inactivo.
Algo asi:
Código: [Seleccionar]
void loop () {
bool Encendido=false ;

 DateTime fecha = rtc.now();
 if(!Encendido){
    if((fecha.dayOfTheWeek() < 7) && (fecha.hour() >= 6) && (fecha.minute() >=30) )
        Encendido = true ;
 } else {
    if(fecha.hour() >= 20) Encendido = false ;
    else  Codigo() ;
 }
}
//--------------------------------------------
void Codigo(){
         //[CODIGO.......]
}
//--------------------------------------------