Mostrar números distintos en un display de 7 segmentos doble

Buenas a todos,

Llevo un par de días intentando mostrar dos números distintos en el display que conseguí el otro día.

Os copio todo el código, pero el problema yo diría que está al final del loop(), he dejado un comentario. El problema es que ambos digitos empiezan a hacer cosas raras.

int led_ok = 8;         // Led acierto, verde
int led_ko = 9;         // Led error, rojo
int button_1 = 2;       // Botón 1
int button_2 = 3;       // Botón 2
int button_3 = 4;       // Botón 3
int button_save = 5;    // Botón 4, para guardar la combinación
bool recording = true;
String correct;         // Cadena correcta con la que se comprobará la introducida por el usuario
String user;

int number1 = 12;   // Primer  digito del display
int number2 = 13;   // Segundo digito del display
//                 A   B   C    D  E   F    G
int segments[7] = {A0, A1, A3, 10, A4, A5, A2};


void setup() {
  pinMode(led_ok, OUTPUT);
  pinMode(led_ko, OUTPUT);
  pinMode(button_1, INPUT);
  pinMode(button_2, INPUT);
  pinMode(button_3, INPUT);
  pinMode(button_save, INPUT);
  pinMode(number1, OUTPUT);
  pinMode(number2, OUTPUT);
  for( int sCounter = 0; sCounter <= 6; sCounter++) {
    pinMode(segments[sCounter], OUTPUT);
  }
  reset();
  recording = true;
}

void loop() {
  // Guardar el primer código introducido si (apretamos el botón de guardar, estamos grabando y han introducido algo)
  if (buttonPressed(button_save) && recording && user != "") {
    
    correct = user;     // Guardamos la contraseña
    user = "";          // Reiniciamos lo introducido hasta ahora
    recording = false;  // Dejamos de grabar

    // Señal luminosa para indicar que hemos guardado la contraseña
    pinToggle(led_ok); delay(100); pinToggle(led_ok);
    pinToggle(led_ko); delay(100); pinToggle(led_ko);
    pinToggle(led_ok); delay(100); pinToggle(led_ok);
    pinToggle(led_ko); delay(100); pinToggle(led_ko);
    reset();            // Reiniciar los segmentos del display
  }
  
  // Detectar el botón apretado
  if      (buttonPressed(button_1)) { user += String(button_1); }
  else if (buttonPressed(button_2)) { user += String(button_2); }
  else if (buttonPressed(button_3)) { user += String(button_3); }

  // Hemos introducido un código tan largo como la contraseña
  if (user.length() == correct.length() && !recording && correct != "") {
    // Definir el led a encender (Verde o Rojo) dependiendo de la combinación introducida
    int led_to_high = user == correct ? led_ok : led_ko;
    pinToggle(led_to_high);   // Encender el LED
    // Reiniciamos todo
    delay(1000);
    pinToggle(led_to_high);   // Apagar el LED
    user = "";
    reset();
  }


 /*
  * Mostrar el número de veces que hemos apretado un botón
  * Esta es la parte que no está funcionando.
  */
  int number_to_print = user.length();
  int number_to_print1 = number_to_print / 10;
  int number_to_print2 = number_to_print - (number_to_print1 * 10);
  printNumber(number_to_print1, number1);
  delay(5);
  printNumber(number_to_print2, number2);
  delay(5);  
}

// Detectar si hemos apretado el botón en cuestión y encender el led indicador en tal caso
bool buttonPressed(int bNumber) {
  // Función a parte por si algún día se añade un indicador visual al apretar un botón
  return digitalRead(bNumber) == HIGH;
}

// Invertir el estado de un PIN
void pinToggle(int lNumber) {
  digitalWrite(lNumber, !digitalRead(lNumber));
}

// Reiniciar los pines de los segmentos y las dos masas
void reset() {
  digitalWrite(number1, HIGH);
  digitalWrite(number2, HIGH);
  for( int sCounter = 0; sCounter <= 6; sCounter++) {
    digitalWrite(segments[sCounter], LOW);
  }
  
}

// Dibujar un número 
void printNumber(int number, int segment) {
  
  int numbers_segments[10][7] = {
    {1, 1, 1, 1, 1, 1, 0},  // 0
    {0, 0 ,1, 1, 0, 0, 0},  // 1
    {0, 1, 1, 0, 1, 1, 1},  // 2
    {0, 1, 1, 1, 1, 0, 1},  // 3
    {1, 0, 1, 1, 0, 0, 1},  // 4
    {1, 1, 0, 1, 1, 0, 1},  // 5
    {1, 1, 0, 1, 1, 1, 1},  // 6
    {0, 1, 1, 1, 0, 0, 0},  // 7
    {1, 1, 1, 1, 1, 1, 1},  // 8
    {1, 1, 1, 1, 0, 0, 1}   // 9
  };
  digitalWrite(segment, LOW);
  for (int pos = 0; pos <= 7; pos++) {
    digitalWrite(segments[pos], numbers_segments[number][pos]);
  }
}

Luego he probado añadiendo esto dentro del loop:

for (int count = 0; count <= 9; count++) {
    printNumber(count, number1);
    delay(500);
  }

Los dígitos se dibujan bien, pero tienen un comportamiento muy extraño
3, 4, 5, 7, 8, 9 <= Estos números sólo se encienden en la pantalla especificada (es decir, van bien)
1, 2, 6 <= Estos se encienden en ambos, y eso que sólo he especificado el primero

El comportamiento siempre es el mismo, reinicie o no.

Tengo que decir que lo tengo todo sin resistencias ni transistores ni nada de nada, en modo “comando” para hacer pruebas mientras consigo todas las piezas.

Saludos y gracias por cualquier ayuda! ya no sé por dónde continuar

Hola.
Tal vez el problema sea este:

  for (int pos = 0; pos <= 7; pos++)

Prueba a dejarlo así:

  for (int pos = 0; pos < 7; pos++) {

Ten en cuenta que una matriz de 7 elementos va de matriz[0] a matriz[6].

noter:
Ten en cuenta que una matriz de 7 elementos va de matriz[0] a matriz[6].

Gracias noter!
Vaya lapsus, estoy acostumbrado a los bucles foreach...

Ahora el código que muestra un número cada segundo funciona de perlas, es decir, las matrices de los números funcionan bien.

El problema que tengo es que sigue sin mostrarme los números que le pido. Por ejemplo si apreto dos veces un botón debería mostrar 02 pero muestra lineaas raras sin sentido.

Creo que está aquí:

/*
  * Mostrar el número de veces que hemos apretado un botón
  * Esta es la parte que no está funcionando.
  */
  int number_to_print = user.length();
  int number_to_print1 = number_to_print / 10;
  int number_to_print2 = number_to_print - (number_to_print1 * 10);
  printNumber(number_to_print1, number1);
  delay(5);
  printNumber(number_to_print2, number2);
  delay(5);

No entiendo porqué el bucle si puede encenderlos bien pero este código no, he probado incluso dejando sólo el primer printNumber, pero no hay manera...