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.
Défi
MoyenLe 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 avecshowDigit() - 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;
}
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
1Afficheurs à sept segments
Afficheur à sept segmentsMotifs de chiffres en octetsCompter sur l’afficheurCompte à rebours jusqu’à zéroLanceur de désEntraînez-vous par vous-même : Playground Arduino