Afficheur 3 X 7 segments : allumage partiel non désiré

Bonjour à vous,

Comme bien des personne, je débute sur arduino.

Je suis en train de faire un voltmètre que s’affiche sur un 3 X 7 segments.

Tout marche bien sauf un petit souci, qui m’est arrivé également lors de mes essais avec un 4 x 7 segments :

J’utilise bien sur le multiplexage avec 1 ms. Or il y a sur certains segment sensés être à l’état bas qui sont allumés très faiblement néanmoins visible surtout à la nuit tombée.

Le problème ne se produit plus si mon délais de multiplexage augmente (à partir de 50-100 ms) ce qui bien sur est illisible.

Je précise que ce souci m’est arrivé sur 3 cas différents : avec un 4 x 7 segments sur breadbord, avec un 3 x 7 segments sur breadbord et avec un 3 x 7 segments soudé sur un plaque d’essai. Chaque segment à sa résistance de 200Ω.

    int A = 2;
    int B = 3;
    int C = 4;
    int D = 5;
    int E = 6;
    int F = 7;
    int G = 8;
    int D1 = 13;
    int D2 = 12;
    int D3 = 11;
    int D4 = 10;
    int ms = 1;
    
    
    void segment(int seg)
    {
      digitalWrite(D1, 0);
      digitalWrite(D2, 0);
      digitalWrite(D3, 0);
      digitalWrite(D4, 0);
      
      switch(seg) {
        case 1: digitalWrite(D1, 1); break;
        case 2: digitalWrite(D2, 1); break;
        case 3: digitalWrite(D3, 1); break;
        default:digitalWrite(D4, 1); break;
      }
    }
    
    void chiffre(char num) 
    {
      switch(num)
      {
        case 10: //  default value  
          digitalWrite(A,1);  
          digitalWrite(B,1);
          digitalWrite(C,1);
          digitalWrite(D,1);
          digitalWrite(E,1);
          digitalWrite(F,1);
          digitalWrite(G,1);
          break;
          
        case 0: 
          digitalWrite(A,LOW);  
          digitalWrite(B,LOW);
          digitalWrite(C,LOW);
          digitalWrite(D,LOW);
          digitalWrite(E,LOW);
          digitalWrite(F,LOW);
          digitalWrite(G,HIGH);
          break;
     
       case 1:
          digitalWrite(A,HIGH);
          digitalWrite(B,LOW);
          digitalWrite(C,LOW);
          digitalWrite(D,HIGH);
          digitalWrite(E,HIGH);
          digitalWrite(F,HIGH);
          digitalWrite(G,HIGH);
          break;
      
       case 2:
          digitalWrite(A,LOW);  
          digitalWrite(B,LOW);
          digitalWrite(C,HIGH);
          digitalWrite(D,LOW);
          digitalWrite(E,LOW);
          digitalWrite(F,HIGH);
          digitalWrite(G,LOW);
          break;
      
      case 3:
          digitalWrite(A,LOW); 
          digitalWrite(B,LOW);
          digitalWrite(C,LOW);
          digitalWrite(D,LOW);
          digitalWrite(E,HIGH);
          digitalWrite(F,HIGH);
          digitalWrite(G,LOW);
          break;
      
      case 4:
          digitalWrite(A,HIGH); 
          digitalWrite(B,LOW);
          digitalWrite(C,LOW);
          digitalWrite(D,HIGH);
          digitalWrite(E,HIGH);
          digitalWrite(F,LOW);
          digitalWrite(G,LOW);
          break;
      
      case 5:
          digitalWrite(A,LOW); 
          digitalWrite(B,HIGH);
          digitalWrite(C,LOW);
          digitalWrite(D,LOW);
          digitalWrite(E,HIGH);
          digitalWrite(F,LOW);
          digitalWrite(G,LOW);
          break;
      
      case 6:
          digitalWrite(A,LOW);  
          digitalWrite(B,HIGH);
          digitalWrite(C,LOW);
          digitalWrite(D,LOW);
          digitalWrite(E,LOW);
          digitalWrite(F,LOW);
          digitalWrite(G,LOW);
          break;
      
      case 7:
          digitalWrite(A,LOW);  
          digitalWrite(B,LOW);
          digitalWrite(C,LOW);
          digitalWrite(D,HIGH);
          digitalWrite(E,HIGH);
          digitalWrite(F,HIGH);
          digitalWrite(G,HIGH);
          break;
      
       case 8:
          digitalWrite(A,0); 
          digitalWrite(B,0);
          digitalWrite(C,0);
          digitalWrite(D,0);
          digitalWrite(E,0);
          digitalWrite(F,0);
          digitalWrite(G,0);  
           break;
      
       case 9:
          digitalWrite(A,LOW);  
          digitalWrite(B,LOW);
          digitalWrite(C,LOW);
          digitalWrite(D,LOW);
          digitalWrite(E,HIGH);
          digitalWrite(F,LOW);
          digitalWrite(G,LOW);
          break;

      }
  }

  void affichage(int data)
  {
     
      unsigned char Mi = int (data/1000);
      unsigned char Ce = int ((data/100)%10);
      unsigned char Di = int ((data/10)%10);
      unsigned char Un = int (data%10);

    if (Mi == 0)
    {
      Mi = 10;
      
      if (Ce == 0)
      {
        Ce = 10;
        
        if (Di == 0)
        {
          Di = 10;
        }
      }
    }
    chiffre(Mi);
    segment(1);
    delay(ms);
    
    chiffre(Ce);
    segment(2);
    delay(ms);

    chiffre(Di);
    segment(3);
    delay(ms);

    chiffre(Un);
    segment(4);
    delay(ms);
  }

   
    
    void setup(){
    Serial.begin(9600);
    pinMode(A,OUTPUT);
    pinMode(B,OUTPUT);
    pinMode(C,OUTPUT);
    pinMode(D,OUTPUT);
    pinMode(E,OUTPUT);
    pinMode(F,OUTPUT);
    pinMode(G,OUTPUT);
    pinMode(D1,OUTPUT);
    pinMode(D2,OUTPUT);
    pinMode(D3,OUTPUT);
    pinMode(D4,OUTPUT);
    pinMode(A5,INPUT);
    }

    void loop()
    {
     
      int X = map(analogRead(A5), 0, 1024, 0, 9999);
      affichage(X);
     
    }