Go Down

Topic: [SOLUCIONADO] El Loop no lee lineas anteriores después de quitar tensión (Read 2483 times) previous topic - next topic

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.

Code: [Select]
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
Code: [Select]

   //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

pykynyky

A ver asi??

Code: [Select]


#include <Wire.h>                   //Del IDE.
#include <LiquidCrystal_I2C.h>      //De: https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/
#include <Adafruit_NeoPixel.h>      //Del IDE.
#include <RTClib.h>                 //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?


Code: [Select]

 //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.

krnlpanic

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

Ya te funciona bien la iluminación tras reset?

pykynyky

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:

Code: [Select]

   //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.

pykynyky

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.

krnlpanic

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.

pykynyky

"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

pykynyky

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.

pykynyky

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.

Code: [Select]


/* 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; 
}     

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:

Code: [Select]

    //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:

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



pykynyky

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

pykynyky

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:

Code: [Select]

    //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:

Code: [Select]
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:

Code: [Select]

/*
 * 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 <Wire.h>                   //Del IDE.
#include <LiquidCrystal_I2C.h>      //De: https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/
#include <Adafruit_NeoPixel.h>      //Del IDE.
#include <RTClib.h>                 //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; 
}     



pykynyky

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.

Code: [Select]
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
Code: [Select]

   //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.

pykynyky

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.

Code: [Select]

#include <Wire.h>                   //Del IDE.
#include <LiquidCrystal_I2C.h>      //De: https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/
#include <Adafruit_NeoPixel.h>      //Del IDE.
#include <RTClib.h>                 //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.

Go Up