Atascado en proyecto reloj.

Hola, acabo de iniciarme con arduino en un proyecto en el que quiero hacer un reloj y a su vez utilizar un(varios) integrado bcd to decimal decoder. El cual tiene 4 entradas y 10 salidas, si en las entradas le doy 0001 activa la salida 1, 0010 la 2, ...

Partimos de la base que no tengo ni idea de programar, todo es nuevo para mi. Por ahora mas menos voy entendiendo los programas que he estado viendo para conseguir realizar el proyecto.

Explico como llevo el proyecto por encima y planteo donde estoy atascado.

Para saber la hora, fecha y temperatura utilizo un ds3231, he conseguido, con mucho calentamiento de coco, poder modificar la hora con pulsadores y me apoyo de una pantalla lcd 16, 2 para mostrar los resultados.
Integrado similar al que voy a utilizar, aun no tengo claro cual pero el funcionamiento es el mismo., eso creo.
También he separado en variables las decenas y unidades de horas, minutos, etc. Por ejemplo supongamos que son las 23h, he separado en una variable el 2 y en otra el 3.

Ahora viene mi problema.
Ahora debo de hacer el programa que controla los integrados.
Como he comentado he separado en variables los datos que necesito entregar al integrado pero aun en decimal.
Como no tengo ni idea todas las pruebas que he hecho además de salirme mal me dan valores no esperados en el puerto serie.

He probado con array pero como tampoco tengo claro el uso de las variables... pues eso.

int miarray[]{0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1001};
int DecHor = 3;

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

void loop(){

Serial.print(miarray[DecHor]);
}

Esto es lo que he probado pero en el puerto serie yo esperaba un "0011" y no, me da(si no recuerdo mal, porque ya he hecho varias cosas y no recuerdo exactamente) un 68. Por ejemplo si en Serial.print añado BIN, si que me da el valor en binario pero de ese 68.

Tambien he probado con bitRead(DecHor, 0). Y me debería dar un 1 pero me da los mismos resultados que con el array y sino no me daba el esperado.
Todo esto lo hago pensando que podre cambiar el estado de varias salidas simplificando con ese valor binario.

Se que puedo utilizar la función if pero me parece una barbaridad.

if(DecHor == 0){
  digitalWrite(1, LOW);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
}
if(DecHor == 1){
  digitalWrite(1, LOW);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, HIGH);
}
...

Después de todo el tostón, si me he explicado correctamente, a ver si me puede ayudar alguien. Seguro que se puede hacer algo mas eficiente y menos código de programa. Todo lo que he hecho ha sido sin tener la mas mínima idea, lo que he planteado a sido lo que en un principio creía tenia que hacer.
También añadir que he buscado por la red pero no he encontrado nada o no he sabido buscar.

Gracias, un saludo.

Esto es lo que he probado pero en el puerto serie yo esperaba un "0011"

Bueno muy bien, te has desenvuelto solo hasta ahora.

Porque no te da 0011 a la salida pues por la siguiente razón.
Tu envias

Serial.print(miarray[DecHor]);

con esto el valor del array que toma como una cadena de números.

Lo que tu quieres hacer es esto, debes imprimir bits aunque no se para que pero bueno.

Defines correctamente tu array asi

byte miarray[]{0b0000, 0b0001, 0b0010, 0b0011, 0b0100, 0b0101, 0b0110, 0b0111, 0b1000, 0b1001};
// uso byte porque no usaras mas de 8 bits y int es para 16 bits.
// 0b es la leyenda o etiqueta que le dice al compilador que lo que siguen son bits
// en realidad habria que poner 8 bits 
// 0b0000 0001 para tu segundo caso pero son redundantes.

for (int i=3; i>=0; i++) {
     Serial.print(miarray[DecHor]<< i);
}
Serial.println();

Prueba a ver si funciona mas o menos bien

Lo que tu quieres hacer es esto, debes imprimir bits aunque no se para que pero bueno.

Mi idea inicial es que la cadena de bits que devuelve el array la utilizo para cambiar estados de salidas, realmente no se si es posible eso.
Lo de imprimir en puerto serie es para comprobar que me daba el dato correcto a utilizar, teniendo en cuenta mi idea original.

Defines correctamente tu array asi

Ahora mismo pruebo.
Me faltaba el "0b", probé como variable byte pero falta eso.

Despues de probar, varias cosas.
He puesto la variable array.

  1. Al poner el codigo "for", me da un error al compilar por una interrupcion que tengo por tiempo.
  2. He probado directamente "Serial.print(miarray[DecHor]);", me da el valor en decimal.
    Deberia darme el valor en el puerto serie directamente en binario?
    Por lo menos ya me da valores con sentido.

Gracias

Hi,
Trata de hacerlo asi Serial.print(miarray[DecHor],BIN);

falta lo mas basico,que tipo de reloj quieres hacer?? porque me da que quieres hacer un reloj binario o quizas con leds de segmentos.si es el caso ,especifica ,porque hay varios tipos.

@tauro0221 Si lo pongo como dices si me da el valor en binario, asi si.
Entonces, puedo entender, en puerto serie por defecto da el valor en decimal?

@jose La finalidad es que encienda tubos nixie.
Por eso lo del integrado bcd a decimal.

Saludos.

pikardaken:
Por eso lo del integrado bcd a decimal.

Podrías simplificarte esa tareas si hubieras extraído dichas funciones de la librería RTClib:

static uint8_t bcd2bin (uint8_t val) { return val - 6 * (val >> 4); }
static uint8_t bin2bcd (uint8_t val) { return val + 6 * (val / 10); }

Retorna uint8_t, que es lo mismo a unsigned char y byte; por lo tanto, solo funcionará en valores del 0 al 99.

@Lucario448 Si no te importa explícalo con poco mas de detalle, entiendo que con eso convierto de decimal a binario o viceversa., pero no me queda claro como lo uso.

Son funciones establecidas por la librería RTClib?

Utilizo la librería RTC.h, después de probar varias es con la que conseguí modificar la hora con los pulsadores, con las otras no tenia claro como aumentar o disminuir hora y fecha independientemente del ds3231.

He hecho un código para cambiar el estado de salidas según el valor que devuelve el array pero al imprimir en puerto serie no me da el resultado esperado.

volatile byte BinCod;
volatile int PinSel1;
volatile int PinSel2;
volatile int PinSel3;
volatile int PinSel4;
int DecHorPin[2] = {22, 23};
int UniHorPin[4] = {24, 25, 26, 27};
int DecMinPin[2] = {28, 29, 30};
int UniMinPin[2] = {31, 32, 33 34};
int DecDiaPin[2] = {35, 36};
int UniDiaPin[2] = {37, 38, 39, 40};
int DecMesPin[3] = {41, 42};
int UniMesPin[4] = {43, 44, 45, 46};
int DecAnoPin[4] = {47, 48, 49, 51};
int UniAnoPin[4] = {13, 53, 52, 6};


void setup(){
  for(int i = 22; i<53; i++){
    pinMode(i, OUTPUT);
   }
  pinMode(6, OUTPUT);
  pinMode(13, OUTPUT);
}

void activarPin(){
  PinSel1 = LOW;
  PinSel2 = LOW;
  PinSel3 = LOW;
  PinSel4 = LOW;
  if(BinCod == 0000){
    digitalWrite(PinSel1, LOW);
    digitalWrite(PinSel2, LOW);
    digitalWrite(PinSel3, LOW);
    digitalWrite(PinSel4, LOW);    
  }
  if(BinCod == 0001){
    digitalWrite(PinSel1, HIGH);
    digitalWrite(PinSel2, LOW);
    digitalWrite(PinSel3, LOW);
    digitalWrite(PinSel4, LOW);  
  }
  if(BinCod == 0010){
    digitalWrite(PinSel1, LOW);
    digitalWrite(PinSel2, HIGH);
    digitalWrite(PinSel3, LOW);
    digitalWrite(PinSel4, LOW);  
  }
  if(BinCod == 0011){
    digitalWrite(PinSel1, HIGH);
    digitalWrite(PinSel2, HIGH);
    digitalWrite(PinSel3, LOW);
    digitalWrite(PinSel4, LOW);  
  }
  if(BinCod == 0100){
    digitalWrite(PinSel1, LOW);
    digitalWrite(PinSel2, LOW);
    digitalWrite(PinSel3, HIGH);
    digitalWrite(PinSel4, LOW);  
  }
  if(BinCod == 0101){
    digitalWrite(PinSel1, HIGH);
    digitalWrite(PinSel2, LOW);
    digitalWrite(PinSel3, HIGH);
    digitalWrite(PinSel4, LOW);  
  }
  if(BinCod == 0110){
    digitalWrite(PinSel1, LOW);
    digitalWrite(PinSel2, HIGH);
    digitalWrite(PinSel3, HIGH);
    digitalWrite(PinSel4, LOW);  
  }
  if(BinCod == 0111){
    digitalWrite(PinSel1, HIGH);
    digitalWrite(PinSel2, HIGH);
    digitalWrite(PinSel3, HIGH);
    digitalWrite(PinSel4, LOW);  
  }
  if(BinCod == 1001){
    digitalWrite(PinSel1, LOW);
    digitalWrite(PinSel2, LOW);
    digitalWrite(PinSel3, LOW);
    digitalWrite(PinSel4, HIGH);  
  }
  if(BinCod == 1001){
    digitalWrite(PinSel1, HIGH);
    digitalWrite(PinSel2, LOW);
    digitalWrite(PinSel3, LOW);
    digitalWrite(PinSel4, HIGH);  
  }
}
void SeleccionDecHor(){
  BinPin = BinVal[DecHor];
  PinSel1 = DecHorPin[1];
  PinSel2 = DecHorPin[2]; 
  activarPin();
  SeleccionUniHor();
  }
void SeleccionUniHor(){
  BinPin = BinVal[UniHor];
  PinSel1 = UniHorPin[1];
  PinSel2 = UniHorPin[2];
  PinSel3 = UniHorPin[3];
  PinSel4 = UniHorPin[4];
  activarPin();
  SeleccionDecMin();
}
  void SeleccionDecMin(){
  BinPin = BinVal[DecMin]; 
  PinSel1 = DecMinPin[1];
  PinSel2 = DecMinPin[2];
  PinSel3 = DecMinPin[3];
  activarPin();
  SeleccionUniMin();  
}
void SeleccionUniMin(){
  BinPin = BinVal[UniMin];
  PinSel1 = UniMinPin[1];
  PinSel2 = UniMinPin[2];
  PinSel3 = UniMinPin[3];
  PinSel4 = UniMinPin[4];
  activarPin();
  SeleccionDecDia();
}
  void SeleccionDecDia(){
  BinPin = BinVal[DecDia]; 
  PinSel1 = DecDiaPin[1];
  PinSel2 = DecDiaPin[2];
  activarPin();
  SeleccionUniDia();
}
void SeleccionUniDia(){
  BinPin = BinVal[UniDia];
  PinSel1 = UniDiaPin[1];
  PinSel2 = UniDiaPin[2];
  PinSel3 = UniDiaPin[3];
  PinSel4 = UniDiaPin[4];
  activarPin();
  SeleccionDecMes();
}
  void SeleccionDecMes(){
  BinPin = BinVal[DecMes];   
  PinSel1 = DecMesPin[1];
  PinSel2 = DecMesPin[2]; 
  activarPin();
  SeleccionUniMes(); 
  }
void SeleccionUniMes(){
  BinPin = BinVal[UniMes];
  PinSel1 = UniMesPin[1];
  PinSel2 = UniMesPin[2];
  PinSel3 = UniMesPin[3];
  PinSel4 = UniMesPin[4];
  activarPin();
  SeleccionDecAno();
}   
  void SeleccionDecAno(){
  BinPin = BinVal[DecAno]; 
  PinSel1 = DecAnoPin[1];
  PinSel2 = DecAnoPin[2];
  PinSel3 = DecAnoPin[3];
  PinSel4 = DecAnoPin[4];
  activarPin();
  SeleccionUniAno();
}

Pegando he visto varias cosas que tengo que cambiar, lo cambio y ya comentare como ha ido.

Hi,
Si quieres listar en binario tus variables puedes hacerlo usando un for loop y lee las variables usando readbit y las lee bit por bit y las vaz listando un bit uno a uno. Una sugerenciay es sencilla de hacer.

seguimos matando moscas a cañonazos porque das detalles de tu proyecto a cuentagotas y si lo explicaras todo con mas detalle ,es posible que pudieras ahorrar material,trabajo y dolores de cabeza.Las funciones que ha puesto lucario vienen con la libreria del DS3231 por que este trabaja con codigos BCD y la codificacion es diferente.

@tauro0221 Tomo nota, investigo como hacerlo exactamente y me pongo a ello.

@jose Quizás no me he expresado correctamente pero creo que mas o menos esta claro lo que quiero hacer. Voy a explicarlo con mas detalle. Pongo el código para que le peguéis un ojo si queréis.

Quiero hacer un reloj con lamparas nixie.
Arduino debe controlar los integrados 74141N, es un decodificador binario a decimal 4-10,que son los que se encargan de alimentar las lamparas.
Quiero visualizar con las lampara la hora, minuto, día, mes, año, temperatura. Quiero añadir leds rgb y otras cosas mas por decidir.
La parte de imprimir en el lcd es secundario, solo es por ver lo que estaba haciendo y de paso tocar mas código y funciones.

Evidentemente mucho de lo que tenga de código se puede simplificar, hacer de otra forma mas eficiente, ... pero como no tengo ni idea pues a medida que aprendo voy aplicando lo aprendido.

Es fácil que lo tenga mal planteado, no tengo practica.

Proyecto_reloj.ino (10.5 KB)

Hubieras comenzado por ahi y ademas agregar un esquema de conexiones al arduino para entenderlo mejor.
Supongamos que uses un decodificador BCD a DECIMAL CD4028 o un 74141N, da igual desde el punto de vista del arduino.

Me gusta trabajar sobre algo conocido. Busque 30 segundos y encontré este esquema que se acomoda bastante bien a tu caso.

Un 74141 como deco bcd a decimal para comandar los Nixie y una serie de transistores que cierran el circuito en modo multiplexado.

Este esquema se adapta a tu necesidad? Supongo que si.
Si es asi, entonces podremos trabajar y colaborar mejor con tu proyecto.

Bueno no me había dado cuenta pero esta todo hecho.
Mira este link NikieClock

Mi intención es hacerlo por mi. Evidentemente tengo que ir copiando y documentandome. Había visto el tema de multiplexación, pero inicialmente lo he descartado por ser mas complejo, o eso creo. Y al tener un arduino mega puedo utilizar un 74141N por lampara sin tener que meterme en el embolao de la multiplexación.
No se ni cambiar el estado de varias salidas...
Haré un esquema de lo que tengo pensado, así veis cual la idea inicial.
Y por otro lado, ya había visto algún otro proyecto similar pero no entiendo nada del código(o muy poco) y he optado por hacerlo por mi mismo y con ayuda en ciertos casos.

Saludos.

Moderador: No repitas lo que se lee arriba

Ok ya nos vamos entendiendo mejor...viendo el funcionamiento 74141N lo unico que necesitarias seria modificar la libreria del DS3231 porque retorna la hora en decimal ,y lo que te interesa es precisamente lo contrario ,coger la hora sin pasar por la funcion que la convierte a decimal porque ya te la da en BCD que es justo lo que necesita el 74141N.Habria que recoger los datos que te interesen (minutos,horas,dia,mes,etc)cada dato viene en un byte ,los 4 bits para una cifra y 4 para la otra.Luego habria que "currarse" una funcion que lea los 4 bits que te interesen bitRead() - Arduino Reference y los asigne directamente a sus 4 salidas.Por cierto ,viendo lo que quieres representar y que cada cifra necesita 4 salidas ,no vas tan sobrado de pines: minutos,hora,dia,mes ya son 32 y te falta año,temperatura,leds rgb???......

Hola,
Sigo dando palos de ciego.
Añado el programa entero al final del mensaje.

@jose Si que tienes toda la razón de que no voy sobrado de salidas.

Después de darle vueltas y no encontrar nada, o por lo menos entender lo que veía, me he dado cuenta de que me estoy complicando la vida sin necesidad.

Por un lado he quitado el array para convertir(teóricamente) un numero decimal del 0 al 9 en bin y directamente trabajar con esos números en decimal.

void ActivarPin(){
if(BinPin == 0){digitalWrite(PinSel1, LOW); digitalWrite(PinSel2, LOW); digitalWrite(PinSel3, LOW); digitalWrite(PinSel4, LOW);}
  if(BinPin == 1){digitalWrite(PinSel1, LOW); digitalWrite(PinSel2, LOW); digitalWrite(PinSel3, LOW); digitalWrite(PinSel4, HIGH);}
  if(BinPin == 2){digitalWrite(PinSel1, LOW); digitalWrite(PinSel2, LOW); digitalWrite(PinSel3, HIGH); digitalWrite(PinSel4, LOW);}
  if(BinPin == 3){digitalWrite(PinSel1, LOW); digitalWrite(PinSel2, LOW); digitalWrite(PinSel3, HIGH); digitalWrite(PinSel4, HIGH);}
  if(BinPin == 4){digitalWrite(PinSel1, LOW); digitalWrite(PinSel2, HIGH); digitalWrite(PinSel3, LOW); digitalWrite(PinSel4, LOW);}
  if(BinPin == 5){digitalWrite(PinSel1, LOW); digitalWrite(PinSel2, HIGH); digitalWrite(PinSel3, LOW); digitalWrite(PinSel4, HIGH);}
  if(BinPin == 6){digitalWrite(PinSel1, LOW); digitalWrite(PinSel2, HIGH); digitalWrite(PinSel3, HIGH); digitalWrite(PinSel4, LOW);}
  if(BinPin == 7){digitalWrite(PinSel1, LOW); digitalWrite(PinSel2, HIGH); digitalWrite(PinSel3, HIGH); digitalWrite(PinSel4, HIGH);}
  if(BinPin == 8){digitalWrite(PinSel1, HIGH); digitalWrite(PinSel2, LOW); digitalWrite(PinSel3, LOW); digitalWrite(PinSel4, LOW);}
  if(BinPin == 9){digitalWrite(PinSel1, HIGH); digitalWrite(PinSel2, LOW); digitalWrite(PinSel3, LOW); digitalWrite(PinSel4, HIGH);}
}

Pero cuando leo el estado de las salidas, al igual que con todas las formas que he probado, los resultados no son los esperados.

Algo tengo que estar haciendo mal. No he asignado correctamente las salidas, no se escribe lo que toca en la variable correspondiente...
Por un lado veo una cosa que es fácil que me ocasione esos fallos, pero no se como arreglarlo, os explico.

void SeleccionUniHor(){
  BinPin = UniHor;  
  PinSel1 = UniHorPin[4];
  PinSel2 = UniHorPin[3];
  PinSel3 = UniHorPin[2];
  PinSel4 = UniHorPin[1];
  ActivarPin();
  SeleccionDecMin();
}
void SeleccionDecMin(){
  BinPin = DecMin; 
  PinSel1 = 0;
  PinSel2 = DecMinPin[3];
  PinSel3 = DecMinPin[2];
  PinSel4 = DecMinPin[1];
  ActivarPin();
  SeleccionUniMin();  
...

En esas secciones es donde, creo que, asigno el valor BinPin(decimal del 0 al 9) y cambio el valor de las variables PinSelx para seleccionar la salida adecuada de la sección de mas arriba(void ActivarPin(){}) y llama a la siguiente sección.
En la sección void SeleccionUniHor(){}, por ejemplo, pongo los valores asociados a las salidas en PinSelx, para luego poner en estado LOW o HIGH esas salidas en void ActivarPin(){}. Cuando llama a la sección siguiente, void SeleccionDecMin(){}, como el BinPin lo va a reescribir al valor correspondiente de las decenas de minuto, que es una valor del 0 al 5, PinSel1 no lo utilizo porque es solo para el 8 y el 9. Por lo tanto no cambio valor que sigue asociada a UniHorPin[4]. Al llamar a void ActivarPin(){} cambiara el estado de esa salida, unas veces coincidirá y otras no.
No se como solucionarlo.

He probado a monitorizar el estado de salidas en la sección void ActivarPin(){}. primero solo las que van asociadas a PinSel1, por lo tanto me muetras la primera salida en cada valor. Por lo tanto cada vez que escribe en el monitor me muestra 10 salidas, decenas y unidades de hor, minuto, dia, mes y año. Todas me dan el estado adecuado.
Cuando he probado con PinSel2 ya no me daba los 0 o 1 adecuados.

Una duda que tengo.
El orden de las secciones del código influyen en el funcionamiento?

Espero haberme explicado correctamente.

Saludos.

Proyecto_reloj_v2.ino (9.86 KB)

Te digo como lo veo yo ,una vez modificada la libreria rtc para que no devuelva decimal ,si no bcd que es como trabaja el DS3231 y el 74141N,cada dato del rtc vendra en un byte ,8 bits.Por ejemplo ,imagina que los minutos son 23 ,y suponiendo que la primera cifra se guarda en los bits mas significantes (los mas a la izquierda)y la segunda cifra en los menos significantes(los de mas a la derecha) ,el byte resultante seria 00100011 (0010 del 2 y 0011 del 3) .con la funcion bitread() que te puse arriba puedes leer cualquier bit del byte o incluso usando el desplazamiento de bits << - Arduino Reference y >> - Arduino Reference separar el byte en las dos cifras que necesitas ,como es un proceso a repetir para cada byte del rtc (hora,minutos,dia,mes,etc) lo puedes meter en una funcion con dos parametros ,el byte a leer y las salidas a activar y dentro de la funcion ,solo seria leer los 4 primeros bits (primera cifra) y asignarlos a sus salidas (entradas del 7414N) y los 4 siguientes a la segunda cifra.No si entiendes por donde voy,explicado parece complicado pero es muy facil.

Mas facil todavia ,lees el byte en BCD del ds3231 y lo mandas directamente a las salidas correspondientes mediante la manipulacion de los puertos: Arduino Reference - Arduino Reference
Luego pondre un ejemplo.

Hola,
Ya le pegue un vistazo a la librería y no se en que momento hace la conversión a decimal.
Voy a darle otro vistazo. ¿Donde debería buscar, en el archivo *.cpp o *.h?
Gracias por las pistas.
Saludos.

Bueno saque algunas funciones de un reloj binario y adapte un poco para hacer un ejemplo.No puedo probarlo ,los dos megas los tengo en impresoras 3d .Recuerda seleccionar el mega al compilar y verificar que la direccion I2C de tu ds3231 es la misma.Repito esta sin probar ,lo que deberia hacer es leer la hora cada segundo ,coger solo los minutos y activar los pines 22 al 25 correspondientes a la primera cifra en binario y idem con la segunda cifra en los pines 26 al 29 ,ademas de mostrar por serial el byte con las 2 cifras en binario:

// Librerias

#include <Wire.h>

//Constantes

#define RTC_DIR 0x68 // Direccion reloj DS3231
#define REFRESH 1000 // Cada segundo
  
//Variables globales

unsigned long lastTime; // Variable para comparar tiempo transcurrido.

//Estructuras

struct Date {
  byte seconds;
  byte minutes;
  byte hour24;
  byte dayOfWeek;
  byte dayOfMonth;
  byte month;
  byte year;
};
// funciones
Date getDate(){ // Consulta la hora y fecha y devuelve una variable tipo Date.
  Date date;
  Wire.beginTransmission(RTC_DIR);
  Wire.write(0); // Nos situamos en el primer registro
  Wire.endTransmission();
  Wire.requestFrom(RTC_DIR, 7); // Solicitamos los 7 bytes de informacion de la hora y fecha.
  if (Wire.available()) {
    date.seconds = (Wire.read()); // Lectura datos
    date.minutes = (Wire.read()); 
    date.hour24 = (Wire.read()); 
    date.dayOfWeek = (Wire.read());
    date.dayOfMonth = (Wire.read());
    date.month = (Wire.read());
    date.year = (Wire.read());
    return date;
  }
}
void setup() {
    DDRA = B11111111;  // Puerto A del mega como outputs ,va de los pines 22 a 29
    Serial.begin(9600);
    Wire.begin();
    lastTime = millis();

  // put your setup code here, to run once:

}

void loop() {
  if(millis() - lastTime > REFRESH) {
    Serial.println("Leyendo hora");
    Date dateNow = getDate(); // Ejemplo con los minutos.Las entradas del 74141N con primera cifra a los pines 22,23,24 y 25
    PORTA = dateNow.minutes;  // El otro 74141N de la segunda cifra a los pines 27,27,28,29
    Serial.println(PINA,BIN); // Estado de las salidas del puerto A.4 bits derecha la segunda cifra ,4 bits izquierda primera cifra.
    lastTime = millis();
  }
  // put your main code here, to run repeatedly:

}

Hola,
@jose Al final he optado por utilizar una librería para la conversión a bcd.
Las lecturas que he hecho por el monitor son satisfactorias, me devuelve el valor que corresponde en decimal.
Perfecto para utilizar los puertos o shift registers.
He estado viendo el uso de esos integrados y es muy fácil.
Haré pruebas y cuando lo tenga claro del todo os informo de como va.

Gracias.
Saludos.