Menu
CoddyTech

Lanceur de dés

Fait partie de la section Écrans et capteurs du Journey Arduino de Coddy. Leçon 5 sur 24.

random(1, 7) choisit un nombre entier de 1 à 6. Le premier nombre est la valeur la plus basse que tu peux obtenir ; le second est supérieur de un à la valeur la plus élevée.

La carte ne contient aucun véritable hasard. random() calcule chaque nombre à partir du précédent, en commençant par un nombre appelé germe. Avec le même germe, elle donne les mêmes nombres à chaque exécution : tes dés afficheraient 2, 2, 6, 3 à chaque mise sous tension.

randomSeed() définit le germe. Donne-lui une valeur qui change d’une exécution à l’autre, comme l’heure du premier appui sur le bouton. micros() compte en millionièmes de seconde, et personne n’appuie deux fois au même microseconde près :

if (!seeded) {
  randomSeed(micros());
  seeded = true;
}
int roll = random(1, 7);

Initialiser le germe dans setup() ne sert à rien : setup() s’exécute à la même microseconde après chaque mise sous tension.

challenge icon

Défi

Moyen

Le bouton est sur la broche 10 et le code de démarrage détecte déjà le moment où on l’enfonce. Fabrique un dé :

  • à chaque pression, choisis random(1, 7) et affiche le résultat avec showDigit()
  • uniquement lors de la première pression, appelle randomSeed(micros()) pour que les résultats changent d’une exécution à l’autre

Appuie sur Run et appuie quelques fois sur le bouton, puis sur Check.

Essayez vous-même

const int segmentPins[7] = {2, 3, 4, 5, 6, 7, 8};  // a, b, c, d, e, f, g

// Un motif par chiffre, à lire depuis la droite : le dernier bit correspond au segment a.
//                     gfedcba
const byte digits[10] = {
  0b0111111,  // 0
  0b0000110,  // 1
  0b1011011,  // 2
  0b1001111,  // 3
  0b1100110,  // 4
  0b1101101,  // 5
  0b1111101,  // 6
  0b0000111,  // 7
  0b1111111,  // 8
  0b1101111   // 9
};

void showDigit(int n) {
  for (int i = 0; i < 7; i++) {
    if (bitRead(digits[n], i) == 1) {
      digitalWrite(segmentPins[i], LOW);   // allumé
    } else {
      digitalWrite(segmentPins[i], HIGH);  // éteint
    }
  }
}

const int buttonPin = 10;
bool wasPressed = false;
bool seeded = false;

void setup() {
  for (int i = 0; i < 7; i++) {
    pinMode(segmentPins[i], OUTPUT);
  }
  pinMode(buttonPin, INPUT_PULLUP);
  showDigit(0);
}

void loop() {
  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed != wasPressed) {
    if (pressed) {
      // le bouton vient d’être enfoncé : tire un nombre de 1 à 6 et affiche-le
    }
    delay(50);  // laisse le temps au bouton de se stabiliser
  }
  wasPressed = pressed;
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Écrans et capteurs

Entraînez-vous par vous-même : Playground Arduino