Bonjour !
J'ai pour projet de faire un générateur de 4 dés (un de 4 faces, un de 6, un de 10 et un de 20), avec deux afficheurs 7 segments à cathode communes, reliés chacun à des décodeur à 7 segments CD4511.
( J'ai tenté de n'utiliser qu'un décodeur en reliant les segments des deux afficheurs entre eux, et avec des transistors pour commuter le courant, pour un compteur j'ai parfaitement réussit, mais impossible d'afficher les résultats des chiffres randoms sur les deux afficheurs en même temps. Seulement un chiffre apparait.)
Donc pour cette version, avec 2 interrupteurs à glissière, je pense faire varier les positions pour générer les 4 dés, et avec un bouton je pense lancer les randoms. `
Lorsque les interrupteurs sont modifiés, j'aimerais qu'un chiffre apparaisse. Le chiffre de la position correspond à celle du dé. Le seul petit soucis c'est que je souhaiterai que "le chiffre du type de dé", n'apparaisse que lorsque je change la position des interrupteurs, et qu'au début de la mise sous tension du programme, (selon la position des interrupteurs.)
Mais pour le moment, une fois le résultat du dé affichés, ce dernier reste le temps du delay, mais ensuite le chiffre du "type de dé" réapparait, normal puisque ça fait partie de la première condition. Ca semble un peu bête comme ça, j'ai tenté plusieurs choses, mais je ne vois pas comment je pourrais faire.
En faites, j'aimerais qu'une fois que le lancer random soit fait, le résultat reste visible jusqu'à ce qu'un nouveau lancer soit fait, ou bien que les interrupteurs soit modifiés, et que dans ce cas le chiffre du type de dé soit visible.
Merci d'avance pour votre temps !
Ludo
#define DECODEUR_1A 2 // les broches des deux décodeurs
#define DECODEUR_1B 3
#define DECODEUR_1C 4
#define DECODEUR_1D 5
#define DECODEUR_2A 6
#define DECODEUR_2B 7
#define DECODEUR_2C 8
#define DECODEUR_2D 9
#define buttonPin 13 // le bouton
#define interr_1 10 // le 1er interrupteur
#define interr_2 11 // le 2nd interrupteur
char dice5; // 5 variables pour les lancés de dés
char dice4;
char dice3;
char dice2;
char dice1;
bool buttonState = LOW; // l'état de base du bouton
void setup()
{
for (int i = 2; i <= 9; i++)
pinMode(i, OUTPUT); // les broches des décodeurs en sorties
pinMode(interr_1, INPUT); // les interrupteurs et le bouton en entrée
pinMode(interr_2, INPUT);
pinMode(buttonPin, INPUT);
digitalWrite(interr_1, HIGH); // état haut de base pour les interrupteurs et le bouton
digitalWrite(interr_2, HIGH);
digitalWrite(buttonPin, HIGH);
}
void loop()
{
dice5 = random(1, 7); // le dé 5 a 6 faces
dice4 = random(1, 5); // le dé 4 a 4 faces
dice3 = random(1, 3); // le dé 3 a 2 faces
dice2 = random(1, 11); // le dé 2 a 10 faces
dice1 = random(1, 4); // le dé 1 a 3 faces
buttonState = digitalRead (buttonPin);
//D4
/*
si les 2 intterupteurs ont une des quatres positions,
(HIGH HIGH, LOW LOW, HIGH LOW et LOW HIGH), alors,
les afficheurs affichent dabord le "type de dé", donc
4 pour le dé 4, 6 pour le dé 6, 10 pour le dé 10, et
20 pour le dé 20.
Puis si les interrupteurs ont le positionnement du dé 20,
par exemple, alors un chiffre aléatoire de 0 à 2 apparait
sur l'afficheur des dizaines, et de 1 à 9 sur l'afficheur
des unités.
(les dés 4 et 6 n'affichent que sur l'afficheur des unités.)
*/
if (digitalRead(interr_1) == HIGH && digitalRead(interr_2) == LOW)
{
Aoff(); // fonction qui va éteindre toutes les LED sur le 1er afficheur
Bfour(); // fonction qui va allumer le chiffre 4 sur les LED du 2nd afficheur
if (digitalRead(interr_1) == HIGH && digitalRead(interr_2) == LOW && digitalRead(buttonPin) == LOW)
{
// si les interrupteurs sont dans la 1ère position, et le bouton, appuyé
mix2(); // fonction qui appelle différents chiffre pour faire le roulement du dé.
switch (dice4)
{
case 1 : // affichage des chiffres selon les résultats des dés
Bone();
break;
case 2 :
Btwo();
break;
case 3 :
Bthree();
break;
case 4 :
Bfour();
break;
}
delay(1500);
}
}
//D6
else if (digitalRead(interr_1) == HIGH && digitalRead(interr_2) == HIGH ) // position des interrupteurs pour le D6
{
Aoff();
Bsix ();
if (digitalRead(interr_1) == HIGH && digitalRead(interr_2) == HIGH && buttonState == LOW)
{
mix2();
switch (dice5)
{
case 1 :
Bone();
break;
case 2 :
Btwo();
break;
case 3 :
Bthree();
break;
case 4 :
Bfour();
break;
case 5 :
Bfive();
break;
case 6 :
Bsix();
break;
}
delay(1500);
}
}
//D10
else if (digitalRead(interr_1) == LOW && digitalRead(interr_2) == HIGH)
{
Aone();
Bzero();
if (digitalRead(interr_1) == LOW && digitalRead(interr_2) == HIGH && buttonState == LOW)
{
mix2();
while (dice3 == 2 && dice2 >= 2) { // tant qu'on un résultat de 11 à 19, on relance des jets de dés
dice2 = random(1, 11);
dice3 = random(1, 3);
}
while (dice2 == 1 && dice3 == 1 ) { // tant qu'on un résultat égal à 0, on relance des jets de dés
dice2 = random(1, 11);
dice3 = random(1, 3);
}
switch (dice2)
{
case 1 :
Bzero();
break;
case 2 :
Bone();
break;
case 3 :
Btwo();
break;
case 4 :
Bthree();
break;
case 5 :
Bfour();
break;
case 6 :
Bfive();
break;
case 7 :
Bsix();
break;
case 8 :
Bseven();
break;
case 9 :
Beight();
break;
case 10 :
Bnine();
break;
}
switch (dice3)
{
case 1 :
Aoff ();
break;
case 2 :
Aone();
break;
}
delay(1500);
}
}
//D20
else if (digitalRead(interr_1) == LOW && digitalRead(interr_2) == LOW)
{
Atwo();
Bzero();
if (digitalRead(interr_1) == LOW && digitalRead(interr_2) == LOW && digitalRead(buttonPin) == LOW)
{
mix();
while (dice1 == 2 && dice2 >= 2) {
dice2 = random(1, 11);
dice1 = random(1, 4);
}
while (dice2 == 1 && dice1 == 3 ) {
dice2 = random(1, 11);
dice1 = random(1, 4);
}
switch (dice2)
{
case 1 :
Bzero();
break;
case 2 :
Bone();
break;
case 3 :
Btwo();
break;
case 4 :
Bthree();
break;
case 5 :
Bfour();
break;
case 6 :
Bfive();
break;
case 7 :
Bsix();
break;
case 8 :
Bseven();
break;
case 9 :
Beight();
break;
case 10 :
Bnine();
break;
}
switch (dice1)
{
case 1 :
Aone();
break;
case 2 :
Atwo();
break;
case 3 :
Aoff ();
break;
}
delay(1500);
}
}
}
void mix() // fonction d'un premier mélange de chiffre avant le résultat final
{
Aone();
Bsix();
delay(200);
off();
Atwo();
Bzero();
delay(200);
off();
Azero();
Bfour();
delay(200);
off();
Aone();
Bthree();
delay(200);
off();
Azero();
Btwo();
delay(200);
off();
Azero();
Bone();
delay(200);
off();
Azero();
Bzero();
delay(200);
off();
delay(200);
Azero();
Bzero();
delay(200);
off();
delay(200);
Azero();
Bzero();
delay(200);
off();
delay(200);
Azero();
Bzero();
delay(200);
off();
delay(400);
}
void mix2() // 2e mélange de chiffre pour les chiffres 4 et 6, avant le résultat final
{
Bsix();
delay(200);
off();
Bfive();
delay(200);
off();
Bfour();
delay(200);
off();
Bthree();
delay(200);
off();
Btwo();
delay(200);
off();
Bone();
delay(200);
off();
Bzero();
delay(200);
off();
delay(200);
Bzero();
delay(200);
off();
delay(200);
Bzero();
delay(200);
off();
delay(200);
Bzero();
delay(200);
off();
delay(400);
}
void off()
{
digitalWrite (DECODEUR_1A, HIGH);
digitalWrite (DECODEUR_1B, HIGH);
digitalWrite (DECODEUR_1C, HIGH);
digitalWrite (DECODEUR_1D, HIGH);
digitalWrite (DECODEUR_2A, HIGH);
digitalWrite (DECODEUR_2B, HIGH);
digitalWrite (DECODEUR_2C, HIGH);
digitalWrite (DECODEUR_2D, HIGH);
}
void Aoff ()
{
digitalWrite (DECODEUR_1A, HIGH);
digitalWrite (DECODEUR_1B, HIGH);
digitalWrite (DECODEUR_1C, HIGH);
digitalWrite (DECODEUR_1D, HIGH);
}
void Azero()
{
digitalWrite (DECODEUR_1A, LOW);
digitalWrite (DECODEUR_1B, LOW);
digitalWrite (DECODEUR_1C, LOW);
digitalWrite (DECODEUR_1D, LOW);
}
void Aone()
{
digitalWrite (DECODEUR_1A, HIGH);
digitalWrite (DECODEUR_1B, LOW);
digitalWrite (DECODEUR_1C, LOW);
digitalWrite (DECODEUR_1D, LOW);
}
void Atwo()
{
digitalWrite (DECODEUR_1A, LOW);
digitalWrite (DECODEUR_1B, HIGH);
digitalWrite (DECODEUR_1C, LOW);
digitalWrite (DECODEUR_1D, LOW);
}
void Bzero()
{
digitalWrite (DECODEUR_2A, LOW);
digitalWrite (DECODEUR_2B, LOW);
digitalWrite (DECODEUR_2C, LOW);
digitalWrite (DECODEUR_2D, LOW);
}
void Bone()
{
digitalWrite (DECODEUR_2A, HIGH);
digitalWrite (DECODEUR_2B, LOW);
digitalWrite (DECODEUR_2C, LOW);
digitalWrite (DECODEUR_2D, LOW);
}
void Btwo()
{
digitalWrite (DECODEUR_2A, LOW);
digitalWrite (DECODEUR_2B, HIGH);
digitalWrite (DECODEUR_2C, LOW);
digitalWrite (DECODEUR_2D, LOW);
}
void Bthree()
{
digitalWrite (DECODEUR_2A, HIGH);
digitalWrite (DECODEUR_2B, HIGH);
digitalWrite (DECODEUR_2C, LOW);
digitalWrite (DECODEUR_2D, LOW);
}
void Bfour()
{
digitalWrite (DECODEUR_2A, LOW);
digitalWrite (DECODEUR_2B, LOW);
digitalWrite (DECODEUR_2C, HIGH);
digitalWrite (DECODEUR_2D, LOW);
}
void Bfive()
{
digitalWrite (DECODEUR_2A, HIGH);
digitalWrite (DECODEUR_2B, LOW);
digitalWrite (DECODEUR_2C, HIGH);
digitalWrite (DECODEUR_2D, LOW);
}
void Bsix()
{
digitalWrite (DECODEUR_2A, LOW);
digitalWrite (DECODEUR_2B, HIGH);
digitalWrite (DECODEUR_2C, HIGH);
digitalWrite (DECODEUR_2D, LOW);
}
void Bseven()
{
digitalWrite (DECODEUR_2A, HIGH);
digitalWrite (DECODEUR_2B, HIGH);
digitalWrite (DECODEUR_2C, HIGH);
digitalWrite (DECODEUR_2D, LOW);
}
void Beight()
{
digitalWrite (DECODEUR_2A, LOW);
digitalWrite (DECODEUR_2B, LOW);
digitalWrite (DECODEUR_2C, LOW);
digitalWrite (DECODEUR_2D, HIGH);
}
void Bnine()
{
digitalWrite (DECODEUR_2A, HIGH);
digitalWrite (DECODEUR_2B, LOW);
digitalWrite (DECODEUR_2C, LOW);
digitalWrite (DECODEUR_2D, HIGH);
}