El 7 segmentos titila

Hola, buenas. Necesito ayuda con un proyecto en el que estoy haciendo un cronometro con boton de pausa e inicio, y un contador de puntos usando solo un display de 7 segmentos 4 digitos.
el problema es que cuando el tiempo marca XX:01 a XX:04 todos los digitos que no muestren un cero, titilan.


int numero[4];
int pos = 0;
int num;
void mostrarnum(int num) {


  numero[0] = (num % 10);
  numero[1] = (num % 100) / 10;
  numero[2] = (num % 1000) / 100;
  numero[3] = (num / 1000);


  for (pos = 0; pos <= 3; pos++) {
    digitalWrite(12 - pos, LOW);


    if ((numero[pos] != 1) && (numero[pos] != 4)) {
      digitalWrite(2, HIGH);
    } else {
      digitalWrite(2, LOW);
    }


    if ((numero[pos] != 5) && (numero[pos] != 6)) {
      digitalWrite(3, HIGH);
    } else {
      digitalWrite(3, LOW);
    }


    if (numero[pos] != 2) {
      digitalWrite(4, HIGH);
    } else {
      digitalWrite(4, LOW);
    }


    if ((numero[pos] != 1) && (numero[pos] != 4) && (numero[pos] != 7)) {
      digitalWrite(5, HIGH);
    } else {
      digitalWrite(5, LOW);
    }


    if ((numero[pos] != 1) && (numero[pos] != 3) && (numero[pos] != 5) && (numero[pos] != 7) && (numero[pos] != 9) && (numero[pos] != 4)) {
      digitalWrite(6, HIGH);
    } else {
      digitalWrite(6, LOW);
    }


    if ((numero[pos] != 1) && (numero[pos] != 2) && (numero[pos] != 3) && (numero[pos] != 7)) {
      digitalWrite(7, HIGH);
    } else {
      digitalWrite(7, LOW);
    }


    if ((numero[pos] != 0) && (numero[pos] != 1) && (numero[pos] != 7)) {
      digitalWrite(8, HIGH);
    } else {
      digitalWrite(8, LOW);
    }
    delay(5);
    digitalWrite(12 - pos, HIGH);
  }
}


int e = 1;  //cuenta los segundos
int g = 0;  //cuenta los milis
int p = 0;  //junta dlas variables p1 y p2
int p1;
int p2;
int r = 0;
int t1;
int t2;
int t;
int y;
int o;
int pollo;
int s = 1;

bool pausa;  //verdadero o falso de la pausa

unsigned long previousMillis = 0;

void setup() {

  pinMode(2, OUTPUT);   //segmento a
  pinMode(3, OUTPUT);   //segmento b
  pinMode(4, OUTPUT);   //segmento c
  pinMode(5, OUTPUT);   //segmento d
  pinMode(6, OUTPUT);   //segmento e
  pinMode(7, OUTPUT);   //segmento f
  pinMode(8, OUTPUT);   //segmento g
  pinMode(9, OUTPUT);   //digito 4
  pinMode(10, OUTPUT);  //digito 3
  pinMode(11, OUTPUT);  //digito 2
  pinMode(12, OUTPUT);  //digito 1

  Serial.begin(9600);

  pausa = true;
}



void loop() {

  analogRead(A5);
  Serial.println(analogRead(A5));  // imprime los valores de
  

  //////////////////////////////////////////////////////////////////////////////////////
  ////////////////////////////  sistema para el cronometro  ////////////////////////////
  //////////////////////////////////////////////////////////////////////////////////////

  if ((analogRead(A5) <= 100 && analogRead(A5) >= 90) || r == 1 || !pausa) {
    r = 1;
    pausa = false;


    const long interval = 1000;
    unsigned long currentMillis = millis();
    if ((currentMillis - previousMillis) >= interval) {

      previousMillis = currentMillis;

      if (!pausa) {  //si no está en pausa
        t1++;        //cuenta los segundos
      }
    }
    if (t1 == 60) {
      t1 = 0;  //cuando los segundos llegan a 60 se reinician a 0
      t2++;    // "      "    "         "   " "  se suma un minuto
    }
    t = (t2 * 100) + t1;            // junta las 2 variables t1 y t2 como la variable t para mostrar el tiempo en el display
    if (y == 0) { mostrarnum(t); }  //llama a la funcion}
  }

  if (analogRead(A5) <= 20 && analogRead(A5) >= 5 || r == 2) {
    r = 2;
    pausa = true;  // pausa el contador
    o = t;
    mostrarnum(o);
  }


  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  ////////////////////////////  sistema para alternar entre el cronometro y los puntos  ////////////////////////////
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  if (pausa) {
     y = 0;
      }
  else if (t1 % 15 == 1 || t1 % 15 == 2 || t1 % 15 == 3 || y == 1) {
    y = 1;
    o = p;

    mostrarnum(o);  //llama a la funcion
  }
  if (t1 % 18 == 1 || t1 % 18 == 2 || t1 % 18 == 3 || y == 0) {
    y = 0;
    mostrarnum(t);
  }


  //////////////////////////////////////////////////////////////////////////////////////////
  ////////////////////////////  sistema para la suma de puntos  ////////////////////////////
  //////////////////////////////////////////////////////////////////////////////////////////

  g = millis() % 10;  //rapidez en la que suma los puntos

  if (analogRead(A5) >= 800 && analogRead(A5) <= 950)  //suma al equipo 1
  {
    if (g == 0) {
      p1++;
    }
  }
  if (p1 == 99) {
    p1 = 0;
  }

  if (analogRead(A5) >= 600 && analogRead(A5) <= 750)  //suma al equipo 2
  {
    {
      if (g == 0) {
        p2++;
      }
    }
    if (p2 == 99) {
      p2 = 0;
    }
  }

  p = (p1 * 100) + p2;  // junta las 2 variables p1 y p2 como la variable p para mostyrarlas en el display


  //*/
}

no se como poner bien el codigo, si alguno me dice como para que sea mas comodo copiarlo y leerlo, le agradezco

Normas de Foro en español, punto 7.

Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en (<CODE/>)


No sigas respondiendo sin editar

Primero, no recomiendo hacer tantas lecturas con analogRead(), es mejor leer el valor una vez al comienzo del loop() y luego usarlo.
Luego, mirando el código, en mi opinión, creo que depende de si actualiza continuamente la pantalla (con mostrarnum()) cuando no ha marcado un nuevo segundo. En la práctica deberías intentar mover esa parte del código dentro del if() donde compruebas que ha pasado un nuevo segundo:

...
void loop() {

  int sel = analogRead(A5);
  Serial.println(sel);  // imprime los valores de

  //////////////////////////////////////////////////////////////////////////////////////
  ////////////////////////////  sistema para el cronometro  ////////////////////////////
  //////////////////////////////////////////////////////////////////////////////////////
  if ((sel <= 100 && sel >= 90) || r == 1 || !pausa) {
    r = 1;
    pausa = false;

    const long interval = 1000;
    unsigned long currentMillis = millis();
    if ((currentMillis - previousMillis) >= interval) {
      previousMillis = currentMillis;
      if (!pausa) {  //si no está en pausa
        t1++;        //cuenta los segundos
// este bloque va aquí
        if (t1 == 60) {
          t1 = 0;  //cuando los segundos llegan a 60 se reinician a 0
          t2++;    // "      "    "         "   " "  se suma un minuto
        }
        t = (t2 * 100) + t1;            // junta las 2 variables t1 y t2 como la variable t para mostrar el tiempo en el display
        if (y == 0) { mostrarnum(t); }  //llama a la funcion}
// ---------
      }
    }
  }
...

Un pequeño consejo: trate de dar nombres significativos a las variables, para que el código sea más fácil de entender... Por ejemplo, ¿por qué "t1" y "t2" para segundos y minutos en lugar de "sec" y "min"?
No es que esté prohibido, por supuesto, pero hacer variables con un nombre de una sola letra y luego tener que poner comentarios para explicar su propósito no es la mejor práctica. :wink:

1 Like

Por si no sabías hay una librería que te resuelve todo
https://playground.arduino.cc/Main/SevenSegmentLibrary/