Tutoriel pour deux dés
retour conception page 1
Organisation des leds :
Avec 2 dés, il faut gérer l'affichage de 14 leds avec seulement 7 sorties Arduino.
Le dispositif est similaire avec une double connexion des 7 pins sur les leds symétriques des deux dés.
Nous utilisons deux transistors NPN(Explication composant pnp) avec 3 pattes, qui laissent passer le courant aux extrémités lorsque nous envoyons du courant sur la patte centrale. Nous raccordons aux sorties 10 et 11 chacun des transistors. toutes les cathodes (-) d'un dés sont rattachées à une patte extérieur du composant NPN. la patte libre est connectée au GND (-).
Pour afficher un chiffre différent, on éteint un dés et on allume l'autre ensuite on alterne. Ce fonctionnement impose un affichage, continu en alternance de chaque dés.
Le dispositif est similaire avec une double connexion des 7 pins sur les leds symétriques des deux dés.
Nous utilisons deux transistors NPN(Explication composant pnp) avec 3 pattes, qui laissent passer le courant aux extrémités lorsque nous envoyons du courant sur la patte centrale. Nous raccordons aux sorties 10 et 11 chacun des transistors. toutes les cathodes (-) d'un dés sont rattachées à une patte extérieur du composant NPN. la patte libre est connectée au GND (-).
Pour afficher un chiffre différent, on éteint un dés et on allume l'autre ensuite on alterne. Ce fonctionnement impose un affichage, continu en alternance de chaque dés.
le script de fonctionnement pour les deux dés est le suivant :
//organisation des dès avec sorties :
// 6 4
// 7 5 3
// 8 2
int butPin = 9; // bouton
int transi1 = 10; // transistor 1
int transi2 = 11; // transistor 2
byte dede[8][7] ={
//2 3 4 5 6 7 8
{0,0,0,0,0,0,0}, // 0 rien
{0,0,0,1,0,0,0}, // 1
{1,0,0,0,1,0,0}, // 2
{0,0,1,1,0,0,1}, // 3
{1,0,1,0,1,0,1}, // 4
{1,0,1,1,1,0,1}, // 5
{1,1,1,0,1,1,1}, // 6
{1,1,1,1,1,1,1}, // 7 tout
};
byte resultatloto[2][30]; // remplissage du résultat des deux dès lancés
int resultdesun=0;
int resultdesdeux=0;
int attenteboucle = 5; //10 en standard = calcul la vitesse de changement
void setup()
{
int i;
for (i=2; i<9; i++) pinMode(i,OUTPUT); // led pins
pinMode(transi1,OUTPUT);
pinMode(transi2,OUTPUT);
pinMode(butPin,INPUT);
digitalWrite(butPin, HIGH); // indispensable pour la lecture du switch proto
// start/stop button
turnOnNumber(0);
randomSeed(analogRead(0)); // initialise le random
Serial.begin(9600);
}
void loop()
{
Lancedes();
}
void Lancedes()
{
int n,i;
int loto1;
int loto2;
int maxi =15;
int delay1;
int resultat = 10;
int ancienresultat = 10; // empeche deux fois le meme nombre
// test bouton si actionné
if (digitalRead(butPin) == HIGH)
{
// Calcul et chargement du résultat dans resultatloto (tableau des resultats)
randomSeed(analogRead(0)); // initialise le random
loto1 = random(5,maxi);
randomSeed(analogRead(1)); // initialise le random
loto2 = random(5,maxi);
for (n=0; n < maxi;n++)
{
while (resultat == ancienresultat) resultat=random(1,7);
ancienresultat=resultat;
if (n<loto1) resultatloto[0][n]=resultat;
else resultatloto[0][n]=0;
}
// resultat final sur premier dés
resultdesun = resultatloto[0][loto1-1];
for (n=0; n < maxi ;n++)
{
while (resultat == ancienresultat) resultat=random(1,7);
ancienresultat=resultat;
if (n<loto2) resultatloto[1][n]=resultat;
else resultatloto[1][n]=0;
}
// resultat final sur deuxième dés
resultdesdeux = resultatloto[1][loto2-1];
// affichage des résultats
if (loto1<loto2) maxi = loto2; // determine la boucle max pour les deux dès
else maxi = loto1;
// boucle avec affichage de plus en plus lent
for (n=0; n<maxi; n++)
{
delay1=(n+1) * 2;
for (i=0;i<delay1;i++)
{
if (resultatloto[0][n] != 0)
{
resultdesun = resultatloto[0][n];
}
else
{
resultdesun = resultatloto[0][loto1-1];
}
if (resultatloto[1][n]!=0)
{
resultdesdeux = resultatloto[1][n];
}
else
{
resultdesdeux = resultatloto[1][loto2-1];
}
// Serial.println(resultdesun);
// Serial.println(resultdesdeux);
digitalWrite(transi1,HIGH);
digitalWrite(transi2,LOW);
turnOnNumber(resultdesun);
delay(attenteboucle);
digitalWrite(transi2,HIGH);
digitalWrite(transi1,LOW);
turnOnNumber(resultdesdeux);
delay(attenteboucle);
}
}
}
digitalWrite(transi1,HIGH);
digitalWrite(transi2,LOW);
turnOnNumber(resultdesun);
delay(attenteboucle);
digitalWrite(transi2,HIGH);
digitalWrite(transi1,LOW);
turnOnNumber(resultdesdeux);
delay(attenteboucle);
}
// ***** set up leds corresponding the number *****
void turnOnNumber(int n)
{
int i;
for(i=0;i<7;i++) //n en décalage de 1 lié à la gestion tableau qui commence à0
{
if (dede[n][i]==0) digitalWrite(i+2, LOW);
else digitalWrite(i+2, HIGH);
}
}