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 130 131 132 133 134 135 136 137
| /*
Câblage
_______
|
|
Dest O-----<<-----[] (INPUT_PULLUP)
|
|
Src O----->>-----[] (OUTPUT)
| |
| |
| -
_______| [LED]
+
|
[R220]
|
|
+5V
quand on met Src à LOW (LED_ON), la LED s'allume
quand on met Src à HIGH (LED_OFF), la LED s'éteint
Si on relie []*de Src et []*de Dest et que Src est LOW (LED_ON), la LED s'allume et DEST voit LOW
Si on relie []*de Src et []*de Dest et que Src est HIGH (LED_OFF), la LED s'éteint et DEST voit HIGH
*/
#define LED_OFF HIGH
#define LED_ON LOW
// les pins à mettre en correspondance
const uint8_t pinLEDSource[] = {30, 32, 34};
uint8_t pinDestination[] = {31, 33, 35}; // pas const car on va le mélanger
const size_t nombreDeFils = sizeof(pinLEDSource) / sizeof(pinLEDSource[0]);
enum : uint8_t {NOUVEAU_JEU, JEU_EN_COURS, VICTOIRE} etat;
void imprime()
{
for (size_t i = 0; i < nombreDeFils; i++) {
Serial.print(F("{"));
Serial.print(pinLEDSource[i]);
Serial.print(F(" <<->> "));
Serial.print(pinDestination[i]);
Serial.print(F("} "));
}
Serial.println();
}
bool cablageCorrect()
{
// on fait clignoter la Source et on regarde si on voit ce signal sur la destination
const uint8_t nombreDeClignotements = 3;
size_t nbFilsCorrects = 0;
for (size_t unFil = 0; unFil < nombreDeFils; unFil++) {
bool erreur = false;
for (uint8_t n = 0; n < nombreDeClignotements; n++) {
digitalWrite(pinLEDSource[unFil], LED_ON);
erreur = (digitalRead(pinDestination[unFil]) != LED_ON);
if (erreur) break;
digitalWrite(pinLEDSource[unFil], LED_OFF);
erreur = (digitalRead(pinDestination[unFil]) != LED_OFF);
if (erreur) break;
}
if (erreur) {
digitalWrite(pinLEDSource[unFil], LED_OFF);
} else {
// le fil est bon on laisse la LED allumée
digitalWrite(pinLEDSource[unFil], LED_ON);
nbFilsCorrects++;
}
} // fin de pour chaque fil
return (nbFilsCorrects == nombreDeFils);
}
void melange()
{
// algo cf https://fr.wikipedia.org/wiki/Mélange_de_Fisher-Yates
for (size_t i = nombreDeFils - 1; i >= 1; --i) {
size_t j = random(0, i + 1);
uint8_t echange = pinDestination[i];
pinDestination[i] = pinDestination[j];
pinDestination[j] = echange;
}
}
// -----------------
void setup() {
Serial.begin(115200);
randomSeed(analogRead(A0));
for (size_t i = 0; i < nombreDeFils; i++) {
pinMode(pinLEDSource[i], OUTPUT);
digitalWrite(pinLEDSource[i], LED_OFF);
pinMode(pinDestination[i], INPUT_PULLUP);
}
etat = NOUVEAU_JEU;
}
void loop()
{
switch (etat) {
case NOUVEAU_JEU:
melange();
imprime();
etat = JEU_EN_COURS;
break;
case JEU_EN_COURS:
if (cablageCorrect()) etat = VICTOIRE;
delay(500);
break;
case VICTOIRE:
Serial.println(F("VICTOIRE"));
for (uint8_t n = 0; n < 20; n++) {
for (size_t i = 0; i < nombreDeFils; i++)
digitalWrite(pinLEDSource[i], LED_OFF);
delay(50);
for (size_t i = 0; i < nombreDeFils; i++)
digitalWrite(pinLEDSource[i], LED_ON);
delay(50);
}
etat = NOUVEAU_JEU;
break;
}
} |
Partager