Problema en display 7 segmentos

Buenas noches,

Tengo dos sketchs con diferente código que hacen casi lo mismo. Ambos resultan en la suma de puntaje que se expresan en dos displays de un dígito. El problema que tengo es que con uno de los sketchs cada segundo que pasa los segmentos apagados tintinean levemente. Digo levemente porque el tintineo no se produce con la misma intensidad luminosa del segmento encendido, pero el problema malogra la estética.
Probé aumentando una resistencia al cátodo pero no se solucionó.

¿Alguien tiene una idea respecto a este problema ?

Gracias

Moderador:
Puedes por favor, concentrar todas las preguntas en un mismo hilo. Das por solucionado un tema y reabres con otra consulta y ya llevamos al menos 2 o 3 consultas del mismo tema.
Sigo insistiendo en que es mas interesante para el lector ver todo como una continuidad.

Respuesta
Ahora tu consulta no puede ser respondida porque no hay ninguno de los dos códigos que mencionas.

Ok surbyte, lo consideré un tema diferente por eso lo puse en otro hilo.

En este código es que se produce el tintineo:

#include <Servo.h>

#define TOTAL_SERVOS 4
#define TOTAL_SENSORES 4
#define PIN_SERVO 2

Servo MiServo[TOTAL_SERVOS];  //Servo
int SensorServos[] = {A0, A1, A2, A3};  // LDR Sensor
int LecturaSENSOR[TOTAL_SENSORES];
int TiempoServos[] = {0, 0, 0, 0}; 
byte aciertos = 0;
int timer = 15; //DURACIÓN DEL JUEGO
unsigned long Intervalo = 10; 
unsigned long previousMillis = 0; 

int const PLAY=6; 

const int LEDVERDE = 13;
const int LEDROJO = 12;

int dataPIN = 8;
int latchPIN = 9;
int clockPIN = 10;

byte numero[] = {B00011000, B01111011, B00101100, B00101001, B01001011, B10001001, B10001000, B00111011, B00001000, B00001001, B11111111, B11111111};

void mostrar_numero(int x) {
    shiftOut(dataPIN, clockPIN, MSBFIRST, numero[x]);
}

void display7seg(int x) {
      digitalWrite (latchPIN, LOW);
      mostrar_numero(x/100);   
      mostrar_numero(x%10);
      mostrar_numero((x/10)%10);
      digitalWrite (latchPIN, HIGH);
}

void Apagardisplay7seg(int x) { 
      digitalWrite (latchPIN, LOW);
      mostrar_numero(10);
      mostrar_numero(11);
      digitalWrite (latchPIN, HIGH);
}

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

  // initialize digital pin as an output.
  pinMode(dataPIN, OUTPUT);
  pinMode(latchPIN, OUTPUT);
  pinMode(clockPIN, OUTPUT);

  pinMode(LEDVERDE, OUTPUT);
  pinMode(LEDROJO, OUTPUT);
  pinMode(PLAY, OUTPUT); 


   for (int NumeroServo = 0; NumeroServo < TOTAL_SERVOS; NumeroServo++)
  {
    MiServo[NumeroServo].attach(NumeroServo + PIN_SERVO,500,1400);
    MiServo[NumeroServo].write(0);
  }
}

void loop() {

  display7seg(0); 
    digitalWrite(LEDVERDE, HIGH); 
  unsigned long currentMillis = millis();

  if ((unsigned long)(currentMillis - previousMillis) >= Intervalo) {

    for (int SensorServosNumber = 0; SensorServosNumber < TOTAL_SENSORES; SensorServosNumber++) {
      LecturaSENSOR[SensorServosNumber] = analogRead({(SensorServos[SensorServosNumber])});
    }
    previousMillis = millis();

  }
  listaServos();
  servoAbajo();
  ifZero();
  Countdowntimer();
  
}

void listaServos() {

  int target = random(1, 5);
  delay(10);
  if (target == 1) {
    TiempoServos[0]++;
    MiServo[0].write(90); display7seg(aciertos);
    delay(10);
    if (TiempoServos[0] == 2) { 
      TiempoServos[0] = 0;

      MiServo[0].write(0);Serial.println("cae MiServo(4)");  
      delay(10);
    }
  } else if (target == 2) {
    TiempoServos[1]++;
    MiServo[1].write(90); display7seg(aciertos);
    delay(10);
    if (TiempoServos[1] == 3) { 
      TiempoServos[1] = 0;

      MiServo[1].write(0);Serial.println("cae MiServo(3)");   
      delay(10);
    }

  } else if (target == 3) {
    TiempoServos[2]++;
    MiServo[2].write(90); display7seg(aciertos);
    delay(10);
    if (TiempoServos[2] == 2) { 
      TiempoServos[2] = 0;

      MiServo[2].write(0);Serial.println("cae MiServo(2)");    
      delay(10);
    }
  } else if (target == 4) {
    TiempoServos[3]++;
    MiServo[3].write(90); display7seg(aciertos);
    delay(10);
    if (TiempoServos[3] == 3) { 
      TiempoServos[3] = 0;

      MiServo[3].write(0);Serial.println("cae MiServo(1)");     
      delay(10);
    }
  }
}

void servoAbajo() {
  if (LecturaSENSOR[0] > 450) {
    display7seg(++aciertos); 
    digitalWrite(PLAY,HIGH);
    delay(15);
    digitalWrite(PLAY,LOW);MiServo[0].write(0);Serial.println("en el blanco MiServo(4)");Serial.println(aciertos);
    delay(5);
  }
  if (LecturaSENSOR[1] > 450) {
    display7seg(++aciertos); //display7seg(aciertos = aciertos + 2); 
    digitalWrite(PLAY,HIGH);
    delay(15);
    digitalWrite(PLAY,LOW);MiServo[1].write(1);Serial.println("ën el blanco MiServo(3)");Serial.println(aciertos);
    delay(5);
  }
  if (LecturaSENSOR[2] > 450) {
    display7seg(++aciertos); 
    digitalWrite(PLAY,HIGH);
    delay(15);
    digitalWrite(PLAY,LOW);MiServo[2].write(2);Serial.println("ën el blanco MiServo(2)");Serial.println(aciertos);
    delay(5);
  }
  if (LecturaSENSOR[3] > 450) {
    display7seg(++aciertos); 
    digitalWrite(PLAY,HIGH);
    delay(15);
    digitalWrite(PLAY,LOW);MiServo[3].write(3);Serial.println("ën el blanco MiServo(1)");Serial.println(aciertos);
    delay(5);
  }
}

void Countdowntimer() {
  timer--;
  delay(1000);
}

void ifZero() {
  if (timer == 0) {
    for (int NumeroServo = 0; NumeroServo < TOTAL_SERVOS; NumeroServo++)
    {
      MiServo[NumeroServo].write(0);
    }

    tone(BEEP, 400);
    delay(200);
    noTone(BEEP);
    tone(BEEP, 800);
    delay(200);
    noTone(BEEP);
    tone(BEEP, 3000);
    delay(200);
    noTone(BEEP);
    tone(BEEP, 1500);
    delay(200);
    noTone(BEEP);
    Serial.println("FIN DEL JUEGO");

    digitalWrite(LEDVERDE, LOW);
    digitalWrite(LEDROJO, HIGH); 
    delay(15000);
    digitalWrite(LEDROJO, LOW);
    display7seg(0); 
    delay(15000);
    Apagardisplay7seg(10);
    Apagardisplay7seg(11);
    Serial.println("DISPLAYS APAGADOS");
    
    aciertos=0;
    timer = 60;


  }
}

Es raro lo que dices. Supongo estas usando un 74x595 por cada display de modo que el chip hace el trabajo de retencion y no deberia haber ningun problema. Seria util que publiques tu esquema electrico.

Por otro lado ese código tiene un defecto y es poner:

void loop() {
   display7seg(0); 
   digitalWrite(LEDVERDE, HIGH); 
   ...
   listaServos();
   servoAbajo();
   ifZero();
   Countdowntimer();  
}
void Countdowntimer() {
   timer--;
   delay(1000);            //Error aquí
}

Es decir tu código principal (loop()), se ejecuta 1 vez cada segundo.

A ver como va asi

#include <Arduino.h>

#include <Servo.h>

#define TOTAL_SERVOS 4
#define TOTAL_SENSORES 4
#define PIN_SERVO 2

Servo MiServo[TOTAL_SERVOS];  //Servo
int SensorServos[] = {A0, A1, A2, A3};  // LDR Sensor
int LecturaSENSOR[TOTAL_SENSORES];
int TiempoServos[] = {0, 0, 0, 0};
byte aciertos = 0;
int timer = 15; //DURACIÓN DEL JUEGO
unsigned long Intervalo       = 10;
unsigned long previousMillis  = 0;
unsigned long countdowntimer;

int const PLAY=6;

const int LEDVERDE = 13;
const int LEDROJO = 12;

int dataPIN = 8;
int latchPIN = 9;
int clockPIN = 10;

byte numero[] = {B00011000, B01111011, B00101100, B00101001, B01001011, B10001001, B10001000, B00111011, B00001000, B00001001, B11111111, B11111111};

void mostrar_numero(int x) {
    shiftOut(dataPIN, clockPIN, MSBFIRST, numero[x]);
}

void display7seg(int x) {
      digitalWrite (latchPIN, LOW);
      mostrar_numero(x/100);   
      mostrar_numero(x%10);
      mostrar_numero((x/10)%10);
      digitalWrite (latchPIN, HIGH);
}

void Apagardisplay7seg(int x) {
      digitalWrite (latchPIN, LOW);
      mostrar_numero(10);
      mostrar_numero(11);
      digitalWrite (latchPIN, HIGH);
}

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

  // initialize digital pin as an output.
  pinMode(dataPIN, OUTPUT);
  pinMode(latchPIN, OUTPUT);
  pinMode(clockPIN, OUTPUT);

  pinMode(LEDVERDE, OUTPUT);
  pinMode(LEDROJO, OUTPUT);
  pinMode(PLAY, OUTPUT);


   for (int NumeroServo = 0; NumeroServo < TOTAL_SERVOS; NumeroServo++)
  {
    MiServo[NumeroServo].attach(NumeroServo + PIN_SERVO,500,1400);
    MiServo[NumeroServo].write(0);
  }
}

void loop() {

  display7seg(0);
  digitalWrite(LEDVERDE, HIGH);
  unsigned long currentMillis = millis();

  if ((unsigned long)(currentMillis - previousMillis) >= Intervalo) {
    for (int SensorServosNumber = 0; SensorServosNumber < TOTAL_SENSORES; SensorServosNumber++) {
      LecturaSENSOR[SensorServosNumber] = analogRead({(SensorServos[SensorServosNumber])});
    }
    previousMillis = millis();

  }
  listaServos();
  servoAbajo();
  ifZero();
  if (millis() - countdowntimer > 1000UL) {
      countdowntimer = millis();
      timer--;
  }
 
}

void listaServos() {

  int target = random(1, 5);
  delay(10);
  if (target == 1) {
    TiempoServos[0]++;
    MiServo[0].write(90); 
    display7seg(aciertos);
    delay(10);
    if (TiempoServos[0] == 2) {
        TiempoServos[0] = 0;

        MiServo[0].write(0);Serial.println("cae MiServo(4)"); 
        delay(10);
    }
  } else if (target == 2) {
    TiempoServos[1]++;
    MiServo[1].write(90); display7seg(aciertos);
    delay(10);
    if (TiempoServos[1] == 3) {
      TiempoServos[1] = 0;

      MiServo[1].write(0);Serial.println("cae MiServo(3)");   
      delay(10);
    }

  } else if (target == 3) {
    TiempoServos[2]++;
    MiServo[2].write(90); display7seg(aciertos);
    delay(10);
    if (TiempoServos[2] == 2) {
      TiempoServos[2] = 0;

      MiServo[2].write(0);Serial.println("cae MiServo(2)");   
      delay(10);
    }
  } else if (target == 4) {
    TiempoServos[3]++;
    MiServo[3].write(90); display7seg(aciertos);
    delay(10);
    if (TiempoServos[3] == 3) {
      TiempoServos[3] = 0;

      MiServo[3].write(0);Serial.println("cae MiServo(1)");     
      delay(10);
    }
  }
}

void ServoAccion(byte qServo, ) {
  display7seg(++aciertos);
  digitalWrite(PLAY,HIGH);
  delay(15);
  digitalWrite(PLAY,LOW);
  MiServo[qServo].write(qServo);
  Serial.println("en el blanco MiServo("+String(4-qServo) +")");
  Serial.println(aciertos);
  delay(5);
}

void servoAbajo() {
  if (LecturaSENSOR[0] > 450) {
      ServoAccion(0);
  }
  if (LecturaSENSOR[1] > 450) {
      ServoAccion(1);
  }
  if (LecturaSENSOR[2] > 450) {
      ServoAccion(2);
  }
  if (LecturaSENSOR[3] > 450) {
      ServoAccion(3);    
  }
}


// Esto no lo cambié porque entiendo que esta al final. Pero tener tantos delay() no es buena idea.
void ifZero() {
  if (timer == 0) {
    for (int NumeroServo = 0; NumeroServo < TOTAL_SERVOS; NumeroServo++) {
      MiServo[NumeroServo].write(0);
    }
    tone(BEEP, 400);
    delay(200);
    noTone(BEEP);
    tone(BEEP, 800);
    delay(200);
    noTone(BEEP);
    tone(BEEP, 3000);
    delay(200);
    noTone(BEEP);
    tone(BEEP, 1500);
    delay(200);
    noTone(BEEP);
    Serial.println("FIN DEL JUEGO");

    digitalWrite(LEDVERDE, LOW);
    digitalWrite(LEDROJO, HIGH);
    delay(15000);
    digitalWrite(LEDROJO, LOW);
    display7seg(0);
    delay(15000);
    Apagardisplay7seg(10);
    Apagardisplay7seg(11);
    Serial.println("DISPLAYS APAGADOS");
   
    aciertos=0;
    timer = 60;
  }
}

No va. Los servos se ponen locos, suben de cero a noventa como locos.

poniendo el delay eliminado vuelve a la normalidad:

listaServos();
  servoAbajo();
  ifZero();
  if (millis() - countdowntimer > 1000UL) {
      countdowntimer = millis();
      timer--;
      delay(1000); //vuelto a poner....

Con esta inserción el tintineo de los segmentos apagados es mayor en intensidad y se produce cada vez que un servo se acciona.

Disculpa pero eso no tiene sentido.
Si me dices que los servos se ponen locos entendemos porque lo hacen.
Ejemplo es que actualices los servos cada 1000 mseg.

Intenta pensar de otro modo. Cuando tienes el delay() tu código no hace nada x cada 1000 mseg
Ahora que agregué la secuencia con millis() esta disponible para actualizar todo a cada loop.

Bien, entonces probemos asi

void loop() {

  display7seg(0);
  digitalWrite(LEDVERDE, HIGH);
  unsigned long currentMillis = millis();

  if ((unsigned long)(currentMillis - previousMillis) >= Intervalo) {
    for (int SensorServosNumber = 0; SensorServosNumber < TOTAL_SENSORES; SensorServosNumber++) {
      LecturaSENSOR[SensorServosNumber] = analogRead({(SensorServos[SensorServosNumber])});
    }
    previousMillis = millis();

  }

  if (millis() - countdowntimer > 1000UL) {
      listaServos();
      servoAbajo();
      ifZero();
      countdowntimer = millis();
      timer--;
  }
 
}

Bueno, yo no le he prestado atención a tu código, asi que estoy haciendo cosas tipo prueba error.
Como tu código hacia las cosas 1 vez por segundo solo puse todo dentro de millis() pero evidentemente eso no resuelve el tema. De hecho no hace nada.
Te pido que analices lo que estoy haciendo y ve haciendo pruebas de como se deben compartar los procedimientos.

Coloca ifZero(); fuera del

if (millis() - countdowntimer > 1000UL) {

Y con eso resuelves ese tema.

No se que controla la variable target con la que resuelves situaciones de los servos, porque como dije he visto rápidamente el código y te pido que intentes ponerle un poco de tu tiempo al mismo.

Pregunta lo que no entiendas.

EDITO: Bueno ahora miré mejor tu código.
target funciona al azar con un random entre 1 y 5.

Simplifica mejor esta parte del código de este modo

void servoAbajo() {
  for (byte i=0; i<4; i++) {
      if (LecturaSENSOR[i] > 450) {
          ServoAccion(i);
      }
  }
}

y el loop queda asi

void loop() {

  display7seg(0);
  digitalWrite(LEDVERDE, HIGH);
  unsigned long currentMillis = millis();

  if ((unsigned long)(currentMillis - previousMillis) >= Intervalo) {
    for (int SensorServosNumber = 0; SensorServosNumber < TOTAL_SENSORES; SensorServosNumber++) {
      LecturaSENSOR[SensorServosNumber] = analogRead({(SensorServos[SensorServosNumber])});
    }
    previousMillis = millis();
  }
  
  if (currentMillis - countdowntimer > 1000UL) {
      listaServos();
      servoAbajo();
      countdowntimer = millis();
      timer--;
  }
  ifZero();
}