Control de luces de Acuario

Si este código sigue cometiendo el mismo error vamos a tener que medir (usando millis()) los tiempos de las rutinas.

#include <Wire.h>
#include "RTClib.h"
#include <UTFTGLUE.h>             //tft
UTFTGLUE tft(0,A2,A1,A3,A4,A0);   //tft

RTC_DS3231 rtc; // Declaramos un RTC DS3231

const int led[5] = {10,45,13,46,44}; //pines led, Deben ser PWM


volatile unsigned long contador_dimmer = 0; // La definimos como volatile
int i,j; //Variables auxiliares para ciclos repetitivos
unsigned long T ;
unsigned long R ;

//Declaramos variables monitor TFT---------------------------------------

char nombreDia[7][12] = {"Domingo__", "Lunes____", "Martes___", "Miercoles", "Jueves___", "Viernes__", "Sabado___"};
char nombreMes[12][12]= {"Enero_____", "Febrero___", "Marzo_____", "Abril_____", "Mayo______",  "Junio_____", "Julio_____","Agosto____","Septiembre","Octubre___","Noviembre_","Diciembre_"};
int dameSegundo,dameMinuto,hora,dia,mes,diaDeLaSemana;
long anio; 

char dameFecha[10];
char dameHora[20];

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

DateTime HoraFecha;

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

  for(i=0; i<4; i++){ //salidas pines led
    pinMode(led[i], OUTPUT);
  }
 
   // Comprobamos si tenemos el RTC conectado
  if (! rtc.begin()) {
      Serial.println("No hay un módulo RTC");
      while (1);
  }

  //definimos propiedades monitor tft------------------------------------------------ 
  tft.reset();
  uint16_t identifier = tft.readID();
  if (identifier == 0xEFEF) identifier = 0x9486;
  tft.begin(identifier);
  tft.InitLCD(); 
  tft.fillScreen(BLACK); //Rellenamos la pantalla de color negro*/
  
}

// hay que descomentar la linea de debajo y compilar solo una vez para actualizar hora
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));


//--- Contador creado por cada interrupcion---//
void dimmer_mas(){
  if (contador_dimmer == 255UL)
      contador_dimmer = 0UL;
  else
      contador_dimmer++; // Contador veces interrupcion
  
}

void dimmer_menos(){
  if (contador_dimmer == 0UL)
      contador_dimmer = 255UL;
  else
      contador_dimmer--; // Contador veces interrupcion
}
 
void loop () {
  if (millis() - T> 1000UL) {   //mostrará la hora cada 1 segundo o 1000 mseg
      queHora();                 
      T = millis();
  }

  if (millis() - R> 21176UL) {  //se ejecuta 2.8 veces por cada minuto para hacer 85 pasos en 30m, cada 21,176s
     enciendeLeds();
     R = millis();
  }
  //delay(100);
}

void queHora(){
  DateTime now = rtc.now();
  HoraFecha = rtc.now(); //obtenemos la hora y fecha actual
  
  dameSegundo   = HoraFecha.second();
  dameMinuto    = HoraFecha.minute();
  hora          = HoraFecha.hour();
  dia           = HoraFecha.day();
  mes           = HoraFecha.month();
  anio          = HoraFecha.year();
  diaDeLaSemana = HoraFecha.dayOfTheWeek();

  //tft.clrScr(); //borra texto tft

  tft.setCursor(20,20); //Posicion del cursor
  tft.setTextSize(2); //Tamaño de la fuente
  tft.setTextColor(RED, BLACK); //Color de la fuente en rojo

  /*las posiciones son ancho y alto, por ese orden*/
  tft.print(nombreDia[diaDeLaSemana], 10,5);
  sprintf(dameFecha,"%02d", dia); tft.setCursor(10, 25);  tft.println(dameFecha);
  tft.print("de", 40,25);
  tft.print(nombreMes[mes-1], 70,25);
  tft.print("del", 195,25);
  sprintf(dameFecha,"%4d", anio); tft.setCursor(235,25);  tft.println(dameFecha);

  tft.setCursor(10, 60);
  tft.setTextColor(WHITE, BLACK);  tft.setTextSize(4);
  sprintf(dameHora,"%02d:%02d:%02d", hora, dameMinuto, dameSegundo);
  tft.println(dameHora);

  sprintf(dameHora,"%02d:%02d:%02d %02d/%02d/%02d", hora, dameMinuto, dameSegundo, dia, mes, anio);
  Serial.println(dameHora);
}


void enciendeLeds(){
  analogWrite(led[1],0);
  analogWrite(led[2],0);  
  analogWrite(led[3],0); 
  analogWrite(led[4],0); 


  if (dameMinuto == 8) {
      if (dameSegundo >= 0  && dameSegundo <= 3) {
          contador_dimmer=0;
      }
  }
  if (dameMinuto >= 8 && dameMinuto <38){
      dimmer_mas();
      ledAzul();
      monitor_dimmer();
  }
}

void ledRojo(){
  analogWrite(led[0],contador_dimmer);
}

void ledVerde(){ 
  analogWrite(led[1],contador_dimmer);   
}

void ledAmarillo(){ 
  analogWrite(led[2],contador_dimmer);   
}

void ledBlanco(){ 
  analogWrite(led[3],contador_dimmer);    
}

void ledAzul(){ 
  analogWrite(led[4],contador_dimmer);
}

void monitor_dimmer(){
  Serial.print("contador_dimmer = ");
  Serial.println(contador_dimmer);
  delay(100);
  Serial.println();
}