Projet pour lancer 4 dés différents

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

https://www.tinkercad.com/things/9lbCRkqOADT-d20d10d6d4/editel?sharecode=w0wqOhpfSAlRtQab0J9TJs0XryyPphiDQUu-1PBil3Q

#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);
}

c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement) et pour simplifier votre gestion des boutons, éventuellement utilisez la bibliothèque Button dans easyRun de @bricoleau ou OneButton de Matthias Hertel ou encore Toggle de @dlloyd.

Si j'ai bien compris, tu veux faire un tirage à chaque mise sous tension du µC ?
Dans ce cas, il suffit de position une variable "lancer" globale à 0 ou false.

Dans la loop tu test la valeur de la variable "lancer", si elle est à 1 ou true, tu fais juste un return ou un delay assez court.
juste après ta série de random, tu fais passer ta variable "lancer" à 1 ou true.

Si tu as un bouton ou un moyen de relancer le dé sans mettre hors/en tension, tu utilise toujours cette variable pour ne pas entrer dans la condition en passant la variable "lancer" à 0 ou false.

Je ne sais pas si je suis très clair :slight_smile: ?

un petit exemple avec affichage dans le moniteur série avec la bibliothèque Toggle

#include <Toggle.h>

constexpr byte pinLancer = 2;
constexpr byte pinChoix11 = A0;
constexpr byte pinChoix12 = A1;
constexpr byte pinChoix21 = A2;
constexpr byte pinChoix22 = A3;

Toggle boutonLancer(pinLancer);
Toggle switch11(pinChoix11);
Toggle switch12(pinChoix12);
Toggle switch21(pinChoix21);
Toggle switch22(pinChoix22);

// pas d'enum pour pouvoir faire des opérations bitwise
constexpr byte DES_INCONNU = 0;
constexpr byte  DES_4 = 0b0101;
constexpr byte  DES_6 = 0b0110;
constexpr byte  DES_10 = 0b1001;
constexpr byte  DES_20 = 0b1010;
byte des = DES_INCONNU;

void poll() {
  boutonLancer.poll();
  switch11.poll();
  switch12.poll();
  switch21.poll();
  switch22.poll();
}

void printDes() {
  switch (des) {
    case DES_4:  Serial.println("DES  4 FACES"); break;
    case DES_6:  Serial.println("DES  6 FACES"); break;
    case DES_10: Serial.println("DES 10 FACES"); break;
    case DES_20: Serial.println("DES 20 FACES"); break;
    default:     Serial.println("DES INCONNU."); break;
  }
}

void choixDes() {
  poll();
  bool changement = false;
  // on fait les 4 tests plutôt que tout en une fois pour forcer l'appel à onPress
  changement |= switch11.onPress();
  changement |= switch12.onPress();
  changement |= switch21.onPress();
  changement |= switch22.onPress();

  if (changement) {
    des =  ((digitalRead(pinChoix11) == LOW) ? 0b01u : 0b10u) << 2;
    des |= (digitalRead(pinChoix21) == LOW) ? 0b01u : 0b10u;
    printDes();
  }
}

int testLancer() {
  poll();
  int valeur = 0;
  if (boutonLancer.onPress()) {
    Serial.print(F("Lancer : "));
    switch (des) {
      case DES_4:  valeur = random(1, 5); break;
      case DES_6:  valeur = random(1, 7); break;
      case DES_10: valeur = random(1, 11); break;
      case DES_20: valeur = random(1, 21); break;
      default:     Serial.println("DES INCONNU."); break;
    }
    Serial.println(valeur);
    return valeur;
  }
  return 0;
}

void setup() {
  randomSeed(analogRead(A5));
  boutonLancer.begin(pinLancer);
  switch11.begin(pinChoix11);
  switch12.begin(pinChoix12);
  switch21.begin(pinChoix21);
  switch22.begin(pinChoix22);
  Serial.begin(115200);
}

void loop() {
  choixDes();
  testLancer();
}

excellent, merci beaucoup pour tes réponses, je vais approfondir tout ça =)

merci pour ta réponse,

non pas tout à fait, plutôt faire apparaitre le chiffre du "type de dé" selon les switch, puis faire un tirage à chaque fois que le bouton est appuyé, (selon la position du switch). Si le switch ne change pas de position, pouvoir rappuyer sur le bouton pour relancer des randoms. Si le switch change et ou revient sur la position précédente, rafficher le chiffre du "type de dé".

Je crois avoir bien compris l'idée de mettre une variable "lancer", true ou false. Mais j'avoue que je n'arrive pas à la mettre en place pour que tout fonctionne correctement.

vous avez étudié le code proposé plus haut ?
la fonction choixDes() regarde s'il y a eu un changement dans la configuration des 2 interrupteurs

ok, effectivement ce n'est pas ce que j'avais compris de ton code.

Si la notion de machine à état te parle, tu devrais t'orienter vers là.
Tu devrais aussi je pense t'orienter vers une librairie pour gérer tes boutons.
Car ton code est un peu "bordelique" :slight_smile:, avec notetament ce genre de code qui complexifie la lecture:

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)
    {

les états des boutons interr_1 et inter_2 sont peuvent changer pendant que tu éteint tes afficheurs ?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.