testeur de cable - problemes aleatoires

bonjour je fait un petit testeur de faisceau, le principe j'utilise les ports de 7 à 11 pour recevoir le 5v que je branche le fil ou pas sur la carte arduino uno, mon probléme est que le test n'est pas concluant a chaque fois, des fois je branche aucun fils il m'alllume des leds ou toutes.

Par contre sur le simulateur 'tinkercad' c'est impecable à tous les coups.

merci pour toutes infos.

j'ai mis le code et un plan de cablage

 int etatBouton; 


  
    void setup () {
   Serial.begin(9600);
    
      
      
       for (byte j = 2 ; j <= 6 ; j++) {
         pinMode (j, OUTPUT) ; ; // parametres led
      }
      
       for (byte i = 9 ; i <= 13 ; i++) {
         pinMode (i, INPUT) ; // ports pour tester arrivee 5v
      }
      
      
         for (byte j = 2 ; j <= 6 ; j++) {
        digitalWrite (j, HIGH) ; // éteint les DEL reliée à la broche j
      }
    }
   
    // Fonction loop
    void loop () {
  
     
     
      for (byte i = 9 ; i <= 13 ; i++) {
    
    etatBouton = digitalRead(i); // lit si il y a 5v sur le port
 if (etatBouton == 0) {
     Serial.print("non : ");
   Serial.print(i);
   Serial.print(" ");
    Serial.println(etatBouton);
        for(int compteur = 0 ; compteur < 3 ; compteur++) // boucle pour faire clignoter la led concernée par le fil non branché
{
                digitalWrite (i-7, LOW) ; 
     delay (200) ;
      digitalWrite (i-7, HIGH) ;
      delay (200) ;
}
        delay (1000) ;
       
 }else{
    
  Serial.print("oui : ");
   Serial.print(i);
   Serial.print(" ");
    Serial.println(etatBouton);
  
   digitalWrite (i-7, LOW) ; // allume led fil concerné
   
    delay (1000) ;
 }
      }
          
    

     for (byte j = 2 ; j <= 6 ; j++) {
        digitalWrite (j, HIGH) ;  // eteint la led
     }
     

       delay (2000) ; 
       
    
      // Recommence la séquence
    }

Ton code est bon, tu peux utiliser l'auto indentation pour le rendre plus lisible (CTRL T dans l'IDE) :

void setup () {
  Serial.begin(9600);
  for (byte j = 2 ; j <= 6 ; j++) pinMode (j, OUTPUT) ; // parametres led
  for (byte i = 9 ; i <= 13 ; i++) pinMode (i, INPUT) ; // ports pour tester arrivee 5v
  for (byte j = 2 ; j <= 6 ; j++) digitalWrite (j, HIGH) ; // éteint les DEL reliée à la broche j}
}
// Fonction loop
void loop () {
  for (byte i = 9 ; i <= 13 ; i++) {
    int etatBouton = digitalRead(i); // lit si il y a 5v sur le port
    if (etatBouton == 0) {
      Serial.print("non : ");
      Serial.print(i);
      Serial.print(" ");
      Serial.println(etatBouton);
      for (int compteur = 0 ; compteur < 3 ; compteur++) // boucle pour faire clignoter la led concernée par le fil non branché
      {
        digitalWrite (i - 7, LOW); delay (200) ;
        digitalWrite (i - 7, HIGH); delay (200) ;
      }
    } else {
      Serial.print("oui : ");
      Serial.print(i);
      Serial.print(" ");
      Serial.println(etatBouton);
      digitalWrite (i - 7, LOW) ; // allume led fil concerné
    }
    delay (1000) ;
  }

  for (byte j = 2 ; j <= 6 ; j++) digitalWrite (j, HIGH) ;  // eteint la led
  delay (2000) ;
  // Recommence la séquence
}

C'est ta connexion qui n'est pas bonne : tu dois relier les leds au GND, pas au 5V.

Bonjour,

Il n'y a ni pullup ni pulldown sur tes entrées donc elles sont dans un état indéterminé quand il n'y a pas de fil.

Le plus simple est de déclarer tes entrées en INPUT_PULLUP et mettre tes fils entre l'entrée et GND. L'entrée passe à low quand le fil est connecté et revient à high quand il n'y a pas de fil.

merci beaucoup ca marche impec.

concernant les fils qui sont debranchés comment a la fin je peut faire clignoter que les fils debranchés ainsi que les autres led restent fixe une petite liste avec les deux cas.

  void setup () {
   Serial.begin(9600);
    
      
      
       for (byte j = 2 ; j <= 6 ; j++) {
         pinMode (j, OUTPUT) ; ; // led
      }
      
       for (byte i = 7 ; i <= 11 ; i++) {
         pinMode (i, INPUT_PULLUP) ; // ports
      }
      
      
     /*    for (byte j = 2 ; j <= 6 ; j++) {
           delay (200) ;
        digitalWrite (j, HIGH) ; // éteint la DEL reliée à la broche i
        
      }*/

       for (byte j = 2 ; j <= 6 ; j++) {
         delay (300) ;
        digitalWrite (j, LOW) ; // éteint la DEL reliée à la broche i
         
      }

       for (byte j = 2 ; j <= 6 ; j++) {
         delay (300) ;
        digitalWrite (j, HIGH) ; // éteint la DEL reliée à la broche i
      
      }


     
      
    }



  void test (){
      // Boucle pour faire flasher les DEL
      for (byte i = 7 ; i <= 11 ; i++) {
    //  digitalWrite (i, HIGH) ; // allume la DEL sur broche i
    etatBouton = digitalRead(i);
 if (etatBouton == HIGH) {
     Serial.print("non : ");
   Serial.print(i);
   Serial.print(" ");
    Serial.println(etatBouton);
        for(int compteur = 0 ; compteur < 2 ; compteur++)
{
                digitalWrite (i-5, LOW) ;
     delay (100) ;
      digitalWrite (i-5, HIGH) ;
      delay (100) ;
}
        delay (1000) ; // durée du flash 50 millisecondes
       
 }else{
    
  Serial.print("oui : ");
   Serial.print(i);
   Serial.print(" ");
    Serial.println(etatBouton);
  
   digitalWrite (i-5, LOW) ;
   
    delay (1000) ; // durée du flash 50 millisecondes
 }
      }
          
    

     for (byte j = 2 ; j <= 6 ; j++) {
        digitalWrite (j, HIGH) ; // éteint la DEL reliée à la broche i
      }
     

       delay (1000) ; // durée du flash 50 millisecondes
       
    
      // Recommence la séquence
     }


   
    // Fonction loop
    void loop () {


       test();
      
        
  /*    // Extinction de toutes les DEL au départ du programme
      for (byte i = 2 ; i <= 6 ; i++) {
        digitalWrite (i, HIGH) ; // éteint la DEL reliée à la broche i
      }*/
   
    }

Tu devrais suivre le conseil de le sept et formater ton code correctement, parce que là c'est difficile de suivre ce que ton programme est supposé faire.

Attention ce testeur est vraiment très rudimentaire. En connectant les fils à tester à la masse, tu ne peux pas voir les fils qui seraient en court-circuit ou ceux qui seraient croisés

kamill:
Tu devrais suivre le conseil de le sept et formater ton code correctement, parce que là c'est difficile de suivre ce que ton programme est supposé faire.

j'ai essayer de faire mieux a toi de dire :

int etatBouton;


// Initialisation des lignes 2 à 6 en sortie
void setup () {
  Serial.begin(9600);



  for (byte j = 2 ; j <= 6 ; j++) {
    pinMode (j, OUTPUT) ; ; // led
  }

  for (byte i = 7 ; i <= 11 ; i++) {
    pinMode (i, INPUT_PULLUP) ; // ports
  }

  // test des leds
  for (byte j = 2 ; j <= 6 ; j++) {
    delay (300) ;
    digitalWrite (j, LOW) ; // éteint la DEL reliée à la broche i

  }

  for (byte j = 2 ; j <= 6 ; j++) {
    delay (300) ;
    digitalWrite (j, HIGH) ; // allume la DEL reliée à la broche i

  }

  // fin du test des leds
}



void test () {
  for (byte i = 7 ; i <= 11 ; i++) { //c'est une boucle qui verifie tous les ports ou sont branchés les cables
    etatBouton = digitalRead(i); //verifie si le cable est branché ou pas
    if (etatBouton == HIGH) {
      Serial.print("non : ");
      Serial.print(i);
      Serial.print(" ");
      Serial.println(etatBouton);
      for (int compteur = 0 ; compteur < 2 ; compteur++) // bouclz clignotement led pour fil déebranché
      {
        digitalWrite (i - 5, LOW) ;
        delay (100) ;
        digitalWrite (i - 5, HIGH) ;
        delay (100) ;
      }
      delay (1000) ;

    } else {

      Serial.print("oui : ");
      Serial.print(i);
      Serial.print(" ");
      Serial.println(etatBouton);

      digitalWrite (i - 5, LOW) ;

      delay (1000) ;
    }
  }

 delay (5000) ; // durée du flash 50 millisecondes


  for (byte j = 2 ; j <= 6 ; j++) {
    digitalWrite (j, HIGH) ; // éteint toutes les DEL 
  }


 

  // Recommence la séquence
}



// Fonction loop
void loop () {


  test();


}

fdufnews:
Attention ce testeur est vraiment très rudimentaire. En connectant les fils à tester à la masse, tu ne peux pas voir les fils qui seraient en court-circuit ou ceux qui seraient croisés

c'est un faisceau qui n'est pas connecté, juste un test de continuité.

Pour gérer le clignotement, il faut que tu sépares le test de l'affichage.
Tu testes les entrées et tu mémorises le résultat dans une table puis tu affiches sur les leds en fonction de cette table.
Par exemple:

void test () {
  static bool etat[5] = {0};
  static unsigned long millisLastClig = 0;

  for (byte i = 0 ; i < 5 ; i++) { //c'est une boucle qui verifie tous les ports ou sont branchés les cables
    etatBouton = digitalRead(i + 7); //verifie si le cable est branché ou pas
    if (etatBouton == HIGH) {
      Serial.print("non : ");
      Serial.print(i);
      Serial.print(" ");
      Serial.println(etatBouton);
      etat[i] = false;
    } else {
      Serial.print("oui : ");
      Serial.print(i);
      Serial.print(" ");
      Serial.println(etatBouton);
      etat[i] = true;
    }
  }

  // affichage sur les leds
  if (millis() - millisLastClig >= 500)
  {
    millisLastClig = millis();
    for (byte i = 0; i < 5; i++)
    {
      if (etat[i])
        digitalWrite(i + 2, LOW); // ok
      else
        digitalWrite(i + 2, !digitalRead(i + 2)); // erreur -> clignotement
    }
  }
}

+1 avec la remarque de fdufnews, ce test est vraiment rudimentaire.

kamill:
Pour gérer le clignotement, il faut que tu sépares le test de l'affichage.
Tu testes les entrées et tu mémorises le résultat dans une table puis tu affiches sur les leds en fonction de cette table.

+1 avec la remarque de fdufnews, ce test est vraiment rudimentaire.

malheureusement je debute donc je fait avec ce que je connais donc ca limite le programme apres j'ai trouvé ca sur le forum mais j'ai rien compris.

// pour test de cable entre 1 et 16 extremités de conducteurs
byte end[32] = {7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 26, 27, 29, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42}; // au  pif pour affecter les pins arduino aux extremités
unsigned long motok[32]={2048,0,0,0,0,0,0,0,0,0,0,4226809856,4226809856,4226809856,4226809856,4226809856,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // motif attendu
unsigned long motif=0;
byte ett=5; // nb extremités
byte cablok=0;
void setup() {

  Serial.begin(57600);
}

void loop() {
  motif=0;
  cablok=0;
  for (int i = 0; i < ett; i++) {

    for (int j = 0; j < ett; j++) {
      pinMode(end[j], INPUT);   // tous les pins en entrée

    }

    pinMode(end[i], OUTPUT);  // un seul pin en sortie

    digitalWrite(end[i], HIGH); // le pin en sortie est mis à HIGH = injection

    Serial.println(); // saut de ligne
    if ((i + 1) < 10) Serial.print("0"); // pour alignement
    Serial.print(i + 1);
    Serial.print(" ");
    for (int k = 0; k < ett; k++) { // scan


      if (digitalRead(end[k]) == HIGH) {
        // faire si etat haut trouvé

        Serial.print("| ");
        motif=motif+1; // +1 sur motif lu
      }
      else { // faire si etat bas trouvé
        Serial.print(". ");
      }
motif = motif << 1; // decalage gauche 1
    }
Serial.print("  ");

Serial.print(motif,DEC);

if (motif == motok[i]) Serial.print(" PASS  ");
 else {Serial.print(" FAIL  ");
 cablok=cablok+1;}
Serial.print(motok[i]);
 }
 
 
  Serial.println();
  //cablok=0;
  Serial.print(" ---------------------------------------------------------------------------------------> ");
  if (cablok==0) Serial.print(" OK CABLE CONFORME ");
  else {
    Serial.print(cablok);
    Serial.print(" EXTREMITES EN DEFAUT ");
    }
  Serial.println();
  Serial.println();
  delay(2000);
  Serial.println("   0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3   MOTIF LU          ATTENDU");
  Serial.print("IN 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2      DEC");

   delay (6000) ; // durée du flash 50 millisecondes
}

Pour faire un test complet du câble, il faut un I/O par extrémité de fil.
On teste les fils un par un.
On applique un niveau sur une extrémité et on contrôle qu'il n'y a qu'une et une seule autre extrémité qui est active.
Et on balaye ainsi tous les fils.

bon finalement j'ai trouvé une superbe solution avec des leds programmables et des transistors

sur le principe j'ai separer tris bande de led une voir la broche activée la deuxieme bande led endroit ou on teste le fil et troisieme bande led le resultat du fil.

ca teste fil croisé et fil coupé je vais rajouter le court circuit.

si vous voyez de versions plus courtes ou plus simples a modifier, je suis preneur.

j'avoue un peu le bordel le cablage

et le code

#include <Adafruit_NeoPixel.h>

// appel de la bibliothèque

#define sortie 2                                           // affectation des broches
#define nb_led 18                                         // le module comporte 8 led

int etatBouton;
int i;
int o;
int f;
int t;
int L;
int M;
int P;
int trouve;
int endroit;
int led;



Adafruit_NeoPixel module = Adafruit_NeoPixel(nb_led, sortie, NEO_GRB + NEO_KHZ800);  // création de l'objet module

void setup()
{
  module.begin(); // initialisation de module
  Serial.begin(9600);

  for (byte i = 8 ; i <= 12 ; i++) {
    pinMode (i, INPUT_PULLUP) ; // éteint la DEL reliée à la broche i
  }


  for (byte t = 3 ; t <= 7 ; t++) {
    pinMode (t, OUTPUT) ; ; // éteint la DEL reliée à la broche i
  }

}

void loop()
{
  led = 12;

  for (byte i = 8 ; i <= 12 ; i++) { // boucle iutput
    trouve = 0;
    endroit = i;
    module.setPixelColor(i - 8, 150, 0, 0);
    module.show();

    for (byte f = 8 ; f <= 12 ; f++) { // boucle test fil
      digitalWrite (f - 5, HIGH) ; // active trnasistor
      etatBouton = digitalRead(i);

      if (etatBouton == LOW) {
        module.setPixelColor(f - 2, 73, 255, 0);
        module.show();
        trouve = f;
      }
      else {
        module.setPixelColor(f - 2, 150, 0, 0);
        module.show();
      }
      digitalWrite (f - 5, LOW);
      //    delay (100) ;
    } // fin boucle test fil suivant
    for (int P = 3; P < 7; P++) {
      digitalWrite (P, LOW);
    }




    if (trouve == endroit) {
      // bon endroit
      module.setPixelColor(led, 73, 255, 0);
      module.show();
      /*  Serial.print(endroit);
        Serial.println(trouve);*/
      led++;
    }
    else if (trouve > endroit) {
      // croise
      module.setPixelColor(led, 255, 154, 0);
      module.show();
      /*  Serial.print(endroit);
        Serial.println(trouve);*/
      led++;
    }
    else if (trouve < endroit) {

      if  (trouve == 0) {
        // croise
        module.setPixelColor(led, 150, 0, 0);
        module.show();
        /*   Serial.print(endroit);
           Serial.println(trouve);*/
        led++;
      }

      else {   // croise
        module.setPixelColor(led, 255, 154, 0);
        module.show();
        Serial.print(endroit);
        Serial.println(trouve);
        led++;
      }
    }




    //  delay (500) ; // pause fin de la boucle premier fil
    for (int L = 6; L < 11; L++)                             // 3 premières led en bleu
    {
      module.setPixelColor(L, 0, 0, 0);
      module.show();

    } // boucle input
    for (int M = 0; M < 5; M++)                             // 3 premières led en bleu
    {
      module.setPixelColor(M, 0, 0, 0);
      module.show();
    }

  }

  delay (5000) ; // pause fin test
  for (int M = 12; M < 17; M++)                             // 3 premières led en bleu
  {
    module.setPixelColor(M, 0, 0, 0);
    module.show();
  }
} // boucle loop

A qui servent les transistors?
Sans résistance dans la base ni dans le collecteur ils ne vont pas durer longtemps.