1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| char* filsNoms[] = {"Rouge", "Bleu", "Jaune", "Vert", "xxx"};
#define filsNombre 4 // Nombre de fils
#define testNombre 4 // Nombre de boucles de test
#define ledOn LOW // Quel etat pour allumer la diode
byte ledsPin[] = {8, 9, 10, 11}; // Liste des ports des LED
byte entreesPinBase[] = {4, 5, 6, 7}; // Liste des ports en entrée position de base
byte entreesPin[filsNombre]; // Liste des ports en entrée de travail, éventuellement mélangé
int filsPosition[filsNombre]; // Position des fils
#define entreesMalangees true // S'il faut mélanger les entrées
void setup()
{
Serial.begin(115200);
for (byte i = 0; i < filsNombre; i++)
{
pinMode(ledsPin[i], OUTPUT);
digitalWrite(ledsPin[i], !ledOn); // Eteindre la LED
pinMode(entreesPin[i], INPUT_PULLUP);
entreesPin[i] = entreesPinBase[i]; // Entrées fils dans tableau de travail
}
if (entreesMalangees) {entreesPinMelange();}
for (byte r = 0; r < filsNombre; r++)
{
Serial.print(entreesPin[r]);
}
Serial.println("");
}
void loop()
{
filsPositionRecherche();
for (byte fils = 0; fils < filsNombre; fils++)
{
if (filsPosition[fils] == fils) // Si le fil est à la bonne place
{digitalWrite(ledsPin[fils], ledOn);} // Allumage de la LED
else
{digitalWrite(ledsPin[fils], !ledOn);} // Allumage de la LED
}
Serial.print("\n");
for (byte fils = 0; fils < filsNombre; fils++) // Affichage des couleurs
{
Serial.print((String)filsNoms[fils] + "\t");
}
Serial.print("\n");
/*--------------------------------------------------------------------
Affichafe des couleurs en fonction de la connexion du fil
Si couleur an MAJUSCULES le fil est bin connecté
Si couleur en minusciles, le fil est connecté, mais pas à sa place
Si xxx, le fil n'est pas connecté.
----------------------------------------------------------------------
*/
for (byte fils = 0; fils < filsNombre; fils++) // Affichage des couleurs selon bra
{
Serial.print(filEtat(fils) + "\t");
}
Serial.print("\n");
delay(1000);
}
String filEtat(byte filIndex) // Retourne l'état du fil
{
String returnValeur = (String)filsNoms[filsPosition[filIndex]];
returnValeur.toLowerCase();
if (filsPosition[filIndex] == filIndex) // Si fil en bonne position
{
returnValeur.toUpperCase();
}
return returnValeur;
}
void filsPositionRecherche() // Recherche de la position des fils
{
for (byte fils = 0; fils < filsNombre; fils++)
{
filsPosition[fils] = filsNombre;
for (byte entree = 0; entree < filsNombre; entree++)
{
byte compteurTest = 0;
for (byte t = 0; t < testNombre; t++) // Boucle de test
{
digitalWrite(ledsPin[fils], !digitalRead(ledsPin[fils])); // Inverser la LED
if (digitalRead(entreesPin[entree]) == digitalRead(ledsPin[fils])) // Entre = etat LED ?
{compteurTest ++;}
}
if (compteurTest == testNombre) // Si une connexion a été trouvée
{
filsPosition[fils] = entree; // Mémoriser l'entrée
break;
}
}
}
}
/*-----------------------------------------------
'* Remplissage d'un tableau sans doublons
'*-----------------------------------------------
*/
void entreesPinMelange()
{
byte rndNumber;
byte rndIndex = 0;
boolean rndTest[filsNombre]; // Pour tester su la valeur est déjà tirée
for (byte r = 0; r < filsNombre; r++) // Tout le tableau de test à false
{rndTest[r] = false;}
while(rndIndex < filsNombre)
{
randomSeed(analogRead(0)); // Réinitialiser RND de l'Arduino
rndNumber = random(0, filsNombre);
if (rndTest[rndNumber] == false) // Si nombre hasard pas déjà tiré
{
entreesPin[rndIndex] = entreesPinBase[rndNumber]; // Mettre la pin dans le tableau de travail
rndTest[rndNumber] = true; // Enregistrer le numéro comme tiré
rndIndex ++;
}
}
} |
Partager