Reloj binario con adafruit_neopixel

Buenas, soy novato en arduino y estoy realizando un reloj binario con leds RGB, el proyecto consiste en programar una linea de leds con una entrada digital, alimentación 5V y GND.
Para ello estoy usando la librería adafruit_neopixel y aunque el reloj me realiza la secuencia de forma correcta cuando llega a 23:59:59 debería de detenerse en 24:00:00 pero sin embargo continua contando, hice funciones para corregir varios problemas que me fueron surgiendo como el que se saltase el 0 cuando pasaba de 9 a 10 y que cuando llegase al primer minuto si apareciese el 0, no se si me explico de forma correcta, igualmente dejo por aqui el codigo que aviso es bastante tocho porque aun no tengo mucha idea solo llevo 3 dias pero he procurado explicarme lo mejor posible y he recalcado el error con letra mayuscula o donde pienso que debe encontrarse :confused:
Gracias por la ayuda que me podais dar.

#include <Adafruit_NeoPixel.h>

#define pixel_pin 6 //Pin al que he conectado la tira de leds
#define pixel_count 25// numero de leds usados
Adafruit_NeoPixel strip= Adafruit_NeoPixel (25, 6, NEO_GRB + NEO_KHZ800); //declaracion necesaria no se muy bien porque :s
int time = 1000; //Tiempo para los segundos
void setup()
{
  strip.begin();//necesarios para poder comenzar no se muy bien por que.
  strip.show();//muestra la anterior linea.
  strip.setPixelColor(0,255,255,255);//para comenzar con los leds en blanco, primer digito representa el nº del led y las siguientes cifras el color en R G y B
  strip.setPixelColor(1,255,255,255);
  strip.setPixelColor(2,255,255,255);
  strip.setPixelColor(3,255,255,255);
  strip.setPixelColor(5,255,255,255);
  strip.setPixelColor(6,255,255,255);
  strip.setPixelColor(7,255,255,255);
  strip.setPixelColor(9,255,255,255);
  strip.setPixelColor(10,255,255,255);
  strip.setPixelColor(11,255,255,255);
  strip.setPixelColor(12,255,255,255);
  strip.setPixelColor(14,255,255,255);
  strip.setPixelColor(15,255,255,255);
  strip.setPixelColor(16,255,255,255);
  strip.setPixelColor(18,255,255,255);
  strip.setPixelColor(19,255,255,255);
  strip.setPixelColor(20,255,255,255);
  strip.setPixelColor(21,255,255,255);
  strip.setPixelColor(23,255,255,255);
  strip.setPixelColor(24,255,255,255);
  strip.begin();
  strip.show();
}

void loop()
{
  
//SECONDS; Aqui es donde he ordenado todas las funciones creadas mas abajo      
 milsegundos();
 segundos();
//MINUTES
 milminutos();
 minutos();
//HOURS
 milhora();
 horas();
 strip.begin();
 strip.show();
}
 

void milsegundos(){
 strip.setPixelColor(0,255,255,255);//0000--->He colocado la configuracion en binaria para cada led, y para que realice el cambio por segundo como se observa en cada linea el valor que toma
 strip.setPixelColor(1,255,255,255);
 strip.setPixelColor(2,255,255,255);
 strip.setPixelColor(3,255,255,255);
 strip.show();
 delay(time);
 strip.setPixelColor(0,100,0,0);//0001
 strip.setPixelColor(1,255,255,255);
 strip.setPixelColor(2,255,255,255);
 strip.setPixelColor(3,255,255,255);
 strip.show();
 delay(time);
 strip.setPixelColor(0,255,255,255);//0010
 strip.setPixelColor(1,100,0,0);
 strip.setPixelColor(2,255,255,255);
 strip.setPixelColor(3,255,255,255);
 strip.show();
 delay(time);
 strip.setPixelColor(0,100,0,0);//0011
 strip.setPixelColor(1,100,0,0);
 strip.setPixelColor(2,255,255,255);
 strip.setPixelColor(3,255,255,255);
 strip.show();
 delay(time);
 strip.setPixelColor(0,255,255,255);//0100
 strip.setPixelColor(1,255,255,255);
 strip.setPixelColor(2,100,0,0);
 strip.setPixelColor(3,255,255,255);
 strip.show();
 delay(time);
 strip.setPixelColor(0,100,0,0);//0101
 strip.setPixelColor(1,255,255,255);
 strip.setPixelColor(2,100,0,0);
 strip.setPixelColor(3,255,255,255);
 strip.show();
 delay(time);
 strip.setPixelColor(0,255,255,255);//0110
 strip.setPixelColor(1,100,0,0);
 strip.setPixelColor(2,100,0,0);
 strip.setPixelColor(3,255,255,255);
 strip.show();
 delay(time);
 strip.setPixelColor(0,100,0,0);//0111
 strip.setPixelColor(1,100,0,0);
 strip.setPixelColor(2,100,0,0);
 strip.setPixelColor(3,255,255,255);
 strip.show();
 delay(time);
 strip.setPixelColor(0,255,255,255);//1000
 strip.setPixelColor(1,255,255,255);
 strip.setPixelColor(2,255,255,255);
 strip.setPixelColor(3,100,0,0);
 strip.show();
 delay(time);
 strip.setPixelColor(0,100,0,0);//1001
 strip.setPixelColor(1,255,255,255);
 strip.setPixelColor(2,255,255,255);
 strip.setPixelColor(3,100,0,0);
 strip.show();
 delay(time);
}

void segundos()
{
 strip.setPixelColor(5,100,0,0);//001--> este digito representaria si por ejemplo fuesen 36 segundos el digito 3 siendo 
 strip.setPixelColor(6,255,255,255);//desde 0 a 5 y llamando entre cada cambio a que realice la funcion anterior
 strip.setPixelColor(7,255,255,255); 
 strip.show();
 milsegundos();
 strip.setPixelColor(5,255,255,255);//010
 strip.setPixelColor(6,100,0,0);
 strip.setPixelColor(7,255,255,255); 
 strip.show();
 milsegundos();
 strip.setPixelColor(5,100,0,0);//011
 strip.setPixelColor(6,100,0,0);
 strip.setPixelColor(7,255,255,255); 
 strip.show();
 milsegundos();
 strip.setPixelColor(5,255,255,255);//100
 strip.setPixelColor(6,255,255,255);
 strip.setPixelColor(7,100,0,0); 
 strip.show();
 milsegundos();
 strip.setPixelColor(5,100,0,0);//101
 strip.setPixelColor(6,255,255,255);
 strip.setPixelColor(7,100,0,0); 
 strip.show();
 milsegundos();
}

He aqui el resto del codigo que no me dejaba ponerlo por exceso de caracteres u.u

void milminutos()
{
strip.setPixelColor(9,0,100,0);//0001-->aqui me surgio en problema de que debia mostrar el 0 que habia obviado en la funcion anterior,
strip.setPixelColor(10,255,255,255);//por lo que cree otra funcion "ceroseg" para que me contase el 0 y continuase con la funcion anterior para cada digito.
strip.setPixelColor(11,255,255,255);
strip.setPixelColor(12,255,255,255);
strip.show();
ceroseg();
segundos();
strip.setPixelColor(9,255,255,255);//0010
strip.setPixelColor(10,0,100,0);
strip.setPixelColor(11,255,255,255);
strip.setPixelColor(12,255,255,255);
strip.show();
ceroseg();
segundos();
strip.setPixelColor(9,0,100,0);//0011
strip.setPixelColor(10,0,100,0);
strip.setPixelColor(11,255,255,255);
strip.setPixelColor(12,255,255,255);
strip.show();
ceroseg();
segundos();
strip.setPixelColor(9,255,255,255);//0100
strip.setPixelColor(10,255,255,255);
strip.setPixelColor(11,0,100,0);
strip.setPixelColor(12,255,255,255);
strip.show();
ceroseg();
segundos();
strip.setPixelColor(9,0,100,0);//0101
strip.setPixelColor(10,255,255,255);
strip.setPixelColor(11,0,100,0);
strip.setPixelColor(12,255,255,255);
strip.show();
ceroseg();
segundos();
strip.setPixelColor(9,255,255,255);//0110
strip.setPixelColor(10,0,100,0);
strip.setPixelColor(11,0,100,0);
strip.setPixelColor(12,255,255,255);
strip.show();
ceroseg();
segundos();
strip.setPixelColor(9,0,100,0);//0111
strip.setPixelColor(10,0,100,0);
strip.setPixelColor(11,0,100,0);
strip.setPixelColor(12,255,255,255);
strip.show(); 
ceroseg();
segundos();
strip.setPixelColor(9,255,255,255);//1000
strip.setPixelColor(10,255,255,255);
strip.setPixelColor(11,255,255,255);
strip.setPixelColor(12,0,100,0);
strip.show();
ceroseg();
segundos();
strip.setPixelColor(9,0,100,0);//1001
strip.setPixelColor(10,255,255,255);
strip.setPixelColor(11,255,255,255);
strip.setPixelColor(12,0,100,0);
strip.show();
ceroseg();
segundos();
}
void minutos()
{
strip.setPixelColor(14,0,100,0);//001->aqui como el anterior tuve que crear el ceromilmin para que me contase el 0y la anterior funcion.
strip.setPixelColor(15,255,255,255);
strip.setPixelColor(16,255,255,255); 
strip.show();
ceromilmin();
milminutos();
strip.setPixelColor(14,255,255,255);//010
strip.setPixelColor(15,0,100,0);
strip.setPixelColor(16,255,255,255); 
strip.show();
ceromilmin();
milminutos();
strip.setPixelColor(14,0,100,0);//011
strip.setPixelColor(15,0,100,0);
strip.setPixelColor(16,255,255,255); 
strip.show();
ceromilmin();
milminutos();
strip.setPixelColor(14,255,255,255);//100
strip.setPixelColor(15,255,255,255);
strip.setPixelColor(16,0,100,0); 
strip.show();
ceromilmin();
milminutos();
strip.setPixelColor(14,0,100,0);//101
strip.setPixelColor(15,255,255,255);
strip.setPixelColor(16,0,100,0); 
strip.show();
ceromilmin();
milminutos();         
}
void milhora()
{
strip.setPixelColor(18,255,255,0);//0001-->aqui exactamente como en el anterior
strip.setPixelColor(19,255,255,255);
strip.setPixelColor(20,255,255,255);
strip.setPixelColor(21,255,255,255);
strip.show();
ceromin ();
minutos();
strip.setPixelColor(18,255,255,255);//0010
strip.setPixelColor(19,255,255,0);
strip.setPixelColor(20,255,255,255);
strip.setPixelColor(21,255,255,255);
strip.show();
ceromin ();
minutos();
strip.setPixelColor(18,255,255,0);//0011
strip.setPixelColor(19,255,255,0);
strip.setPixelColor(20,255,255,255);
strip.setPixelColor(21,255,255,255);
strip.show();
ceromin ();
minutos();
strip.setPixelColor(18,255,255,255);//0100
strip.setPixelColor(19,255,255,255);
strip.setPixelColor(20,255,255,0);
strip.setPixelColor(21,255,255,255);
strip.show();
ceromin ();
minutos();
strip.setPixelColor(18,255,255,0);//0101
strip.setPixelColor(19,255,255,255);
strip.setPixelColor(20,255,255,0);
strip.setPixelColor(21,255,255,255);
strip.show();
ceromin ();
minutos();
strip.setPixelColor(18,255,255,255);//0110
strip.setPixelColor(19,255,255,0);
strip.setPixelColor(20,255,255,0);
strip.setPixelColor(21,255,255,255);
strip.show();
ceromin ();
minutos();
strip.setPixelColor(18,255,255,0);//0111
strip.setPixelColor(19,255,255,0);
strip.setPixelColor(20,255,255,0);
strip.setPixelColor(21,255,255,255);
strip.show();
ceromin ();
minutos();
strip.setPixelColor(18,255,255,255);//1000
strip.setPixelColor(19,255,255,255);
strip.setPixelColor(20,255,255,255);
strip.setPixelColor(21,255,255,0);
strip.show();
ceromin ();
minutos();
strip.setPixelColor(18,255,255,0);//1001
strip.setPixelColor(19,255,255,255);
strip.setPixelColor(20,255,255,255);
strip.setPixelColor(21,255,255,0);
strip.show();
ceromin ();
minutos();
}

void horas()
{
strip.setPixelColor(23,255,255,0);//01-->AQUI ES DONDE SE PRODUCE EL ERROR!!! :(, deberia realizar el conteo desde la hora 10 hasta 19 y despues desde 20 hasta 24
strip.setPixelColor(24,255,255,255);//por eso cree dos funciones, "milhora" para que hiciese hasta el 9 y "milhora2" para que hiciese hasta 24 pero parece que prefiere seguir hasta 29 :(
strip.show();
ceromilhor();
milhora();
strip.setPixelColor(23,255,255,255);//10
strip.setPixelColor(24,255,255,0);
strip.show();
ceromilhor();
milhora2();
}
void ceroseg ()
{
strip.setPixelColor(5,255,255,255);//000
strip.setPixelColor(6,255,255,255);
strip.setPixelColor(7,255,255,255); 
strip.show();
milsegundos();
}
void ceromilmin ()
{
strip.setPixelColor(9,255,255,255);//0000
strip.setPixelColor(10,255,255,255);
strip.setPixelColor(11,255,255,255);
strip.setPixelColor(12,255,255,255);
strip.show();
ceroseg();
segundos();
}
void ceromin ()
{
strip.setPixelColor(14,255,255,255);//000
strip.setPixelColor(15,255,255,255);
strip.setPixelColor(16,255,255,255); 
strip.show();
ceromilmin();
milminutos();
}
void ceromilhor()
{
strip.setPixelColor(18,255,255,255);//000
strip.setPixelColor(19,255,255,255);
strip.setPixelColor(20,255,255,255);
strip.setPixelColor(21,255,255,255);
strip.show();
ceromin ();
minutos();
}
void milhora2()
{
strip.setPixelColor(18,255,255,0);//0001
strip.setPixelColor(19,255,255,255);
strip.setPixelColor(20,255,255,255);
strip.setPixelColor(21,255,255,255);
strip.show();
ceromin ();
minutos();
strip.setPixelColor(18,255,255,255);//0010
strip.setPixelColor(19,255,255,0);
strip.setPixelColor(20,255,255,255);
strip.setPixelColor(21,255,255,255);
strip.show();
ceromin ();
minutos();
strip.setPixelColor(18,255,255,0);//0011
strip.setPixelColor(19,255,255,0);
strip.setPixelColor(20,255,255,255);
strip.setPixelColor(21,255,255,255);
strip.show();
ceromin ();
minutos();
strip.setPixelColor(18,255,255,255);//0100
strip.setPixelColor(19,255,255,255);
strip.setPixelColor(20,255,255,0);
strip.setPixelColor(21,255,255,255);
strip.show();
ceromin ();
minutos();
}

Porque las rutinas se anidan, se llaman unas a otras repetidamente?

Porque no explicas un poco el hardware, no entiendo como funciona?
Entiendo lo que es un neopixel pero hablas de un reloj de modo que estan montadas como segmentos?

Buenas Surbyte, a ver explico un poco mas en que consiste, la siguiente imagen que adjunto es el concepto del reloj, y el código lo que realiza en si es programar los leds de tal forma que son 20 leds conectados en serie y en la programación yo indico de los 20 leds en el orden de 0 siendo este el primer led y 19 el ultimo, aunque hice un salto entre cada grupo de bits que representaban cada dígito en la hora, es decir, 1 9: 4 5: 2 3, no se si me explico seria visto en los leds encontrándose en la izquierda la hora y derecha segundos como arriba así;

00x0000x000x0000x000x0000 las x serian leds que no han sido usados, por eso en la designación mi numeracion alcanza hasta el led 24.

Y en cuanto a rutinas que se anidan me gustaría poder entender que significa porque estoy empezando ahora y aun no controlo muy bien jaja si fuese posible me podrías indicar donde se encuentra el error y como pudistes saberlo? me gustaría poder alcanzar esas conclusiones por mi mismo, gracias de antemano!!

Consejo: intenta capturar un video para que se entienda mejor la idea.. y luego traduce que tira o que leds hacen que... y cuales hacen otra cosa.

O si tienes algun link que sirva de ejemplo para entender la idea?

Si posteas por favorrrrrrrrrrr, usa etiquetas, si no sabes Lee las normas del foro. El código lo posteaste perfecto... pero imagenes y enlaces tmb van con etiquetas.

Buenas, adjunto estas imagenes para que se comprenda un poco mejor de que trata el proyecto y que espero que resulte de ayuda; en cuanto al fallo he leido vuestras respuestas pero no entiendo porque se encuentra ahi el fallo, es decir, como pienso que funciona la lectura de mi sketch es que realizara primero el void setup() solo una vez cuando se ejecute y tras esto quedara en bucle el void loop()

lo siguiente que expreso primero son los segundos(milsegundos) los cuales iran de 0-9, tras esto las decimas de segundos (10-59), los milminutos corresponderan igual que milsegundos para 0-9 aunque en este caso debemos implementar el 00 de los segundos por eso se hace una llamada a ceroseg, y tras esto una llamada a segundos de esta forma ira desde 0:00-9:59.

Estos paso los repeti para los minutos pero con milminutos, con milhoras hice lo mismo pero con minutos y con horas hice milhoras para 10:00:00 hasta 19:59:59 y que cuando alcanzase los 20:00:00 solo alcance hasta 23:59:59 (acabo de eliminar el digito 0100 de milhoras2 ya que el numero 4 no debe aparecer.

Moderador: Imagenes editadas con etiquetas para su visualización.

Buenas de nuevo, decir que ya conseguí que hiciese desde 00:00:00 hasta 23:59:59 y que reiniciase; solo hice que cuando leyese la ultima linea del void loop() hiciese que todos los leds reseteasen en color blanco ya que cuando finalizaba volvía a empezar pero dejaba los leds de las horas minutos y segundos encendidas lo cual era un problema.

Ahora el siguiente paso que me propongo hacer es conseguir con dos pulsadores poder configurar segundos, minutos y horas, el problema es que no se si con mi sketch podre lograrlo ya que lo que pienso que he realizado es un cronometro y no se como puedo hacer para que empiece a contar desde un punto determinado; si alguien pudiese echarme una mano seria de mucha ayuda ya que como dije anteriormente soy totalmente novato en programacion y aun no consigo ser capaz de deducir como alcanzar lo que quiero;

En principio mi idea es poseer un pulsador para realizar el cambio del dígito en cuestión para ponerlo en la hora exacta y otro pulsador para validar el cambio y que continue por la hora impuesta.

Siento no ser tan claro como me gustaria, intentare aclarar aquello que no se entienda muy bien lo maximo posible.

Gracias de antemano.

Ahora te he comprendido y ya entiendo porque dentro de ciertas rutinas llamas a otra y no es que esten anidadas sino que se trata de una secuencia serie que se completa con los otros llamados.

Antes de que te sugiera algo y me ponga en la tarea, veo que eliminaste decimas, centesimas y milisegundos.

Ahora si yo realmente entendí la presentación de todo esto es en forma binaria (perdona, lo dice el titulo y yo buscaba una representación de segumentos en un display gigante que no existía).

Si tu reloj es binario, quien lo entiende o es con fines didácticos?

Buenas, así es se trata de un reloj binario y debe ser así porque es como me lo impuso el tutor, tras darle vueltas al tema de los pulsadores para programarlo me di cuenta que resultaría muy complicado aplicarlo asi que busque y adapte un programa que ya venia hecho pero que me parece mas practico, lo que ocurre que no se como hacer para que el arduino introduzca los pulsos para que realice el conteo.
Espero que este codigo sea mas facil de entender en caso contrario intentare aclarar lo que pueda.

#include <Adafruit_NeoPixel.h>
#define pixel_pin 6
#define pixel_count 20
Adafruit_NeoPixel strip= Adafruit_NeoPixel (20, 6, NEO_GRB + NEO_KHZ800);

int second;
int minute;
int hour;

void setup() 
{
   strip.begin();
   strip.show();
   test();
}

void loop()
{
 if (hour == 0)
 {
  hour = 24;
 }

  int hourUnit = hour % 10;
  int minuteUnit = minute % 10;
  int secondUnit = second % 10;
//SECONDS 0-9 (0000/1001)
  if(secondUnit == 1 || secondUnit == 3 || secondUnit == 5 || secondUnit == 7 || secondUnit == 9)
  {
    strip.setPixelColor(0,0,255,0);
    strip.show();
  }
  else
  {
    strip.setPixelColor(0,255,255,255);
    strip.show();
  }

  if(secondUnit == 2 || secondUnit == 3 || secondUnit == 6 || secondUnit == 7)
  {
    strip.setPixelColor(1,0,255,0);
    strip.show();
  }
  else
  {
    strip.setPixelColor(1,255,255,255);
    strip.show();
  }

  if(secondUnit == 4 || secondUnit == 5 || secondUnit == 6 || secondUnit == 7)
  {
    strip.setPixelColor(2,0,255,0);
    strip.show();
  }
  else
  {
    strip.setPixelColor(2,255,255,255);
    strip.show();
  }

  if(secondUnit == 8 || secondUnit == 9)
  {
    strip.setPixelColor(3,0,255,0);
    strip.show();
  }
  else
  {
    strip.setPixelColor(3,255,255,255);
    strip.show();
  }
//SECONDS 10-50 (000/101)

 if((second >= 10 && second < 20) || (second >= 30 && second < 40) || (second >= 50 && second < 60))
  {
    strip.setPixelColor(6,0,255,0);
    strip.show();
  }
  else
  {
    strip.setPixelColor(6,255,255,255);
    strip.show();
  }

  if(second >= 20 && second < 40)
  {
    strip.setPixelColor(5,0,255,0);
    strip.show();
  }
  else
  {
    strip.setPixelColor(5,255,255,255);
    strip.show();
  }

  if(second >= 40 && second < 60)
  {
    strip.setPixelColor(4,0,255,0);
    strip.show();
  }
  else
  {
    strip.setPixelColor(4,0,255,0);
    strip.show();

  }
 
 // MINUTE 0-9 (0000/1001)
 
 if(minuteUnit == 1 || minuteUnit == 3 || minuteUnit == 5 || minuteUnit == 7 || minuteUnit == 9)
  {
    strip.setPixelColor(7,255,255,0);
    strip.show();
  }
  else
  {
    strip.setPixelColor(7,255,255,255);
    strip.show();
  }

  if(minuteUnit == 2 || minuteUnit == 3 || minuteUnit == 6 || minuteUnit == 7)
  {
    strip.setPixelColor(8,255,255,0);
    strip.show();
  }
  else
  {
    strip.setPixelColor(8,255,255,255);
    strip.show();
  }

  if(minuteUnit == 4 || minuteUnit == 5 || minuteUnit == 6 || minuteUnit == 7)
  {
    strip.setPixelColor(9,255,255,0);
    strip.show();
  }
  else
  {
    strip.setPixelColor(9,255,255,255);
    strip.show();
  }

  if(minuteUnit == 8 || minuteUnit == 9)
  {
    strip.setPixelColor(10,255,255,0);
    strip.show();
  }
  else
  {
    strip.setPixelColor(10,255,255,255);
    strip.show();
  }

// MINUTE 10-50 (000-101)

if((minute >= 10 && minute < 20) || (minute >= 30 && minute < 40) || (minute >= 50 && minute < 60))
  {
    strip.setPixelColor(13,255,255,0);
    strip.show();
  }
  else
  {
    strip.setPixelColor(13,255,255,255);
    strip.show();
  }

  if(minute >= 20 && minute < 40)
  {
    strip.setPixelColor(12,255,255,0);
    strip.show();
  }
  else
  {
    strip.setPixelColor(12,255,255,255);
    strip.show();
  }

  if(minute >= 40 && minute < 60)
  {
    strip.setPixelColor(11,255,255,0);
    strip.show();
  }
  else
  {
    strip.setPixelColor(11,255,255,255);
    strip.show();
  }

//HOURS 0-9 (0000-1001)
if(hourUnit == 1 || hourUnit == 3 || hourUnit == 5 || hourUnit == 7 || hourUnit == 9)
  {
    strip.setPixelColor(14,255,0,255);
    strip.show();
  }
  else
  {
    strip.setPixelColor(14,255,255,255);
    strip.show();
  }

  if(hourUnit == 2 || hourUnit == 3 || hourUnit == 6 || hourUnit == 7)
  {
    strip.setPixelColor(15,255,0,255);
    strip.show();
  }
  else
  {
    strip.setPixelColor(15,255,255,255);
    strip.show();
  }

  if(hourUnit == 4 || hourUnit == 5 || hourUnit == 6 || hourUnit == 7)
  {
    strip.setPixelColor(16,255,0,255);
    strip.show();
  }
  else
  {
    strip.setPixelColor(16,255,255,255);
    strip.show();
  }

  if(hourUnit == 8 || hourUnit == 9)
  {
    strip.setPixelColor(17,255,0,255);
    strip.show();
  }
  else
  {
    strip.setPixelColor(17,255,255,255);
    strip.show();
  }
//HOURS 10-20 (00-10)

if(hour >= 10 && hour < 20)
  {
    strip.setPixelColor(19,255,0,255);
    strip.show();
  }
  else
  {
    strip.setPixelColor(19,255,255,255);
    strip.show();
  }

  if(hour >= 20 && hour <= 24)
  {
    strip.setPixelColor(18,255,0,255);
    strip.show();
  }
  else
  {
    strip.setPixelColor(18,255,255,255);
    strip.show();
  }

  if (second >= 60)
  {
    minute++;
    second = 0;
  }
  else
  {
    second++;
  }

  if(minute >= 60)
  {
    hour++;
    minute = 0;
  }
  else
  {
    minute++;
  }

  if(hour >= 24)
  {
    hour = 1;
  }
  else
  {
    hour++;
  }
  delay(250);
}
void test()
{
  strip.setPixelColor(0,255,255,255);
  strip.setPixelColor(1,255,255,255);
  strip.setPixelColor(2,255,255,255);
  strip.setPixelColor(3,255,255,255);
  strip.setPixelColor(4,255,255,255);
  strip.setPixelColor(5,255,255,255);
  strip.setPixelColor(6,255,255,255);
  strip.setPixelColor(7,255,255,255);
  strip.setPixelColor(8,255,255,255);
  strip.setPixelColor(9,255,255,255);
  strip.setPixelColor(10,255,255,255);
  strip.setPixelColor(11,255,255,255);
  strip.setPixelColor(12,255,255,255);
  strip.setPixelColor(13,255,255,255);
  strip.setPixelColor(14,255,255,255);
  strip.setPixelColor(15,255,255,255);
  strip.setPixelColor(16,255,255,255);
  strip.setPixelColor(17,255,255,255);
  strip.setPixelColor(18,255,255,255);
  strip.setPixelColor(19,255,255,255);
  strip.setPixelColor(20,255,255,255);
  strip.show(); 
}

Surbyte lei las normas del foro y me gustaria que me aclarases que hago exactamente mal cuando hago mi post para evitarlo, gracias de antemano!!.

Hola pabloc58, como me interesó el proyecto esto es lo que he hecho.

Miralo bien yme consultas. COmpilar compila pero obviamente no tengo el strip de 24 leds para probarlo asi que te lo dejo a ti.

#include <TimeLib.h>
#include <Adafruit_NeoPixel.h>
#include <string.h>

#define pixel_pin   6 //Pin al que he conectado la tira de leds
#define pixel_count 25// numero de leds usados
Adafruit_NeoPixel strip = Adafruit_NeoPixel (25, 6, NEO_GRB + NEO_KHZ800); //declaracion necesaria no se muy bien porque :s

int time = 1000; //Tiempo para los segundos


#define TIME_HEADER  "T"   // Header tag for serial time sync message
#define TIME_REQUEST  7    // ASCII bell character requests a time sync message 

void hora_to_binario(byte hora, byte min, byte seg);
char *byte_to_binary(byte x);
void digitalClockDisplay();

void setup() {
  Serial.begin(115200);
  while (!Serial) ; // wait until Arduino Serial Monitor opens

  // Ajustar al hora manualmente y luego comentarlo siempre y cuando no se apague el arduino.
  setTime(20, 42, 00, 17, 04, 2018);
 
  if(timeStatus()!= timeSet) 
     Serial.println("Unable to sync Time");
  else
     Serial.println("System time Set");      

  strip.begin();//necesarios para poder comenzar no se muy bien por que.
  strip.show();//muestra la anterior linea.
  strip.setPixelColor(0,255,255,255);//para comenzar con los leds en blanco, primer digito representa el nº del led y las siguientes cifras el color en R G y B
  strip.setPixelColor(1,255,255,255);
  strip.setPixelColor(2,255,255,255);
  strip.setPixelColor(3,255,255,255);
  strip.setPixelColor(5,255,255,255);
  strip.setPixelColor(6,255,255,255);
  strip.setPixelColor(7,255,255,255);
  strip.setPixelColor(9,255,255,255);
  strip.setPixelColor(10,255,255,255);
  strip.setPixelColor(11,255,255,255);
  strip.setPixelColor(12,255,255,255);
  strip.setPixelColor(14,255,255,255);
  strip.setPixelColor(15,255,255,255);
  strip.setPixelColor(16,255,255,255);
  strip.setPixelColor(18,255,255,255);
  strip.setPixelColor(19,255,255,255);
  strip.setPixelColor(20,255,255,255);
  strip.setPixelColor(21,255,255,255);
  strip.setPixelColor(23,255,255,255);
  strip.setPixelColor(24,255,255,255);
  strip.show();
}

void loop() {
  
	if (timeStatus() == timeSet) {
       digitalClockDisplay();
   }
   delay(1000);
}
 
void digitalClockDisplay(){
  // digital clock display of the time
  char buffer[40];
  sprintf(buffer, "%02d:%02d:%02d", hour(), minute(), second());
  Serial.println(buffer); 
  Serial.println(byte_to_binary(hour()));
  hora_to_binario(hour(), minute(), second());
}



time_t requestSync() {
  Serial.write(TIME_REQUEST);  
  return 0; // the time will be sent later in response to serial mesg
}

void hora_to_binario(byte hora, byte min, byte seg) {
	unsigned long tmp = (unsigned long) (hora/10)<<20UL | 
						(unsigned long) (hora%10)<<16UL | 
						(unsigned long) (min/10)<<12UL | 
						(unsigned long) (min%10)<<8UL | 
						(unsigned long) (seg/10)<<4UL | 
						(unsigned long) (seg%10);
	unsigned long z;
    byte cont = 0;

	for (z = 8388608; z > 0UL; z >>= 1UL) {
        Serial.print(((tmp & z) == z)? '1' : '0');    
        if ((tmp & z) == z) 
        	strip.setPixelColor(cont,255,255,255);  // 1              
       	else
        	strip.setPixelColor(cont,100,  0,  0);  // 0
        cont++;
        
    }
    Serial.println(" ");
    strip.show();
}


char *byte_to_binary(byte x)
{

    byte x1 = x / 10;
    byte x2 = x % 10;
    x = x1 << 4 | x2;
    
     
    static char b[9];
    b[0] = '\0';

    int z;
    for (z = 128; z > 0; z >>= 1) {
            strcat(b, ((x & z) == z) ? "1" : "0");            
    }
        
    //Serial.print(b);
    //Serial.println(" ");
    return b;
}

Si abres el monitor serie verás como evoluciona la hora.
La puse con la hora fija de modo que podras corroborar como se comporta.

Tal vez haya que dar vuelta los bits para que coincidan con lo tuyo.

Ahh por cierto, el concepto es totalmente diferente al tuyo.
Yo tomo la hora del reloj que si fuera un RTC estaría en hora pero como no es importante lo fije y adelante.
Muestro la hora, convierto esa hora en nibbles en 2 BCD

Digamos que HH:MM:SS cuando lo presentas son hora:minuto:segundos supongamos 21:44:15

21 son dos digitos decimales que armo y reconstruyo en BCD por eso verás eso de
21/10 = 2
21%10 = 1 (% es módulo, o sea la division de 21 y 10 da un resto, ese resto es el que me interesa.

luego al tener 2 y 1 siguen siendo decimales y los rearmo como

2 << 4 | 1 = 21 pero ahora en BCD o binario si los vieras en bits serína

0010 0001

Bien, eso lo hice con todos pero como son 3 digitos en total son 24 bits y se me ocurrió manejarlos todos como bits y luego decidir que nevio al strip.
Bien... me encontré que si no trabajas correctamente con numeros enteros largos las cuentas dan mal y todo lo que estaba por encima de un entero fallaba
La solución fue esta

void hora_to_binario(byte hora, byte min, byte seg) {
	unsigned long tmp = (unsigned long) (hora/10)<<20 | 
						(unsigned long) (hora%10)<<16 | 
						(unsigned long) (min/10)<<12 | 
						(unsigned long) (min%10)<<8 | 
						(unsigned long) (seg/10)<<4 | 
						(unsigned long) (seg%10);

o sea cada componente debe ser un unsigned long o el compilador los tomará como enteros porque esos números a la derecha son enteros
Otra alternativa es que 20 fuera 20UL y asi.

Si no entiendes me preguntas.

bueno de ese modo logro una conversión en bits almacenados en tmp

Luego un ciclo for que va desde 2^23 hasta 0 barre por todos y cada uno de los bits y si es TRUE hace lo que corresponde y si es FALSE envia el otro strip

Muchas gracias por tu ayuda surbyte pero lo cierto es que te resultaria mas facil que un burro aprendiese a hacer el pino a que yo entendiese el programa jaja, he estado leyendolo he intentando entenderlo pero lo cierto es que en general no entiendo nada, como dije ahora mismo mis conocimientos en programacion son nulos, asi que precisare de unos dias para estudiar las librerias y comprender el programa o al menos reducir las dudas porque necesitaria de unas explicaciones muy concisas para cada linea y la verdad no creo que debas malgastar tu tiempo en ello, dicho esto me pongo manos a la obra y en cuanto lo tenga un poco mas claro volvere a escribirte, por cierto, la libreria string.h no me la reconoce y tras buscar en internet al parecer viene incluida pero no es mi caso, donde puedo conseguirla?.

Muchas gracias por tu ayuda de nuevo y siento ser tan torpe jaja.

Buenas de nuevo surbyte, se que no ha pasado suficiente tiempo como para decir que me haya dado tiempo a estudiar a fondo el código pero lo cierto es que la mayoría es como si leyese chino y me gustaría saber si seria posible que incluyeses una linea de texto explicando mas o menos las diferentes partes del programa ya que aunque tu explicacion la entendi en tus comentarios anteriores no se que es UL o tmp, asi como la forma en la que has conseguido llegar de decimal al binario;
tambien decir que ayer descompuse los leds y solde como en la siguiente foto pero teniendo en cuenta que ahora uso solo 20 leds a diferencia de los 24 anteriores ya que ahora ya no preciso del led para separar cada agrupación.

No se como aplicarle la etiqueta a la imagen para que se vea directamente en el post, es otra cosa que debo aprender jaja.
posicionleds.png

PD: tu progama funciona de perlas aunque me cuesta interpretarlo en la tira de led por lo que te acabo de comentar de la posicion; tambien me gustaria saber como hacer que los colores entre horas minutos y segundos sean diferentes; pero esto es algo que una vez haya entendido tu programa creo que podre hacer yo.

posicionleds.png

Que es UL es Unsigned Long o entero Largo
Que es tmp es una variable unsigned long que uso en la función hora_to_binario, lindo nombre spanenglish no?

Bueno bromas a parte.

Lo primero es decir que no esperaba que funcionar de primera. Jaja eso no es habitual, y no lo digo de vanidoso, sino porque soy mas de prueba error. Bueno la prueba salió bien.

Para entender como funciona esa rutina voy a explicarla una ves mas.
todo comienza con el uso de un reloj que supongo has aceptado que funciona usando millis() pero que ahora no nos interesa. Lo hace bien y ese es el punto. Se fija la hora y arranca y mantiene hh:mm:ss
Si se apaga perdemos todo, por eso de nuevo hay que fijarle la hora.
Se puede mejorar si.. claro.. RTC que le daría hora real y/o alguna rutina para actualizarlo pero hay mucho hecho y mucha librería asi que no vale la pena ahora.

Tenemos entonces 3 datos, que pueden ser enteros o bytes. Como me gusta siempre pensar en que tengo poca memoria intento siempre usar el tipo de variable que menos gasto de SRAM tenga. En este caso byte.

hour() minute() y second() me daran valores que almacenaría en 3 variables tipo byte

de hecho asi comienza la rutina

void hora_to_binario(byte hora, byte min, byte seg) {

a continuación, tenemos que armar en una variable algo que tenga cada uno de los numeros BCD en sus posiciones correctas.
imagina esta hora 18:04:27 bien, recuerda que son bytes, 3 bytes. byte1 = 18 byte2 = 04 byte3 = 27
Pero cuando los miras en forma binaria, su representación no es BCD sino binaria.
27 = 00011011 en binario pero 27 en BCD es 0010 0111
Son dos cosas diferentes.

Cómo paso 27 binario a BCD bueno tomo sus elementos uno a uno 2 y 7 y lo vuelvo a armar.

27 / 10 = 2

son divisiones enteras así que no tienen resto y justamente para obtener la unidad tienes dos caminos, usar módulo o usar una operación tal que multiplique el entero recién obtenido x 10 y todo restarlo del número original.

27-2*10= 7

Como eso implica varias operaciones matemáticas no es eficiente y lo descarto.
Por eso usamos módulo, que es una operación implementada a nivel procesador.

27%10=7

Con esto obtienes cada uno de los números BCD.

El siguiente paso es ubicarlos ordenadamente y conformar un número que lo contenga.
Serán 24 bits.. pues un enterlo largo tiene 32 bits de capacidad. Un entero tiene 16 bits.
Por comodidad puse unsigned long (sin signo).

Recordemos el ejemplo : 18:04:27 y esto expresado en BCD sería
1 8 0 4 2 7
0001 1000 0000 0100 0010 0111

Ahi tienes los 24 bits. Quiere decir que cada 4 bits tengo que hacer un desplazamiento a la izquierda de cada número.
De derecha a izquierda
7 no se desplaza
2 se desplaza 4 bits
4 se desplaza 8 bits
0 se desplaza 12 bits
8 se desplaza 16 bits
1 se desplaza 20 bits

La operación de desplazamiento a izquierda es << y la operacion de suma binaria es OR |
Asi que esto

unsigned long tmp = (unsigned long) (hora/10)<<20 | 
						(unsigned long) (hora%10)<<16 | 
						(unsigned long) (min/10)<<12 | 
						(unsigned long) (min%10)<<8 | 
						(unsigned long) (seg/10)<<4 | 
						(unsigned long) (seg%10);

He quitado los UL porque comprobé que no eran necesarios. Pero si es necesario el (typecast) o sea que la operación sea (unsigned long) de lo contrario el compilador lo hace como enteros y veras que todo lo que esta desde 16 bits en adelante no aparece. Me llevo un momento visualizarlo pero aunque entendía el error pensé que eran los números a derecha por eso le puse 20UL y luego comprobé que no era la solución.

No se si te quedan mas dudas?

Buenas de nuevo, tras tomar algunos apuntes de tu explicación 10/10 ya entiendo como haces para obtener los números y como funciona el tema del desplazamiento de los bits, me había liado un poco porque cuando lo visualizaba en los leds no me salían las cuentas pensando que habías mantenido la separación y que los que solo iban desde 0-5 se mantenian con tres leds, pero ahora ya entiendo esa parte perfectamente, ahora me gustaria si pudieses que me explicases las dos ultimas funciones que creastes, es decir

  for (z = 8388608; z > 0UL; z >>= 1UL) {
        Serial.print(((tmp & z) == z)? '1' : '0');    
        if ((tmp & z) == z) 
          strip.setPixelColor(cont,100,0,0);  // 1              
        else
          strip.setPixelColor(cont,255,255,255);  // 0
        cont++;
        
    }
    Serial.println(" ");
    strip.show();
}


char *byte_to_binary(byte x)
{

    byte x1 = x / 10;
    byte x2 = x % 10;
    x = x1 << 4 | x2;
    
     
    static char b[9];
    b[0] = '\0';

    int z;
    for (z = 128; z > 0; z >>= 1) {
            strcat(b, ((x & z) == z) ? "1" : "0");            
    }
        
    //Serial.print(b);
    //Serial.println(" ");
    return b;

Siento ser tan pesado y preguntarlo todo pero aunque intento ver que hace cada parte analizando cada linea no soy capaz de ver en conjunto que es lo que hacen, si me pudieses explicar esta parte como la anterior lo agradecería aunque entiendo que sea una pesadez por lo que cualquier explicación breve o extensa creo que me servirá de mucha ayuda.

Por cierto estoy a la espera de que llegue a la empresa donde realizo el proyecto de un RTC ya que haré por impresion 3D el soporte y creare la placa por Altium, no se si el uso de la RTC facilitaria el programa o lo complicaría mas, pero aun quedan 2 semanas para que llegue y trabajar con este programa me esta sirviendo a aprender bastante, repito que siento ser tan torpe y agradecerte de nuevo el esfuerzo que estas haciendo para ayudarme.

No se cuales son las ultimas funciones.
El ciclo for te lo expliqué
El número 8388608 = 2^23

Serial.print(((tmp & z) == z)? '1' : '0');

Esto solo es para que muestre los 1 y 0 pero puede eliminarse igualmente te lo explico
pero mejor lo hago a continuación porque decidimos el uso de uno u otro strip

(tmp & z) esto es una comparación AND
imagina que analizamos los ultimos 8 bits de los segundos y supongamos que el número es 47 o sea en BCD
Msb Lsb
0100 0111

en este caso z para poder resolver tiene que tomar valores que van desde 128 o 2^7 hasta 0
Miremos porque? los pesos binarios van desde 0 como el Menos significativo (LSB o Less significant Bit) hasta 7 el mas significativo (MSB o More significant Bit)

128 = 1000 0000
64 = 0100 0000
32 = 0010 0000
16 = 0001 0000
8 = 0000 1000
4 = 0000 0100
2 = 0000 0010
1 = 0000 0001

entonces si haces con tu número 47 = 0100 0111 un And con cada posicion veras que pasa

47 AND 128 => 0100 0111 AND 1000 0000 => es una multiplicación BIT A BIT solo quedará en 1 si HAY UN 1 en la posicion sino dará un 0
0100 0111 AND 1000 0000 = 0000 0000
ese resultado luego se consulta contra z o sea contra 1000 0000

0000 0000 = 1000 0000 NO o sea FALSE
COmo es FALSO la respuesta es strip.setPixelColor(cont,255,255,255);  // 0

el sistema baja un valor y ahora z valdra 64
si miras 47 tiene un uno en el 6 bits o sea la respuesta sera 0100 0000 = 0100 0000 que es el valor de 64 o sea VERDADERO
por ende el if al ser verdadero hace que vaya a
strip.setPixelColor(cont,100,0,0);  // 1 

Y terminado.
La función de abajo puedes borrarla no hace falta. Fue de donde extraje la idea de arriba.

Buenos dias, creo que ya me quedo claro todo el programa, hay cosas que aun me cuesta entender pero son formulas que pienso que mirando en arduino reference podre resolverlas, hice la prueba a poner el tiempo en 23:59:50 para observar como reiniciaba y cuando termina reinicia por la hora dada, no se como podre hacer para que inicie tras terminar un ciclo por 00:00:00.

Tambien me gustaría saber como funciona el RTC ya que hasta ahora se que sirve para que mi reloj se mantenga en hora, y que debería aplicar al programa para que no sea necesario indicar una hora si no que inicie con la hora del RTC.

Gracias de nuevo surbyte por tu ayuda, por ahora la persona que mas me ha apoyado en el proyecto y la que mas paciencia esta teniendo conmigo jajaja.

El foro esta lleno de buena gente.

Agregar el RTC es muy muy fácil. Es una librería y una instrucción porque lo que ya te puse solo requiere ajustarse por RTC en el arranque y ya queda.
Luego existe una instrucción que le dice al RTC cada cuanto tiempo debe hacer un chequeo entre el RTC y el reloj del sistema. Algo que para nosotros es invisible si sirve la expresión.

Si compras RTC que no sea DS1307 que sea un DS3231.

setTime() siempre va a iniciar por la hora que fijes y si lo quites todo arranca no de 0 sino desde una fecha en segundos contados desde 1 de enero de 1970 ver libreria Time

estos serían los cambios si agregas un RTC no te dejes llevar por el nombre de la librería.

#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>  // a basic DS1307 library that returns time as a time_t

void setup()  {
  Serial.begin(9600);
  while (!Serial) ;                   // espera a que el Monitor serie se abara
  setSyncProvider(RTC.get);   // esta función lee la hora del RTC y sincroniza el reloj del sistema
  if(timeStatus()!= timeSet) 
     Serial.println("No puedo sincronizarme con el RTC");
  else
     Serial.println("RTC ha fijado la hora del sistema");      
}

O sea.. muy pocos agregados mas que cambios. El resto igual

Gracias de nuevo surbyte por la ayuda, si no he comprendido mal entonces el problema de que cuando llegue a 23:59:59 pase a 00:00:00 se soluciona con el RTC, aun tengo que esperar a que me llegue y consultarle a mi tutor que versión es la que encargo (espero que sea la que dijiste), ahora comenzaré con el diseño en 3D y en cuanto me llegue el RTC lo probaré, en caso de que no consiguiese hacerlo funcionar volveré a este post para comentarte de nuevo las dudas si no hay inconveniente y de camino ir actualizando el progreso del proyecto que pienso que si alguna persona piensa realizarlo aquí podrá encontrar todo lo necesario o eso espero para realizarlo y entenderlo.

PD: acabo de darme cuenta que en la tarjeta ARDUINO UNO que estoy utilizando, cuando lo tengo conectado al pc y los leds conectados, el 504L se calienta mucho a los pocos segundos de conectarlo, no se si alguien sabrá a que se debe, mi circuito lo monte conectando alimentacion y masa del arduino y una resistencia de 470 ohmios intercalada entre los leds y el pin que programa a estos.

Gracias de nuevo surbyte por la ayuda, si no he comprendido mal entonces el problema de que cuando llegue a 23:59:59 pase a 00:00:00 se soluciona con el RTC

Eso nunca fue un problema, fue tu problema por la forma con la que encaraste la programación, sin el uso de ningun reloj.

PD: acabo de darme cuenta que en la tarjeta ARDUINO UNO que estoy utilizando, cuando lo tengo conectado al pc y los leds conectados, el 504L se calienta mucho a los pocos segundos de conectarlo, no se si alguien sabrá a que se debe, mi circuito lo monte conectando alimentacion y masa del arduino y una resistencia de 470 ohmios intercalada entre los leds y el pin que programa a estos.

Eso es obvio, estas alimentando los NeoPixel con tu Arduino y eso no es lo que corresponde hacer.

Debes usar una fuente externa de 5V y compartir GND con Arduino.
Solo usa una fuente que entregue la corriente de los NeoPixel y asunto resuelto, Arduino tranquilo y todo funcionando.