Reloj escolar automatico

Hola a todos. Mi nombre es Luciano. Estuve recorriendo el foro y me resulto muy bueno por lo que decidi registrarme y buscar un poco de ayuda.
Realice un curso hace unos años pero mi conocimiento es medio basico. Paso a contar el problema que tengo.
Arme como proyecto en la escuela donde trabajo un timbre automatico.. en principios funcionaba y cumplia con lo requerido que era marcar los recreos y cambios de horas pero estaba mal desde el codigo ya que los intervalos en los que activaba la campanilla los realizaba con "delay". Comence a investigar para reemplazarlos por funcion millis y en parte lo logre.. pero el timbre solo activa una vez luego de subir el codigo o de reiniciar la placa y al timbre siguiente no activa.
les comparto las lineas del codigo con las cuales activo el timbre.

byte estadoTimbre;
int timbreLargo=8000;
int timbreCorto=4000;
int timbreCorto1=2500;
unsigned long t=0;



//en void loop
 if (now.hour()==7 && now.minute()==00){

           if (Timbre ==0){
              //Activar timbre
              digitalWrite(2,HIGH);
             
            Timbre ==1;
             t=millis();
           } else {
                   if ( millis()-t > 8000 ) 
                   
                   digitalWrite (2,LOW);
                   
                   else{//con esto evitamos que vuelva a sonar en la misma hora el mismo dia
            if (now.hour()==7 && now.minute()==01)
               Timbre==0;
            
             }
             }
         }

//Siguiente timbre

   if (now.hour()==7 && now.minute()==40){

           if (Timbre ==0){
              //Activar timbre
              digitalWrite(2,HIGH);
             
            Timbre ==1;
             t=millis();
           } else {
                   if ( millis()-t > 4000 ) 
                   
                   digitalWrite (2,LOW);
                   
                   else{//con esto evitamos que vuelva a sonar en la misma hora el mismo dia
            if (now.hour()==7 && now.minute()==41)
               Timbre==0;
            
             }
             }
         }

desde ya si pueden ayudar o guiar les agradezco.
si infringi alguna regla del foro les pido disculpas. no encontre donde realizar presentacion.

Saludos Luciano

Si no pones el código completo no te podemos ayudar.

Por favor, antes de copiar el código, usa la opción Autoformato del menú Herramientas de la IDE. Asi nos facilitas la lectura.

este es el codigo completo.
anteriormente tenia colocado un sensor de temp pero luego lo anule.. por ese motivo hay partes comentadas

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

#include <OneWire.h>
//#include <DallasTemperature.h>------------------------------------------------------------------------------------------------

OneWire unWire (13);                //se establece pin 10 como bus oneWire
//DallasTemperature sensor (&oneWire);//se declara variable u objeto para el sensor----------------------------------------------
volatile char* buffn = " ";
byte estadoTimbre;
int timbreLargo = 8000;
int timbreCorto = 4000;
int timbreCorto1 = 2500;
unsigned long t = 0;
char buffer [13];

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

#define NOP __asm__ __volatile__("nop\n\t") //62.5ns en 16MHz

RTC_DS3231 rtc;

char daysOfTheWeek [7][6] = {"Dom", "Lun", "Mar", "Mierc", "Jue", "Vier", "Sab"};
char Timbre = 0;
byte rx = 0, offset = 0;
byte datos[6];


void setup() {

  lcd.begin (16, 2);
  //  sensor.begin();------------------------------------------------------------------------------------------------------
  delay (3000);

  if (!rtc.begin()) {
    Serial.println ("Opssss!!!... no encuentro el RTC!!!");
    while (1);
  }
  pinMode (11, OUTPUT);
  digitalWrite (11, LOW);
  pinMode (2, OUTPUT);
  digitalWrite (2, LOW);
  pinMode (A1, INPUT);
}

void loop() {
  //sensor.requestTemperatures ();---------------------------------------------------------------------------------------------------
  //float temp = sensor.getTempCByIndex (0);
  //dtostrf ( temp,2,1,buffn );
  //sprintf ( buffer, "%s", buffn);

  if (Serial.available()) {
    Timbre = true;
    rx = (uint8_t) Serial.read();
    datos [offset] = rx;
    offset ++;
    if (offset == 6 ) {
      rtc.adjust (DateTime (datos[0] + 2000, datos[1], datos[2], datos[3], datos[4], datos[5]));
      offset = 0;
      Timbre = false;
    }
  }
  DateTime now = rtc.now ();

  if (now.dayOfTheWeek() == 0 || now.dayOfTheWeek() == 6) { //chequea sabado y domingo
    lcd.setCursor (0, 0);
    lcd.clear();
    lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
    lcd.print (" ");
    lcd.print(now.day(), DEC);
    lcd.print('/');
    lcd.print(now.month(), DEC);
    lcd.print('/');
    lcd.print(now.year(), DEC);
    lcd.setCursor(0, 1);
    lcd.print(now.hour(), DEC);
    lcd.print(':');
    lcd.print (now.minute(), DEC);
    lcd.print(':');
    lcd.print(now.second(), DEC);
    Serial.println ("Sabado o domingo");

  } else {//si es dia de semana
    lcd.setCursor (0, 0);
    lcd.clear();
    lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
    lcd.print (" ");
    lcd.print(now.day(), DEC);
    lcd.print('/');
    lcd.print(now.month(), DEC);
    lcd.print('/');
    lcd.print(now.year(), DEC);
    lcd.setCursor(0, 1);
    lcd.print(now.hour(), DEC);
    lcd.print(':');
    lcd.print (now.minute(), DEC);
    lcd.print(':');
    lcd.print(now.second(), DEC);


    //********************************************************************************************************
    if (now.hour() == 7 && now.minute() == 00) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 8000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 7 && now.minute() == 01)
            Timbre == 0;

        }
      }
    }
    //##################################################################################################

    if (now.hour() == 7 && now.minute() == 40) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 4000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 7 && now.minute() == 41)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 8 && now.minute() == 20) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 8000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 8 && now.minute() == 21)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 8 && now.minute() == 30) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 8000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 7 && now.minute() == 31)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 9 && now.minute() == 00) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 2500 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 9 && now.minute() == 01)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 9 && now.minute() == 10) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 4000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 9 && now.minute() == 11)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 9 && now.minute() == 30) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 2500 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 9 && now.minute() == 31)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 9 && now.minute() == 50) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 8000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 9 && now.minute() == 51)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 10 && now.minute() == 00) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 8000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 10 && now.minute() == 01)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 10 && now.minute() == 40) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 4000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 10 && now.minute() == 41)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 11 && now.minute() == 20) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 8000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 11 && now.minute() == 21)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 11 && now.minute() == 30) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);
        t = millis();
        Timbre == 1;

      } else {
        if ( millis() - t > 8000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 11 && now.minute() == 31)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 12 && now.minute() == 10) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 4000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 12 && now.minute() == 11)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 12 && now.minute() == 23) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 4000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 12 && now.minute() == 24)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 12 && now.minute() == 33) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre = 1;
        t = millis();
      } else {
        if ( millis() - t > 8000 ) {

          digitalWrite (2, LOW);
        }
        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 12 && now.minute() == 34)
            Timbre = 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 12 && now.minute() == 36) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre = 1;
        t = millis();
      } else {
        if ( millis() - t > 4000 ) {

          digitalWrite (2, LOW);
        }
        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 13 && now.minute() == 37)
            Timbre = 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 14 && now.minute() == 20) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 8000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 14 && now.minute() == 21)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 14 && now.minute() == 30) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 8000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 14 && now.minute() == 31)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 15 && now.minute() == 10) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 2500 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 15 && now.minute() == 11)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 15 && now.minute() == 40) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 2500 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 15 && now.minute() == 41)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 15 && now.minute() == 50) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 8000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 15 && now.minute() == 51)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 16 && now.minute() == 00) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 8000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 16 && now.minute() == 01)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 16 && now.minute() == 40) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 4000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 16 && now.minute() == 41)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 17 && now.minute() == 20) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 8000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 17 && now.minute() == 21)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 17 && now.minute() == 30) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 8000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 17 && now.minute() == 31)
            Timbre == 0;

        }
      }
    }
    //###################################################################
    if (now.hour() == 18 && now.minute() == 10) {

      if (Timbre == 0) {
        //Activar timbre
        digitalWrite(2, HIGH);

        Timbre == 1;
        t = millis();
      } else {
        if ( millis() - t > 8000 )

          digitalWrite (2, LOW);

        else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia
          if (now.hour() == 18 && now.minute() == 11)
            Timbre == 0;

        }
      }
    }
    //###################################################################


  }
  lcd.setCursor (9, 1);
  lcd.print ("ETT N 4");
  //lcd.setCursor (11,1);----------------------------------------------------------------------------------------------------------
  // lcd.print (buffer);
  // lcd.println ("");
  delay(1000);

}

A primera vista, olvidaste iniciar el puerto Serial

En la secuencia de apagado del timbre, comparas el tiempo transcurrido

if ( millis() - t > 8000 ) 
  digitalWrite (2, LOW);

y sino

else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia 
  if (now.hour() == 7 && now.minute() == 01) 
     Timbre = 0;
  }
}

Pero si millis() - t > 8000 no se cumple es porque es menor o igual y no puede ser nunca menor porque millis() se incrementa continuamente.
O sea, cuando sea menor todavía no pasó 1 minuto, y cuando apagas el timbre ya nunca puede ser menor. ¿Me explico?

En lugar de ver si ya pasó el tiempo para apagar la alarma y luego si pasó un minuto para resetear Timbre haz al revés.
Fíjate si pasó el minuto y sino verifica si hay que apagar el timbre.

Se me está complicando copiar el código desde el móvil por eso no lo modifico para que lo veas pero creo que se entiende lo que hay que modificar.

Agrego: También podrías agregar los segundos a la comparación de la hora y prescindir de controlar si ya pasó 1 minuto para resetear Timbre y lo haces directamente al apagar el timbre.

if (now.hour() == 7 && now.minute() == 00 && now.seconds <= 1) {

Pongo <= 1 para dejar 1 segundo de tolerancia.

ERROR!

Timbre == 0;
Timbre == 1;

Debe ser

Timbre = 0;
Timbre = 1;

"==" es una operación lógica de igualdad
"=" es asignación

Está bien aplicado en los if() pero mal en las asignaciones.

Sin desmerecer tu código hice uno alternativo por si te sirve

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

//#include <OneWire.h>
//#include <DallasTemperature.h>------------------------------------------------------------------------------------------------

//OneWire unWire (13);                //se establece pin 10 como bus oneWire
//DallasTemperature sensor (&oneWire);//se declara variable u objeto para el sensor----------------------------------------------
//volatile char* buffn = " ";
//byte estadoTimbre;
const int timbreLargo = 8000;
const int timbreCorto = 4000;
const int timbreCorto1 = 2500;
unsigned long t = 0;
//char buffer [13];

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

#define NOP __asm__ __volatile__("nop\n\t") //62.5ns en 16MHz

RTC_DS3231 rtc;

char daysOfTheWeek [7][6] = {"Dom", "Lun", "Mar", "Mierc", "Jue", "Vier", "Sab"};
byte rx = 0, offset = 0;
byte datos[6];
bool Timbre = false;

struct timbre_e {
  byte hora;
  byte minutos;
  uint32_t duracion;  // en mseg
};

// datos de hora, minutos y duracion en mseg de disparo del timbre
const timbre_e datosTimbre[] = {
                          {7, 0, timbreLargo}, 
                          {7, 40, timbreCorto}, 
                          {8, 20, timbreLargo}, 
                          {8, 30, timbreLargo},
                          {9, 0, timbreCorto1}, 
                          {9, 10, timbreCorto}, 
                          {9, 30, timbreCorto1}, 
                          {9, 50, timbreLargo},
                          {10, 0, timbreLargo}, 
                          {10, 40, timbreCorto}, 
                          {11, 20, timbreLargo}, 
                          {11, 30, timbreLargo},
                          {12, 10, timbreCorto}, 
                          {12, 23, timbreCorto}, 
                          {12, 33, timbreLargo}, 
                          {12, 36, timbreCorto},
                          {14, 20, timbreLargo}, 
                          {14, 30, timbreLargo}, 
                          {15, 10, timbreCorto1}, 
                          {15, 40, timbreCorto1},
                          {15, 50, timbreLargo}, 
                          {16, 00, timbreLargo}, 
                          {16, 40, timbreCorto}, 
                          {17, 20, timbreLargo},
                          {17, 30, timbreLargo}, 
                          {22, 15, timbreLargo}
                         };

byte timbreIndex = 0;
byte numTimbres = sizeof(datosTimbre) / sizeof(datosTimbre[0]);

// ------------------------------------------------------------
// verifica cual es la siguiente alarma (por si hubo un reset o ajuste de hora)
void verificar_proxima_alarma() {
  DateTime now = rtc.now ();
// pasa hora y minutos actual a minutos para facilitar la comparación 
  int tmp = now.hour() * 60 + now.minute();
  byte i = 0;
  while (i < numTimbres) {
    if(datosTimbre[i].hora * 60 + datosTimbre[i].minutos > tmp) {
      break;
    }
    i++;
  }
  timbreIndex = i;
  if (timbreIndex == numTimbres) timbreIndex  = 0;
}
// ------------------------------------------------------------


void setup() {
  Serial.begin(115200);

  lcd.begin (16, 2);
  //  sensor.begin();------------------------------------------------------------------------------------------------------
  delay (3000);

  if (!rtc.begin()) {
    Serial.println ("Opssss!!!... no encuentro el RTC!!!");
    while (1);
  }
  //  pinMode (11, OUTPUT);
  //  digitalWrite (11, LOW);
  pinMode (2, OUTPUT);
  digitalWrite (2, LOW);
  //  pinMode (A1, INPUT);
  verificar_proxima_alarma();
}

void loop() {
  //sensor.requestTemperatures ();---------------------------------------------------------------------------------------------------
  //float temp = sensor.getTempCByIndex (0);
  //dtostrf ( temp,2,1,buffn );
  //sprintf ( buffer, "%s", buffn);

  if (Serial.available()) {
    Timbre = true;
    rx = (uint8_t) Serial.read();
    datos [offset] = rx;
    offset ++;
    if (offset == 6 ) {
      rtc.adjust (DateTime (datos[0] + 2000, datos[1], datos[2], datos[3], datos[4], datos[5]));
      offset = 0;
      Timbre = false;
      verificar_proxima_alarma();
    }
  }
  DateTime now = rtc.now ();

  lcd.setCursor (0, 0);
  lcd.clear();
  lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
  lcd.print (" ");
  lcd.print(now.day(), DEC);
  lcd.print('/');
  lcd.print(now.month(), DEC);
  lcd.print('/');
  lcd.print(now.year(), DEC);
  lcd.setCursor(0, 1);
  lcd.print(now.hour(), DEC);
  lcd.print(':');
  lcd.print (now.minute(), DEC);
  lcd.print(':');
  lcd.print(now.second(), DEC);

  if (now.dayOfTheWeek() == 0 || now.dayOfTheWeek() == 6) { //chequea sabado y domingo
    Serial.println ("Sabado o domingo");
  } else {  //si es dia de semana
    //********************************************************************************************************
    if (Timbre == false) {
      if (now.hour() == datosTimbre[timbreIndex].hora && now.minute() == datosTimbre[timbreIndex].minutos && now.second() <= 1) { 
        //Activar timbre
        digitalWrite(2, HIGH);
        Timbre = true;
        t = millis();
      } 
    } else {
        if ( millis() - t > datosTimbre[timbreIndex].duracion ) {
          digitalWrite (2, LOW);
          Timbre = false;
          timbreIndex++;
          if (timbreIndex == numTimbres) timbreIndex  = 0;
        }
    }
  }
  //##################################################################################################

  lcd.setCursor (9, 1);
  lcd.print ("ETT N 4");
  //lcd.setCursor (11,1);----------------------------------------------------------------------------------------------------------
  // lcd.print (buffer);
  // lcd.println ("");
  delay(1000);
}

Muchas gracias por tus respuestas y gracias por tu codigo. Lo lei y estoy tratando de enteder algunas cosas que desconozco.

con respecto a tu sugerencia..

si no es molestia ¿podrias explicarme como realizar ese cambio?

En lugar de

if ( millis() - t > 8000 ) 
  digitalWrite (2, LOW); 
else { //con esto evitamos que vuelva a sonar en la misma hora el mismo dia 
  if (now.hour() == 9 && now.minute() == 51)
    Timbre = 0; 
  } 
}

hacer

if (now.hour() == 9 && now.minute() == 51) 
  Timbre = 0;
else {
  if ( millis() - t > 8000 )
    digitalWrite (2, LOW);
} 

Ahora que te explico ésto me doy cuenta que mi código tiene un error, así como está no se apagaría nunca el timbre.
Ya lo corrijo.

EDITO: Ya está corregido el error.

Decime qué no entendés y te lo explico, no hay problema.

Igual te resumo.
Para no repetir un mismo bloque de código para cada horario armé un array con cada horario y la duración del timbre.
Para eso declaré una estructura (timbre_e) que contiene 3 variables, hora de tipo byte , minutos de tipo byte y duracion de tipo unsigned long (abreviado uint32_t).
Luego declaré un array (datosTimbre[]) de tipo timbre_e para guardar los datos de cada timbre.
timbreIndex es un contador que señala al próximo horario de timbre, inicia en 0 porque el primer ítem de un array es el 0.

byte numTimbres = sizeof(datosTimbre) / sizeof(datosTimbre[0]);

calcula el número ítems en el array para no poner un número fijo y que permita eliminar o agregar horarios.

sizeof(datosTimbre)

calcula la memoria que ocupa todo el array

sizeof(datosTimbre[0])

calcula los bytes que ocupa solo el primer ítem.
Como resultado de la división se obtiene el número de ítems del array.

verificar_proxima_alarma() calcula cual es el siguiente horario de timbre porque ante un reset o un ajuste de reloj podría quedar desfasada la variable timbreIndex .
now.hour() * 60 + now.minute() calcula los minutos equivalentes desde las 0:00 para hacer más sencilla la comparación (no tener que comparar hora primero y minutos después, así se hace en una sola comparación).
Compara la hora actual con los horarios cargados en el array, cuando uno de ellos es mayor, sale y ajusta el índice apuntando a ese horario.

No verifiqué el ajuste del reloj por puerto serie porque entiendo que funciona.

Luego, como muestra la hora independientemente del día que sea, unifiqué el tema del LCD.
Si es día de fin de semana lo muestra por consola, sino hace el manejo del timbre.

Si el timbre no está sonando, compara la hora y minutos actuales con los almacenados en el ítem del array indicado por timbreIndex, y que sea dentro de los 2 primeros segundos del minuto en curso (segundos 00 y 01). Como la menor duración del timbre es 2.5 seg, ya no hay posibilidad de que un timbre se repita solo hasta el día siguiente.
Si coincide el horario, dispara el timbre, guarda el tiempo y pone en true la variable que indica que el timbre está sonando (Timbre).
Si el timbre está sonando, espera que se cumplan los mseg que indica el array, cuando se cumple el tiempo, apaga el timbre, pone Timbre en false e incrementa timbreIndex para que apunte al siguiente horario. Si al incrementar el contador se iguala el numero de ítems en el array, significa que se llegó al final del mismo, entonces lo pone en 0 (lo prepara para el día siguiente). :wink:

Acá la simulación

Espectacular. Muy agradecido. Con tu explicacion me quedo todo mas claro.

otra consulta.. esta es sobre el circuito y las conexiones.

cada vez que dispara el timbre, se descontrola la LCD, aparecen todos simbolos mas alla de eso el codigo seguia funcionando (activando el timbre en los horarios establecidos) pero sin mostrar datos en la pantalla. El circuito esta conectado con una fuente de 8v 2A, entro a un 7805 y de ahi alimento un arduino nano, el rtc ds 3231 y un relay que es el que activa el timbre.
funcionando el circuito sin la carga conectada al relay no tengo problemas y la lcd no se descontrola. no puedo encontrar la forma de solucionar.
lei en el foro que a una persona le sucedia lo mismo y lo soluciono sacando el pote que controla el contraste y puso una resistencia de 2k. Probe con eso pero sigue el problema. Sera necesario sacar el relay fuera de la caja donde esta montado todo el circuito?

Alimentado con 8V no necesitas el 7805, conectá los 8V al pin Vin del Nano y listo.
De la salida 5V alimentas el RTC, el LCD y el módulo de relé, no vas a tener problemas.

Por el tema eléctrico, echale una mirada a este tema

Buenas tardes MaximoEsfuerzo.
Realice los cambios que me sugeriste. Subi tu codigo a la placa y hasta el momento va muy bien.

Sigo teniendo problemas con el display. Cambie la forma de alimentación como me aconcejaste pero sigue igual. Mientras el rele esta sin la carga conectada funciona sin problemas pero al conectar la carga comienza a la falla despues de cada toque de campanilla.

Adjunto foto

Me resta terminar de leer el post que mencionaste

La campanilla se alimenta de la misma fuente que el Nano y etc.?
El relé es un módulo o un relé individual?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.