Menu
CoddyTech

Lancio dei dadi

Fa parte della sezione Display e sensori del percorso Arduino di Coddy. Lezione 5 di 24.

random(1, 7) sceglie un numero intero da 1 a 6. Il primo numero è il valore più basso che puoi ottenere; il secondo è uno in più del valore più alto.

La scheda non ha una vera casualità al suo interno. random() calcola ogni numero a partire da quello precedente, iniziando da un numero chiamato seme. Con lo stesso seme, restituisce gli stessi numeri a ogni esecuzione: i tuoi dadi farebbero 2, 2, 6, 3 ogni volta che li accendi.

randomSeed() imposta il seme. Passagli qualcosa che cambia a ogni esecuzione, come il momento della prima pressione del pulsante. micros() conta in milionesimi di secondo, e nessuno preme due volte nello stesso microsecondo:

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

Impostare il seme in setup() non serve: setup() viene eseguita allo stesso microsecondo dopo ogni accensione.

challenge icon

Sfida

Medio

Il pulsante è sul pin 10 e il codice iniziale rileva già il momento in cui viene premuto. Crea un dado:

  • a ogni pressione, scegli random(1, 7) e visualizzalo con showDigit()
  • solo alla prima pressione, chiama randomSeed(micros()) in modo che i risultati varino a ogni esecuzione

Premi Run e premi il pulsante alcune volte, poi Check.

Provalo tu

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

// Uno schema per cifra, da leggere da destra: l'ultimo bit corrisponde al segmento 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);   // acceso
    } else {
      digitalWrite(segmentPins[i], HIGH);  // spento
    }
  }
}

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) {
      // il pulsante è stato appena premuto: genera un numero da 1 a 6 e visualizzalo
    }
    delay(50);  // lascia che il pulsante si stabilizzi
  }
  wasPressed = pressed;
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Display e sensori

Esercitati da solo: Playground Arduino