[SOLUCIONADO] El Loop no lee lineas anteriores después de quitar tensión

He borrado del código todo lo referente a RTC LCD y la tira led para no tener que montar todo eso, he hecho un simulador de reloj para ir pasando los minutos rápidamente y ver si cumple, solo he tenido que modificar la función ya que tenia un fallo, delante del * tenia escrito por, el resto me ha funcionado correctamente.

int minutosTotales(int h, int m) {
  int por60 = 60;
  int totalMinutos;
  totalMinutos = h * 60 + m;
  return totalMinutos;
}

Buenos días, si, pero no del todo.

Le he quitado tensión para ajustar los relés pues anoche no se apagaban y al ponerlo no ha funcionado del todo bien, me explico:

Hay una franja horaria entre las 8 y las 9 en que queda toda la tira en marcha en tonos amarillos y otra entre las 9 y las 10h en tonos blancos toda la tira también.

Bueno le he quitado tensión (y cuando digo quitado tensión me refiero a quitarle corriente y el microprocesador) a las 8:57h y a las 8:58h cuando lo he puesto se han encendido todas, bien, si esto sigue así bien…

pero no, se lo he tenido que quitar otra vez para ajustar los relés y a las 9:05h cuando lo he puesto tenia que tener parte de la tira en amarillos y un par o tres en blanco, pues solo se han encendido los blancos.

Por tu código a las 9:05 solo cambian 4 leds, si anteriormente has hecho otros cambios en otros leds estos permanecerán ya que no le pides un nuevo cambio al resto de leds, pero si reinicias solo se activaran esos 4 que están en la programación en ese rango horario.

Prueba así

for (int i = 0; i < 8; i++) {
      tira.setBrightness(150);
      if (i < 4) tira.setPixelColor(i, 255, 255, 255);        
      else tira.setPixelColor(i, 255, 150, 0);
      tira.show();
    }

te refieres que como va en cascada no tiene que encenderse, no??

ok, voy a probar hoy, he modificado las horas porque no estaban bien a ver hoy que pasa, te dejo el codigo por si quieres ver como queda despues de meterle mano

#include                    //Del IDE.
#include       //De: https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/
#include       //Del IDE.
#include                  //Del IDE.


RTC_DS1307 rtc;
LiquidCrystal_I2C lcd (0x26, 2, 1, 0, 4, 5, 6, 7);
Adafruit_NeoPixel tira = Adafruit_NeoPixel(8, 2, NEO_GRB + NEO_KHZ800);
String daysOfTheWeek[7] = {"Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab"};
int rele1 = 3;  //FILTRO.
int rele2 = 4;  //BURBUJAS.

int minutosTotales(int h, int m){
  int por60 = 60;
  int totalMinutos;
  totalMinutos = h * 60 + m;
  return totalMinutos;
  }
int lastMinute = 0;


void setup() {
  lcd.setBacklightPin(3, POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.begin(16, 2);
  tira.begin();
  tira.show();

  pinMode(rele1, OUTPUT); 
  pinMode(rele2, OUTPUT);

  if (! rtc.begin()) {
    lcd.println("Modulo RTC no encontrado !");
    while (1);
  }


        
}   




void loop() {
   char buffer[20];   
   tira.show();
   
  DateTime fecha = rtc.now();

  lcd.setCursor(0,0);
  lcd.print(daysOfTheWeek[fecha.dayOfTheWeek()]);
  lcd.setCursor(5, 0);
  sprintf (buffer, "%02d/%02d/%4d", fecha.day(), fecha.month(), fecha.year());
  lcd.print(buffer);
  lcd.setCursor(5,1);  
  sprintf(buffer, "%02d:%02d:%02d", fecha.hour(), fecha.minute(), fecha.second());
  lcd.print(buffer);

   int h = fecha.hour();
   int m = fecha.minute();
   int minutos = minutosTotales(h,m);
  if (lastMinute != m) {
//aqui va todo el código que hay ahora en el loop que solo quieras ejecutar 1 vez por minuto


    //Burbujas ON 7:50h
  if (minutos >= 503 && minutos <= 1380){
    digitalWrite(rele2, HIGH);
  } 

    //Burbujas off 23:00h
  if (minutos >= 1380 && minutos <= 1430){
    digitalWrite(rele2, LOW);
  }
    
    //Filtro ON 7:55h
  if (minutos >=512 && minutos <= 1275){
    digitalWrite(rele1, HIGH);
  } 
    
    //Filtro off 20:45h
  if (minutos >= 1275 && minutos <= 1430){
    digitalWrite(rele1, LOW);
  }
    
  

    


    //Amanece 8:00h
  if (minutos >= 480 && minutos <= 488){
    for (int i = 0; i < 2; i++) {
      tira.setBrightness(25);
      tira.setPixelColor(i, 255, 150, 0);        
      tira.show();
    }
  }
  
    //Amanece 8:05h
   if (minutos >= 488 && minutos <= 497){
    for (int i = 0; i < 4; i++) {
      tira.setBrightness(50);
      tira.setPixelColor(i, 255, 150, 0);        
      tira.show();
    }
  }

    //Amanece 8:10h
  if (minutos >= 497 && minutos <= 505){
    for (int i = 0; i < 6; i++) {
      tira.setBrightness(75);
      tira.setPixelColor(i, 255, 150, 0);        
      tira.show();
    }
  }

    //Amanece 8:15h
  if (minutos >= 505 && minutos <= 540){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(100);
      tira.setPixelColor(i, 255, 150, 0);        
      tira.show();
    }
  }

    //Medio día 9:00h
  if (minutos >= 540 && minutos <= 548){
    for (int i = 0; i < 2; i++) {
      tira.setBrightness(125);
      tira.setPixelColor(i, 255, 255, 255);        
      tira.show();
    }
  }

    //Medio día 9:05h
  if (minutos >= 548 && minutos <= 557){
    for (int i = 0; i < 4; i++) {
      tira.setBrightness(150);
      tira.setPixelColor(i, 255, 255, 255);        
      tira.show();
    }
  }
   
    //Medio día 9:10h
  if (minutos >= 557 && minutos <= 565){
    for (int i = 0; i < 6; i++) {
      tira.setBrightness(175);
      tira.setPixelColor(i, 255, 255, 255);        
      tira.show();
    }
  }

    //Medio día 9:15h
  if (minutos >= 565 && minutos <= 600){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(200);
      tira.setPixelColor(i, 255, 255, 255);        
      tira.show();
    }
  }    

    //Medio día 10:00h    
  if (minutos >= 600 && minutos <= 1260){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      tira.setPixelColor(i, 255, 255, 255);
      tira.show();
    }
  }



    //Atardecer 21:00h                                     
  if (minutos >= 1260 && minutos <= 1395){
    tira.setBrightness(255);
    tira.setPixelColor(0, 255, 255, 255);
    tira.show();
  }
      //Atardecer 21:05h
  if (minutos >= 1268 && minutos <= 1395){
    tira.setBrightness(255);
    tira.setPixelColor(1, 0, 0, 255);
    tira.show();
  }
      //Atardecer 21:10h
  if (minutos >= 1277 && minutos <= 1380){
    tira.setBrightness(255);
    tira.setPixelColor(2, 0, 0, 255); 
    tira.show();
  }
      //Atardecer 21:15h
  if (minutos >= 1285 && minutos <= 1380){
    tira.setBrightness(255);
    tira.setPixelColor(3, 0, 0, 255);
    tira.show();
  }
      //Atardecer 21:20h
  if (minutos >= 1293 && minutos <= 1405){
    tira.setBrightness(255);
    tira.setPixelColor(4, 0, 0, 255);  
    tira.show();
  }
      //Atardecer 21:25h
  if (minutos >= 1302 && minutos <= 1405){
    tira.setBrightness(255);
    tira.setPixelColor(5, 0, 0, 255);
    tira.show();
  }
      //Atardecer 21:30h
  if (minutos >= 1310 && minutos <= 1430){
   tira.setBrightness(255);
   tira.setPixelColor(6, 0, 0, 255);
   tira.show();
  }
      //Atardecer 21:35h
  if (minutos >= 1318 && minutos <= 1430){
   tira.setBrightness(255);
   tira.setPixelColor(7, 255, 255, 255);
   tira.show();
  }



    //Apagado 22:45h
  if (minutos >= 1395 && minutos <= 1430){
    for (int i = 0; i < 2; i++) {
      tira.setBrightness(128);
      tira.setPixelColor(i, 0, 0, 0);
      tira.show();
    }
  }
  
    //Apagado 23:00h
  if (minutos >= 1380 && minutos <= 1430){
    for (int i = 0; i < 4; i++) {
      tira.setBrightness(85);
      tira.setPixelColor(i, 0, 0, 0);
      tira.show();
    }
  }

   //Apagado 23:15h
  if (minutos >= 1405 && minutos <= 1430){
    for (int i = 0; i < 6; i++) {
      tira.setBrightness(42);
      tira.setPixelColor(i, 0, 0, 0);
      tira.show();
    }
  }
  
   //Apagado 23:30h
  if (minutos == 1430){ 
    tira.clear(); 
  } 
}

lastMinute = m;  
}

me he basado en las conversiones de estas horas:

/*
      HORAS      ENTEROS    
        7         420
        8         480
        9         540
        10        600
        11        660
        12        720   
        13        780
        14        840
        15        900
        16        960
        17        1020
        18        1080
        19        1140
        20        1200
        21        1260
        22        1320
        23        1380
 */

y estos minutos:

/*
          MINUTOS           ENTERO
            5                 8
            10                17
            15                25
            20                33
            25                42
            30                50
            35                58
            40                67
            45                75
            50                83
            55                92

  */

No has implementado lo de mi ultimo post en ninguna hora para dejar bien todos los leds. Si solo ha de cumplir un rango horario y el resto estar apagado con un else te sirve y no necesitas comparar nada mas, también te puse un ejemplo.

Los minutos no van de 0 a 100, se suman tal cual de 0 a 60.

Disculpa no te he entendido bien, te ruego que comprendas.

te refieres a que lo cambie todo? o solo en las 9:05h? a las 9 de la mañana o de la noche?

luego otra cosa, lo tuyo es para cambiar 4 leds a la vez? es que no me interesa que cambie la luz tanta y tan de golpe, recuerda que es un acuario el pez, debe acostumbrarse a la luz poco a poco, es por ello que hay muchos que encienden uno a uno, aunque sean cada 5 minutos.

HAAAAA los minutos tal cual, si, ok, veras lo puse asi porque pusiste en un ejemplo las 8.5 y pensé que en los minutos era fraccionario o sea, a los 15 minutos seria el 25% a la media hora seria el 50%...

vale mañana por la mañana cambiare todos los números y probare durante el día.

tu por favor, explícame un poco mas despacio ( te lo ruego) lo de tu ultimo comentario si se ajusta a mis necesidades (lo de un led a uno).

Agradezco vuestra ayuda de verdad, os merecéis un cervezote cada uno y si estáis por el mediterráneo Español lo podemos ver, en serio.

La idea era que si reinicias se pongan los leds como realmente los quieres y esto puedes hacerlo en todas las horas que solo cambiabas 1 o 2 leds cambiando en el if el numero de leds.

for (int i = 0; i < 8; i++) {
      tira.setBrightness(150);
      if (i < 4) tira.setPixelColor(i, 255, 255, 255);  //aqui se ponen los 4 primeros leds en blanco     
      else tira.setPixelColor(i, 255, 150, 0); //aqui pone el resto en naranja
      tira.show();
    }

Este es el otro ejemplo que te di

   //Burbujas ON 7:50h a 23:00
  if (minutos >= 470 && minutos <= 1380){ //aqui comprueba si se cumple el rango
    digitalWrite(rele2, HIGH);
  }
  else digitalWrite(rele2, LOW); //si no cumple lo anterior se desactiva

A ver asi??

#include                    //Del IDE.
#include       //De: https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/
#include       //Del IDE.
#include                  //Del IDE.


RTC_DS1307 rtc;
LiquidCrystal_I2C lcd (0x26, 2, 1, 0, 4, 5, 6, 7);
Adafruit_NeoPixel tira = Adafruit_NeoPixel(8, 2, NEO_GRB + NEO_KHZ800);
String daysOfTheWeek[7] = {"Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab"};
int rele1 = 3;  //FILTRO.
int rele2 = 4;  //BURBUJAS.

int minutosTotales(int h, int m){
  int por60 = 60;
  int totalMinutos;
  totalMinutos = h * 60 + m;
  return totalMinutos;
  }
int lastMinute = 0;


void setup() {
  lcd.setBacklightPin(3, POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.begin(16, 2);
  tira.begin();
  tira.show();

  pinMode(rele1, OUTPUT); 
  pinMode(rele2, OUTPUT);

  if (! rtc.begin()) {
    lcd.println("Modulo RTC no encontrado !");
    while (1);
  }


        
}   




void loop() {
   char buffer[20];   
   tira.show();
   
  DateTime fecha = rtc.now();

  lcd.setCursor(0,0);
  lcd.print(daysOfTheWeek[fecha.dayOfTheWeek()]);
  lcd.setCursor(5, 0);
  sprintf (buffer, "%02d/%02d/%4d", fecha.day(), fecha.month(), fecha.year());
  lcd.print(buffer);
  lcd.setCursor(5,1);  
  sprintf(buffer, "%02d:%02d:%02d", fecha.hour(), fecha.minute(), fecha.second());
  lcd.print(buffer);

   int h = fecha.hour();
   int m = fecha.minute();
   int minutos = minutosTotales(h,m);
  if (lastMinute != m) {
//aqui va todo el código que hay ahora en el loop que solo quieras ejecutar 1 vez por minuto


    //Burbujas ON 7:50h
  if (minutos >= 470 && minutos <= 1380){
    digitalWrite(rele2, HIGH);
  } 

    //Burbujas off 23:00h
  if (minutos >= 1380 && minutos <= 1410){
    digitalWrite(rele2, LOW);
  }
    
    //Filtro ON 7:55h
  if (minutos >= 475 && minutos <= 1275){
    digitalWrite(rele1, HIGH);
  } 
    
    //Filtro off 20:45h
  if (minutos >= 1245 && minutos <= 1410){
    digitalWrite(rele1, LOW);
  }
    
  

    


    //Amanece 8:00h
  if (minutos >= 480 && minutos <= 540){
    for (int i = 0; i < 2; i++) {
      tira.setBrightness(25);
      tira.setPixelColor(i, 255, 150, 0);        
      tira.show();
    }
  }
  
    //Amanece 8:05h
   if (minutos >= 485 && minutos <= 545){
    for (int i = 0; i < 4; i++) {
      tira.setBrightness(50);
      tira.setPixelColor(i, 255, 150, 0);        
      tira.show();
    }
  }

    //Amanece 8:10h
  if (minutos >= 490 && minutos <= 550){
    for (int i = 0; i < 6; i++) {
      tira.setBrightness(75);
      tira.setPixelColor(i, 255, 150, 0);        
      tira.show();
    }
  }

    //Amanece 8:15h
  if (minutos >= 495 && minutos <= 555){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(100);
      tira.setPixelColor(i, 255, 150, 0);        
      tira.show();
    }
  }


     //Medio día 9:00h
  if (minutos >= 540 && minutos <= 600){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(125);
      if (i < 2) tira.setPixelColor(i, 255, 255, 255);  //aqui se ponen los 4 primeros leds en blanco     
      else tira.setPixelColor(i, 255, 150, 0); //aqui pone el resto en naranja
      tira.show();
    }
  }


    //Medio día 9:05h
  if (minutos >= 545 && minutos <= 600){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(150);
      if (i < 4) tira.setPixelColor(i, 255, 255, 255);
      else tira.setPixelColor(i, 255, 150, 0);       
      tira.show();
    }
  }
   
    //Medio día 9:10h
  if (minutos >= 550 && minutos <= 600){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(175);
      if (i < 6) tira.setPixelColor(i, 255, 255, 255);
      else tira.setPixelColor(i, 255, 150, 0);       
      tira.show();
    }
  }

    //Medio día 9:15h
  if (minutos >= 555 && minutos <= 600){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(200);
      tira.setPixelColor(i, 255, 255, 255);        
      tira.show();
    }
  }    

    //Medio día 10:00h    
  if (minutos >= 600 && minutos <= 1260){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      tira.setPixelColor(i, 255, 255, 255);
      tira.show();
    }
  }



      //Atardecer 21:00h                                     
   if (minutos >= 1260 && minutos <= 1365){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      if (i < 7) tira.setPixelColor(i, 255, 255, 255);  //aqui se pone el 7 primer led en blanco 
      else tira.setPixelColor(i, 255, 255, 255);        //aqui pone el resto en blanco    
      tira.show();
    }
  }  
      //Atardecer 21:05h
  if (minutos >= 1265 && minutos <= 1365){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      if (i < 6) tira.setPixelColor(i, 0, 0, 255);
      else tira.setPixelColor(i, 255, 255, 255);
      tira.show();
    }
  }
      //Atardecer 21:10h
  if (minutos >= 1270 && minutos <= 1380){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      if (i < 5) tira.setPixelColor(i, 0, 0, 255);
      else tira.setPixelColor(i, 255, 255, 255);
      tira.show();
    }
  }
      //Atardecer 21:15h
  if (minutos >= 1275 && minutos <= 1380){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      if (i < 4) tira.setPixelColor(i, 0, 0, 255);
      else tira.setPixelColor(i, 255, 255, 255);
      tira.show();
    }
  }
      //Atardecer 21:20h
  if (minutos >= 1280 && minutos <= 1395){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      if (i < 3) tira.setPixelColor(i, 0, 0, 255);
      else tira.setPixelColor(i, 255, 255, 255);
      tira.show();
    }
  }
      //Atardecer 21:25h
  if (minutos >= 1285 && minutos <= 1395){
     for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      if (i < 2) tira.setPixelColor(i, 0, 0, 255);
      else tira.setPixelColor(i, 255, 255, 255);
      tira.show();
    }
  }
      //Atardecer 21:30h
  if (minutos >= 1290 && minutos <= 1410){
     for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      if (i < 1) tira.setPixelColor(i, 0, 0, 255);
      else tira.setPixelColor(i, 255, 255, 255);
      tira.show();
    }
  }
      //Atardecer 21:35h
  if (minutos >= 1295 && minutos <= 1410){
     for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      if (i < 0) tira.setPixelColor(i, 255, 255, 255);
      else tira.setPixelColor(i, 255, 255, 255);
      tira.show();
    }
  }



    //Apagado 22:45h
  if (minutos >= 1365 && minutos <= 1410){
    for (int i = 0; i < 2; i++) {
      tira.setBrightness(128);
      tira.setPixelColor(i, 0, 0, 0);
      tira.show();
    }
  }
  
    //Apagado 23:00h
  if (minutos >= 1380 && minutos <= 1410){
    for (int i = 0; i < 4; i++) {
      tira.setBrightness(85);
      tira.setPixelColor(i, 0, 0, 0);
      tira.show();
    }
  }

   //Apagado 23:15h
  if (minutos >= 1405 && minutos <= 1410){
    for (int i = 0; i < 6; i++) {
      tira.setBrightness(42);
      tira.setPixelColor(i, 0, 0, 0);
      tira.show();
    }
  }
  
   //Apagado 23:30h
  if (minutos == 1410){ 
    tira.clear(); 
  } 
}

lastMinute = m;  
}

no he hecho lo del rele porque no se si hay que quitar las lineas de apagado, yo entiendo que si, si pones un else eliminas lo otro, no?

 //Burbujas off 23:00h
  if (minutos >= 1380 && minutos <= 1410){
    digitalWrite(rele2, LOW);
  }
  //Filtro off 20:45h
  if (minutos >= 1245 && minutos <= 1410){
    digitalWrite(rele1, LOW);
  }

a estas me refiero.

De todas formas puse un else al principio y no me funciono muy bien, no recuerdo el problema que tenia, la verdad.

Con el else puedes eliminar el rango de off, viene a ser lo mismo.

Ya te funciona bien la iluminación tras reset?

Vale, como viene a ser lo mismo, de momento lo dejo así.

Ayer puse el programa cambiando los tiempos a como lo comentaste tras el error de los minutos sin la modificación que me recomendaste, mas que nada porque ya era tarde y me gusta probar el programa lo mas temprano posible, desde las 9:30h estuvo funcionando bien y me gustaría dejarlo así un par de días, he notado estrés en los animales y me gustaría aguantar pero el programa lo tengo hecho como has visto en mi ultimo post y si me confirmas que esta bien lo instalare en el micro a ver que pasa y te cuento.

Mas adelante si todo funciona bien me gustaría poner un día y una hora en concreto para que se apague todo y dejar ese día para el mantenimiento del acuario, el comando podría ser algo asi:

   //Filtro off Sabado de 10:00h a 17:00h
  if (minutos >= 600 && minutos <= 1020 && fecha.day == Sab){
    digitalWrite(rele1, LOW);
  }

     //Burbujas off Sabado de 10:00h a 17:00h
  if (minutos >= 600 && minutos <= 1020 && fecha.day == Sab){
    digitalWrite(rele2, LOW);
  }

Sabes? hay un problema que quería comentarte y que "hemos" solucionado de rebote, yo ya contaba con ello, tengo como ya he contado el microcontrolador en una board soldado sin la placa de arduino, solo los componentes que necesito, el relé de control de 230V está dentro y como ya te imaginarás tengo problemas de lo que aquí llamamos "Armónicos" y cada vez que se enciende o apaga el filtro (burbujas no) se apagan las luces, ayer a las 20:45h se apagó el filtro y sólo hubo una pequeña intermitencia de los 8 leds pero volvieron al estado que tenían que estar, ya se que hay que blindar cableado, o apantallarlo o incluso hacer una jaula faradaica pero si así chutan lo dejo.

Bueno ya me cuentas tus impresiones, gracias de nuevo.

krnlpanic: Con el else puedes eliminar el rango de off, viene a ser lo mismo.

Ya te funciona bien la iluminación tras reset?

Lo mismo no me he explicado bien, no lo he probado pero lo tengo escrito para probar. Lo que no se si esta bien escrito. No lo he probado porque sin ello ayer funciono bien, lo probare así un par de días y si no falla (amen de tu recomendación) lo dejo.

Pero entiendo que con el problema de armónicos que te cuento en el reset debería funcionar igual, o sea que bien.

lo dicho, cuéntame y hablamos.

El anterior te funcionara bien hasta que reinicies a una hora en la que tenias leds de diferentes colores que te dejara encendidos solo algunos.

El problema de que se apague la tira, al minuto vuelve a encenderse?

Yo tengo un Mega en casa usándolo de domotica, a veces activo hasta 9 motores de persiana con reles y si que tenia aveces falsas lecturas de entradas digitales, lo solucione midiendo cuanto tiempo estaba activa y dándole un margen de 400ms para activar su función,no aplicaría en el caso de la tira que también podría ser un problema de la fuente.

Para el mantenimiento quizá te funcionaria mejor un interruptor de corte para hacerlo cuando sea necesario.

Prueba el ultimo código y nos comentas.

"El anterior te funcionara bien hasta que reinicies a una hora en la que tenias leds de diferentes colores que te dejara encendidos solo algunos."

No lo he probado aun, quiero ver unos dias si chuta bien. De momento solo he probado a quitarle y ponerle tension 240V y hace solo un breve apagon , tambien lo hace cuando a las 20:45 se apaga el filtro pero se enciende bien.

"El problema de que se apague la tira, al minuto vuelve a encenderse?"

Es inmediato

"Para el mantenimiento quizá te funcionaria mejor un interruptor de corte para hacerlo cuando sea necesario."

Ya lo había pensado, creo que sera la mejor opción pues como te he comentado le quito 220V y solo se nota un parpadeo general.

"Prueba el ultimo código y nos comentas."

Ok, cara al fin de semana. Os cuento lo que sea y os dejaré el código acabado por si alguien lo quiere

Me reitero, cara al fin de semana haré la prueba con el otro código y os cuento.

De momento comentar que ha estado funcionando bien, he quitado tensión yo para limpiar y pese a los armónicos las luces solo han parpadeado un poco. Ayer al apagarse el filtro se quedo un poco loco el procesador, se quedaron las luces mal encendidas y el lcd mostraba la hora pero fija, parecía como si se hubiese quedado pinchado, lo deje unos 15 minutos a ver y como no reaccionaba apreté el botón del reset y oye la hora a su estado que toca y las luces como tenían que estar en ese momento, una maravilla.

Así que eso, veremos la reacción del otro código durante la próxima semana.

Os voy Contando.

Saludos cordiales, le he subido la ultima modificación del programa que me habéis comentado, lleva 5 minutos y lo que puedo observar es que cada minuto hace un parpadeo toda la tira de led, lo voy a dejar hoy pero si hace eso todo el día lo cambio al programa anterior, os dejo el codigo para que veais como esta.

/* Algo le pasa que cada minuto parpadea toda la tira de led. */


#include <Wire.h>                   
#include <LiquidCrystal_I2C.h>      
#include <Adafruit_NeoPixel.h>      
#include <RTClib.h>                 


RTC_DS1307 rtc;
LiquidCrystal_I2C lcd (0x26, 2, 1, 0, 4, 5, 6, 7);
Adafruit_NeoPixel tira = Adafruit_NeoPixel(8, 2, NEO_GRB + NEO_KHZ800);
String daysOfTheWeek[7] = {"Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab"};
int rele1 = 3;  //FILTRO.
int rele2 = 4;  //BURBUJAS.

int minutosTotales(int h, int m){
  int por60 = 60;
  int totalMinutos;
  totalMinutos = h * 60 + m;
  return totalMinutos;
  }
int lastMinute = 0;


void setup() {
  lcd.setBacklightPin(3, POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.begin(16, 2);
  tira.begin();
  tira.show();

  pinMode(rele1, OUTPUT); 
  pinMode(rele2, OUTPUT);

  if (! rtc.begin()) {
    lcd.println("Modulo RTC no encontrado !");
    while (1);
  }


        
}   




void loop() {
   char buffer[20];   
   tira.show();
   
  DateTime fecha = rtc.now();

  lcd.setCursor(0,0);
  lcd.print(daysOfTheWeek[fecha.dayOfTheWeek()]);
  lcd.setCursor(5, 0);
  sprintf (buffer, "%02d/%02d/%4d", fecha.day(), fecha.month(), fecha.year());
  lcd.print(buffer);
  lcd.setCursor(5,1);  
  sprintf(buffer, "%02d:%02d:%02d", fecha.hour(), fecha.minute(), fecha.second());
  lcd.print(buffer);

   int h = fecha.hour();
   int m = fecha.minute();
   int minutos = minutosTotales(h,m);
  if (lastMinute != m) {
//aqui va todo el código que hay ahora en el loop que solo quieras ejecutar 1 vez por minuto


    //Burbujas ON 8:20h
  if (minutos >= 500 && minutos <= 1380){
    digitalWrite(rele2, HIGH);
  } 

    //Burbujas off 22:45h
  if (minutos >= 1365 && minutos <= 1410){
    digitalWrite(rele2, LOW);
  }
    
    //Filtro ON 8:45h
  if (minutos >= 525 && minutos <= 1275){
    digitalWrite(rele1, HIGH);
  } 
    
    //Filtro off 20:45h
  if (minutos >= 1245 && minutos <= 1410){
    digitalWrite(rele1, LOW);
  }
    
  

    


    //Amanece 8:00h
  if (minutos >= 480 && minutos <= 540){
    for (int i = 0; i < 2; i++) {
      tira.setBrightness(25);
      tira.setPixelColor(i, 255, 150, 0);        
      tira.show();
    }
  }
  
    //Amanece 8:05h
   if (minutos >= 485 && minutos <= 545){
    for (int i = 0; i < 4; i++) {
      tira.setBrightness(50);
      tira.setPixelColor(i, 255, 150, 0);        
      tira.show();
    }
  }

    //Amanece 8:10h
  if (minutos >= 490 && minutos <= 550){
    for (int i = 0; i < 6; i++) {
      tira.setBrightness(75);
      tira.setPixelColor(i, 255, 150, 0);        
      tira.show();
    }
  }

    //Amanece 8:15h
  if (minutos >= 495 && minutos <= 555){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(100);
      tira.setPixelColor(i, 255, 150, 0);        
      tira.show();
    }
  }


     //Medio día 9:00h
  if (minutos >= 540 && minutos <= 600){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(125);
      if (i < 2) tira.setPixelColor(i, 255, 255, 255);  //aqui se ponen los 2 primeros leds en blanco     
      else tira.setPixelColor(i, 255, 150, 0); //aqui pone el resto en naranja
      tira.show();
    }
  }


    //Medio día 9:05h
  if (minutos >= 545 && minutos <= 600){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(150);
      if (i < 4) tira.setPixelColor(i, 255, 255, 255);
      else tira.setPixelColor(i, 255, 150, 0);       
      tira.show();
    }
  }
   
    //Medio día 9:10h
  if (minutos >= 550 && minutos <= 600){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(175);
      if (i < 6) tira.setPixelColor(i, 255, 255, 255);
      else tira.setPixelColor(i, 255, 150, 0);       
      tira.show();
    }
  }

    //Medio día 9:15h
  if (minutos >= 555 && minutos <= 600){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(200);
      tira.setPixelColor(i, 255, 255, 255);        
      tira.show();
    }
  }    

    //Medio día 10:00h    
  if (minutos >= 600 && minutos <= 1260){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      tira.setPixelColor(i, 255, 255, 255);
      tira.show();
    }
  }



      //Atardecer 21:00h                                     
   if (minutos >= 1260 && minutos <= 1365){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      if (i < 7) tira.setPixelColor(i, 255, 255, 255);  //aqui se pone el 7 primer led en blanco 
      else tira.setPixelColor(i, 255, 255, 255);        //aqui pone el resto en blanco    
      tira.show();
    }
  }  
      //Atardecer 21:05h
  if (minutos >= 1265 && minutos <= 1365){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      if (i < 6) tira.setPixelColor(i, 0, 0, 255);
      else tira.setPixelColor(i, 255, 255, 255);
      tira.show();
    }
  }
      //Atardecer 21:10h
  if (minutos >= 1270 && minutos <= 1380){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      if (i < 5) tira.setPixelColor(i, 0, 0, 255);
      else tira.setPixelColor(i, 255, 255, 255);
      tira.show();
    }
  }
      //Atardecer 21:15h
  if (minutos >= 1275 && minutos <= 1380){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      if (i < 4) tira.setPixelColor(i, 0, 0, 255);
      else tira.setPixelColor(i, 255, 255, 255);
      tira.show();
    }
  }
      //Atardecer 21:20h
  if (minutos >= 1280 && minutos <= 1395){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      if (i < 3) tira.setPixelColor(i, 0, 0, 255);
      else tira.setPixelColor(i, 255, 255, 255);
      tira.show();
    }
  }
      //Atardecer 21:25h
  if (minutos >= 1285 && minutos <= 1395){
     for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      if (i < 2) tira.setPixelColor(i, 0, 0, 255);
      else tira.setPixelColor(i, 255, 255, 255);
      tira.show();
    }
  }
      //Atardecer 21:30h
  if (minutos >= 1290 && minutos <= 1410){
     for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      if (i < 1) tira.setPixelColor(i, 0, 0, 255);
      else tira.setPixelColor(i, 255, 255, 255);
      tira.show();
    }
  }
      //Atardecer 21:35h
  if (minutos >= 1295 && minutos <= 1410){
     for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      if (i < 0) tira.setPixelColor(i, 255, 255, 255);
      else tira.setPixelColor(i, 255, 255, 255);
      tira.show();
    }
  }



    //Apagado 22:45h
  if (minutos >= 1365 && minutos <= 1410){
    for (int i = 0; i < 2; i++) {
      tira.setBrightness(128);
      tira.setPixelColor(i, 0, 0, 0);
      tira.show();
    }
  }
  
    //Apagado 23:00h
  if (minutos >= 1380 && minutos <= 1410){
    for (int i = 0; i < 4; i++) {
      tira.setBrightness(85);
      tira.setPixelColor(i, 0, 0, 0);
      tira.show();
    }
  }

   //Apagado 23:15h
  if (minutos >= 1405 && minutos <= 1410){
    for (int i = 0; i < 6; i++) {
      tira.setBrightness(42);
      tira.setPixelColor(i, 0, 0, 0);
      tira.show();
    }
  }
  
   //Apagado 23:30h
  if (minutos == 1410){ 
    tira.clear(); 
  } 
}

lastMinute = m;  
}

Respecto al problema del parpadeo: supongamos que son las 9:04 de la mañana. Eso sería el minuto 544 del día (9 * 60 + 4). Así que la variable minutos valdrá 544. Fijémonos ahora en esta parte del programa:

    //Amanece 8:00h
  if (minutos >= 480 && minutos <= 540){
    for (int i = 0; i < 2; i++) {
      tira.setBrightness(25);
      tira.setPixelColor(i, 255, 150, 0);       
      tira.show();
    }
  }

    //Amanece 8:05h
   if (minutos >= 485 && minutos <= 545){
    for (int i = 0; i < 4; i++) {
      tira.setBrightness(50);
      tira.setPixelColor(i, 255, 150, 0);       
      tira.show();
    }
  }

    //Amanece 8:10h
  if (minutos >= 490 && minutos <= 550){
    for (int i = 0; i < 6; i++) {
      tira.setBrightness(75);
      tira.setPixelColor(i, 255, 150, 0);       
      tira.show();
    }
  }

Eso significa que la condición de los tres if se cumple, con lo cual hará que se cambie el color de los LED en las tres ocasiones, una detrás de otra, generando un pequeño parpadeo. La solución rápida es quitar todos los tira.show(); que hay en el programa, salvo el que está al principio del loop(). No hace falta estar llamando a tira.show() cada vez que se cambia un LED, se pueden hacer todos los cambios necesarios y mostrarlos con una sola llamada a tira.show();.

El único que se ha dejar es este:

void loop() {
   char buffer[20];
   tira.show();    // Dejar solo este tira.show(), el resto quitarlos todos
   ...

OK, GRACIAS, de todas formas dejare el programa una semana para probar

IgnoranteAbsoluto: Respecto al problema del parpadeo: supongamos que son las 9:04 de la mañana. Eso sería el minuto 544 del día (9 * 60 + 4). Así que la variable minutos valdrá 544. Fijémonos ahora en esta parte del programa:

    //Amanece 8:00h
  if (minutos >= 480 && minutos <= 540){
    for (int i = 0; i < 2; i++) {
      tira.setBrightness(25);
      tira.setPixelColor(i, 255, 150, 0);       
      tira.show();
    }
  }

   //Amanece 8:05h   if (minutos >= 485 && minutos <= 545){    for (int i = 0; i < 4; i++) {      tira.setBrightness(50);      tira.setPixelColor(i, 255, 150, 0);            tira.show();    }  }

   //Amanece 8:10h  if (minutos >= 490 && minutos <= 550){    for (int i = 0; i < 6; i++) {      tira.setBrightness(75);      tira.setPixelColor(i, 255, 150, 0);            tira.show();    }  }




Eso significa que la condición de los tres if se cumple, con lo cual hará que se cambie el color de los LED en las tres ocasiones, una detrás de otra, generando un pequeño parpadeo. La solución rápida es quitar todos los tira.show(); que hay en el programa, salvo el que está al principio del loop(). No hace falta estar llamando a tira.show() cada vez que se cambia un LED, se pueden hacer todos los cambios necesarios y mostrarlos con una sola llamada a tira.show();.

El único que se ha dejar es este:



void loop() {   char buffer[20];   tira.show();    // Dejar solo este tira.show(), el resto quitarlos todos   ... ```

Ya esta hecho, si veo que no funciona bien pondre la modificacion anterior, ayer al rededor de las 21:30h la tira tenia que tener un aspecto en tonos azules y no cambio, lo unico que he hecho al codigo ha sido lo de "tira.show();" si esta tarde o mañana vuelve a hacer lo mismo pondre este que ha estado funcionando bien:

/*
 * Se corrije el fallo de los minutos, ahora se pasan las horas a minutos y se suman los minutos.
 * 
 * Ha estado funcionando una semana y funciona bien, cuando se apaga el filtro o las burbujas hace una 
 * pequeña intermitencia y sigue funcionando.
 * A veces se raya y se queda pinchado pero si se aprieta a reset continúa por donde toca.
*/

#include                    //Del IDE.
#include       //De: https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/
#include       //Del IDE.
#include                  //Del IDE.


RTC_DS1307 rtc;
LiquidCrystal_I2C lcd (0x26, 2, 1, 0, 4, 5, 6, 7);
Adafruit_NeoPixel tira = Adafruit_NeoPixel(8, 2, NEO_GRB + NEO_KHZ800);
String daysOfTheWeek[7] = {"Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab"};
int rele1 = 3;  //FILTRO.
int rele2 = 4;  //BURBUJAS.

int minutosTotales(int h, int m){
  int por60 = 60;
  int totalMinutos;
  totalMinutos = h * 60 + m;
  return totalMinutos;
  }
int lastMinute = 0;


void setup() {
  lcd.setBacklightPin(3, POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.begin(16, 2);
  tira.begin();
  tira.show();

  pinMode(rele1, OUTPUT); 
  pinMode(rele2, OUTPUT);

  if (! rtc.begin()) {
    lcd.println("Modulo RTC no encontrado !");
    while (1);
  }


        
}   




void loop() {
   char buffer[20];   
   tira.show();
   
  DateTime fecha = rtc.now();

  lcd.setCursor(0,0);
  lcd.print(daysOfTheWeek[fecha.dayOfTheWeek()]);
  lcd.setCursor(5, 0);
  sprintf (buffer, "%02d/%02d/%4d", fecha.day(), fecha.month(), fecha.year());
  lcd.print(buffer);
  lcd.setCursor(5,1);  
  sprintf(buffer, "%02d:%02d:%02d", fecha.hour(), fecha.minute(), fecha.second());
  lcd.print(buffer);

   int h = fecha.hour();
   int m = fecha.minute();
   int minutos = minutosTotales(h,m);
  if (lastMinute != m) {
//aqui va todo el código que hay ahora en el loop que solo quieras ejecutar 1 vez por minuto


    //Burbujas ON 7:50h
  if (minutos >= 470 && minutos <= 1380){
    digitalWrite(rele2, HIGH);
  } 

    //Burbujas off 23:00h
  if (minutos >= 1380 && minutos <= 1410){
    digitalWrite(rele2, LOW);
  }
    
    //Filtro ON 7:55h
  if (minutos >= 475 && minutos <= 1275){
    digitalWrite(rele1, HIGH);
  } 
    
    //Filtro off 20:45h
  if (minutos >= 1245 && minutos <= 1410){
    digitalWrite(rele1, LOW);
  }
    
  

    


    //Amanece 8:00h
  if (minutos >= 480 && minutos <= 540){
    for (int i = 0; i < 2; i++) {
      tira.setBrightness(25);
      tira.setPixelColor(i, 255, 150, 0);        
      tira.show();
    }
  }
  
    //Amanece 8:05h
   if (minutos >= 485 && minutos <= 545){
    for (int i = 0; i < 4; i++) {
      tira.setBrightness(50);
      tira.setPixelColor(i, 255, 150, 0);        
      tira.show();
    }
  }

    //Amanece 8:10h
  if (minutos >= 490 && minutos <= 550){
    for (int i = 0; i < 6; i++) {
      tira.setBrightness(75);
      tira.setPixelColor(i, 255, 150, 0);        
      tira.show();
    }
  }

    //Amanece 8:15h
  if (minutos >= 495 && minutos <= 555){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(100);
      tira.setPixelColor(i, 255, 150, 0);        
      tira.show();
    }
  }

    //Medio día 9:00h
  if (minutos >= 540 && minutos <= 600){
    for (int i = 0; i < 2; i++) {
      tira.setBrightness(125);
      tira.setPixelColor(i, 255, 255, 255);        
      tira.show();
    }
  }

    //Medio día 9:05h
  if (minutos >= 545 && minutos <= 600){
    for (int i = 0; i < 4; i++) {
      tira.setBrightness(150);
      tira.setPixelColor(i, 255, 255, 255);        
      tira.show();
    }
  }
   
    //Medio día 9:10h
  if (minutos >= 550 && minutos <= 600){
    for (int i = 0; i < 6; i++) {
      tira.setBrightness(175);
      tira.setPixelColor(i, 255, 255, 255);        
      tira.show();
    }
  }

    //Medio día 9:15h
  if (minutos >= 555 && minutos <= 600){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(200);
      tira.setPixelColor(i, 255, 255, 255);        
      tira.show();
    }
  }    

    //Medio día 10:00h    
  if (minutos >= 600 && minutos <= 1260){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      tira.setPixelColor(i, 255, 255, 255);
      tira.show();
    }
  }



    //Atardecer 21:00h                                     
  if (minutos >= 1260 && minutos <= 1365){
    tira.setBrightness(255);
    tira.setPixelColor(0, 255, 255, 255);
    tira.show();
  }
      //Atardecer 21:05h
  if (minutos >= 1265 && minutos <= 1365){
    tira.setBrightness(255);
    tira.setPixelColor(1, 0, 0, 255);
    tira.show();
  }
      //Atardecer 21:10h
  if (minutos >= 1270 && minutos <= 1380){
    tira.setBrightness(255);
    tira.setPixelColor(2, 0, 0, 255); 
    tira.show();
  }
      //Atardecer 21:15h
  if (minutos >= 1275 && minutos <= 1380){
    tira.setBrightness(255);
    tira.setPixelColor(3, 0, 0, 255);
    tira.show();
  }
      //Atardecer 21:20h
  if (minutos >= 1280 && minutos <= 1395){
    tira.setBrightness(255);
    tira.setPixelColor(4, 0, 0, 255);  
    tira.show();
  }
      //Atardecer 21:25h
  if (minutos >= 1285 && minutos <= 1395){
    tira.setBrightness(255);
    tira.setPixelColor(5, 0, 0, 255);
    tira.show();
  }
      //Atardecer 21:30h
  if (minutos >= 1290 && minutos <= 1410){
   tira.setBrightness(255);
   tira.setPixelColor(6, 0, 0, 255);
   tira.show();
  }
      //Atardecer 21:35h
  if (minutos >= 1295 && minutos <= 1410){
   tira.setBrightness(255);
   tira.setPixelColor(7, 255, 255, 255);
   tira.show();
  }



    //Apagado 22:45h
  if (minutos >= 1365 && minutos <= 1410){
    for (int i = 0; i < 2; i++) {
      tira.setBrightness(128);
      tira.setPixelColor(i, 0, 0, 0);
      tira.show();
    }
  }
  
    //Apagado 23:00h
  if (minutos >= 1380 && minutos <= 1410){
    for (int i = 0; i < 4; i++) {
      tira.setBrightness(85);
      tira.setPixelColor(i, 0, 0, 0);
      tira.show();
    }
  }

   //Apagado 23:15h
  if (minutos >= 1405 && minutos <= 1410){
    for (int i = 0; i < 6; i++) {
      tira.setBrightness(42);
      tira.setPixelColor(i, 0, 0, 0);
      tira.show();
    }
  }
  
   //Apagado 23:30h
  if (minutos == 1410){ 
    tira.clear(); 
  } 
}

lastMinute = m;  
}

krnlpanic: La idea era que si reinicias se pongan los leds como realmente los quieres y esto puedes hacerlo en todas las horas que solo cambiabas 1 o 2 leds cambiando en el if el numero de leds.

for (int i = 0; i < 8; i++) {
      tira.setBrightness(150);
      if (i < 4) tira.setPixelColor(i, 255, 255, 255);  //aqui se ponen los 4 primeros leds en blanco     
      else tira.setPixelColor(i, 255, 150, 0); //aqui pone el resto en naranja
      tira.show();
    }

Este es el otro ejemplo que te di

   //Burbujas ON 7:50h a 23:00
  if (minutos >= 470 && minutos <= 1380){ //aqui comprueba si se cumple el rango
    digitalWrite(rele2, HIGH);
  }
  else digitalWrite(rele2, LOW); //si no cumple lo anterior se desactiva

No funciona bien, tras 2 días, domingo y lunes, hoy he decidido poner el anterior programa que estuvo una semana funcionando bien. Como comenté antes al rededor de las 21:30h cambia a tonos blancos cuando no debería, así que dejo el anterior quitando los "tira.show" y si funciona bien tras un período de tiempo, dejare el código aquí para que lo tenga la comunidad y daré como "solucionado" el tema, si os parece bien.

Saludos cordiales, tras 3 semanas en marcha he de decir que funciona bastante bien, aun cuando el programa mueve el relé que en ocasiones se queda la pantalla bloqueada, o el mismo programa, pero aunque esto suceda el alumbrado se queda donde tiene que estar y si no, se aprieta el boton del reset y todo va donde tiene que ir, así que me quedo como esta. os dejo el programa por si alguien lo necesita o lo aprovecha.

#include                    //Del IDE.
#include       //De: https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/
#include       //Del IDE.
#include                  //Del IDE.


RTC_DS1307 rtc;
LiquidCrystal_I2C lcd (0x26, 2, 1, 0, 4, 5, 6, 7);
Adafruit_NeoPixel tira = Adafruit_NeoPixel(8, 2, NEO_GRB + NEO_KHZ800);
String daysOfTheWeek[7] = {"Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab"};
int rele1 = 3;  //FILTRO.
int rele2 = 4;  //BURBUJAS.

int minutosTotales(int h, int m){
  int por60 = 60;
  int totalMinutos;
  totalMinutos = h * 60 + m;
  return totalMinutos;
  }
int lastMinute = 0;


void setup() {
  lcd.setBacklightPin(3, POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.begin(16, 2);
  tira.begin();
  tira.show();

  pinMode(rele1, OUTPUT); 
  pinMode(rele2, OUTPUT);

  if (! rtc.begin()) {
    lcd.println("Modulo RTC no encontrado !");
    while (1);
  }   
}   




void loop() {
   char buffer[20];   
   tira.show();
   
  DateTime fecha = rtc.now();

  lcd.setCursor(0,0);
  lcd.print(daysOfTheWeek[fecha.dayOfTheWeek()]);
  lcd.setCursor(5, 0);
  sprintf (buffer, "%02d/%02d/%4d", fecha.day(), fecha.month(), fecha.year());
  lcd.print(buffer);
  lcd.setCursor(5,1);  
  sprintf(buffer, "%02d:%02d:%02d", fecha.hour(), fecha.minute(), fecha.second());
  lcd.print(buffer);

   int h = fecha.hour();
   int m = fecha.minute();
   int minutos = minutosTotales(h,m);
  if (lastMinute != m) {
//aqui va todo el código que hay ahora en el loop que solo quieras ejecutar 1 vez por minuto


    //Burbujas ON 8:20h
  if (minutos >= 500 && minutos <= 1380){
    digitalWrite(rele2, HIGH);
  } 

    //Burbujas off 20:45h
  if (minutos >= 1245 && minutos <= 1410){
    digitalWrite(rele2, LOW);
  }
    
    //Filtro ON 8:20h
  if (minutos >= 500 && minutos <= 1380){
    digitalWrite(rele1, HIGH);
  } 
    
    //Filtro off 20:45h
  if (minutos >= 1245 && minutos <= 1410){
    digitalWrite(rele1, LOW);
  }
    
  

    


    //Amanece 8:00h
  if (minutos >= 480 && minutos <= 540){
    for (int i = 0; i < 2; i++) {
      tira.setBrightness(25);
      tira.setPixelColor(i, 255, 150, 0);       
    }
  }
  
    //Amanece 8:05h
   if (minutos >= 485 && minutos <= 545){
    for (int i = 0; i < 4; i++) {
      tira.setBrightness(50);
      tira.setPixelColor(i, 255, 150, 0);        
    }
  }

    //Amanece 8:10h
  if (minutos >= 490 && minutos <= 550){
    for (int i = 0; i < 6; i++) {
      tira.setBrightness(75);
      tira.setPixelColor(i, 255, 150, 0);        
    }
  }

    //Amanece 8:15h
  if (minutos >= 495 && minutos <= 555){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(100);
      tira.setPixelColor(i, 255, 150, 0);        
    }
  }

    //Medio día 9:00h
  if (minutos >= 540 && minutos <= 600){
    for (int i = 0; i < 2; i++) {
      tira.setBrightness(125);
      tira.setPixelColor(i, 255, 255, 255);        
    }
  }

    //Medio día 9:05h
  if (minutos >= 545 && minutos <= 600){
    for (int i = 0; i < 4; i++) {
      tira.setBrightness(150);
      tira.setPixelColor(i, 255, 255, 255);        
    }
  }
   
    //Medio día 9:10h
  if (minutos >= 550 && minutos <= 600){
    for (int i = 0; i < 6; i++) {
      tira.setBrightness(175);
      tira.setPixelColor(i, 255, 255, 255);        
    }
  }

    //Medio día 9:15h
  if (minutos >= 555 && minutos <= 600){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(200);
      tira.setPixelColor(i, 255, 255, 255);        
    }
  }    

    //Medio día 10:00h    
  if (minutos >= 600 && minutos <= 1260){
    for (int i = 0; i < 8; i++) {
      tira.setBrightness(255);
      tira.setPixelColor(i, 255, 255, 255);
    }
  }



    //Atardecer 21:00h                                     
  if (minutos >= 1260 && minutos <= 1365){
    tira.setBrightness(255);
    tira.setPixelColor(0, 255, 255, 255);
  }
      //Atardecer 21:05h
  if (minutos >= 1265 && minutos <= 1365){
    tira.setBrightness(255);
    tira.setPixelColor(1, 0, 0, 255);
  }
      //Atardecer 21:10h
  if (minutos >= 1270 && minutos <= 1380){
    tira.setBrightness(255);
    tira.setPixelColor(2, 0, 0, 255); 
  }
      //Atardecer 21:15h
  if (minutos >= 1275 && minutos <= 1380){
    tira.setBrightness(255);
    tira.setPixelColor(3, 0, 0, 255);
  }
      //Atardecer 21:20h
  if (minutos >= 1280 && minutos <= 1395){
    tira.setBrightness(255);
    tira.setPixelColor(4, 0, 0, 255);  
  }
      //Atardecer 21:25h
  if (minutos >= 1285 && minutos <= 1395){
    tira.setBrightness(255);
    tira.setPixelColor(5, 0, 0, 255);
  }
      //Atardecer 21:30h
  if (minutos >= 1290 && minutos <= 1410){
   tira.setBrightness(255);
   tira.setPixelColor(6, 0, 0, 255);
  }
      //Atardecer 21:35h
  if (minutos >= 1295 && minutos <= 1410){
   tira.setBrightness(255);
   tira.setPixelColor(7, 255, 255, 255);
  }



    //Apagado 22:45h
  if (minutos >= 1365 && minutos <= 1410){
    for (int i = 0; i < 2; i++) {
      tira.setBrightness(128);
      tira.setPixelColor(i, 0, 0, 0);
    }
  }
  
    //Apagado 23:00h
  if (minutos >= 1380 && minutos <= 1410){
    for (int i = 0; i < 4; i++) {
      tira.setBrightness(85);
      tira.setPixelColor(i, 0, 0, 0);
    }
  }

   //Apagado 23:15h
  if (minutos >= 1405 && minutos <= 1410){
    for (int i = 0; i < 6; i++) {
      tira.setBrightness(42);
      tira.setPixelColor(i, 0, 0, 0);
    }
  }
  
   //Apagado 23:30h
  if (minutos == 1410){ 
    tira.clear(); 
  } 
}

lastMinute = m;  
}

Gracias y saludos cordiales.