0

Dado elettronico con 7 LED e pulsante AI

Share

Introduzione al Progetto di Dadi

Se sei un appassionato di elettronica e programmazione, un progetto interessante da realizzare è un sistema di lancio dei dadi utilizzando Arduino. Questo progetto non solo è divertente, ma offre anche una grande opportunità per apprendere e mettere in pratica competenze di programmazione e utilizzo di sensori.

Materiali Necessari

Per completare questo progetto, avrai bisogno di alcuni materiali essenziali. Innanzitutto, procurati una scheda Arduino, un sensore di movimento (come un accelerometro), LED e resistori. Inoltre, un piccolo contenitore o scatola per montare il sistema dei dadi sarà utile per un aspetto finale più professionale.

Realizzazione del Sistema

Inizia assemblando i componenti. Collega il sensore di movimento ad Arduino e testa la connessione. Dovrai programmare Arduino per rilevare il movimento del sensore e, una volta attivato, accendere i LED per simulare il lancio dei dadi. Puoi utilizzare una semplice funzione casuale per generare un numero tra 1 e 6, rappresentando i risultati del lancio.

Successivamente, personalizza il sistema aggiungendo suoni o altri effetti visivi per rendere l’esperienza più coinvolgente. Sperimenta e divertiti a modificare il codice per ottenere risultati diversi e sorprendenti!

Questo progetto rappresenta un ottimo modo per migliorare le tue abilità pratiche e teoriche in materia di elettronica. Buon divertimento con il tuo sistema di lancio dei dadi!

Ecco uno sketch Arduino completo per un dado elettronico con 7 LED disposti “a H” e un pulsante: genera numeri casuali 1–6, gestisce il debounce, semina la sequenza casuale e mostra i puntini corretti su ogni lancio.

Schema e collegamentiDisporre 7 LED come sui classici dadi: tre in alto, uno centrale, tre in basso; usare resistori in serie e collegare ogni anodo a un pin digitale, i catodi a GND; collegare il pulsante a un pin con INPUT_PULLUP e l’altro capo a GND per lettura attiva-bassa .

La disposizione tipica dei “pip” usa 7 LED per comporre tutte le facce da 1 a 6; la forma “H” consente accensioni simmetriche e facilmente mappabili nel codice con una tabella di pattern.

// Dado elettronico con 7 LED e pulsante (attiva-basso con INPUT_PULLUP)
// Disposizione LED (vista frontale “a H”):
// idx: 0 1 2
//      3 4 5
//      6 7 8   <-- useremo 7 LED (mappati sotto) lasciando solo i necessari
//
// Qui mappiamo 7 LED fisici ai “pip” necessari: TL, TM, TR, ML, C, MR, BL, BM, BR
// Per semplicità usiamo solo gli indici richiesti da un dado classico: TL, TR, ML, C, MR, BL, BR

const int buttonPin = 9;                  // pulsante a GND, INPUT_PULLUP
const int ledPins[7] = {2, 3, 4, 5, 6, 7, 8};
// Mappatura leggibile dei 7 LED in stile dado:
// 0: TL (top-left), 1: TR (top-right), 2: ML (mid-left), 3: C (center),
// 4: MR (mid-right), 5: BL (bottom-left), 6: BR (bottom-right)

// Pattern per le facce 1..6: elenchi di indici LED da accendere
// 1: C
// 2: TL, BR
// 3: TL, C, BR
// 4: TL, TR, BL, BR
// 5: TL, TR, C, BL, BR
// 6: TL, TR, ML, MR, BL, BR
const byte faces[6][7] = {
  /*1*/ {3, 255, 255, 255, 255, 255, 255},
  /*2*/ {0, 6, 255, 255, 255, 255, 255},
  /*3*/ {0, 3, 6, 255, 255, 255, 255},
  /*4*/ {0, 1, 5, 6, 255, 255, 255},
  /*5*/ {0, 1, 3, 5, 6, 255, 255, 255},
  /*6*/ {0, 1, 2, 4, 5, 6, 255}
};
// Nota: 255 come sentinella “fine elenco”

// Parametri di gestione pulsante
const unsigned long debounceMs = 30;
const unsigned long spinMinMs = 400;      // durata minima animazione “rotolamento”
const unsigned long spinMaxMs = 900;      // durata massima animazione “rotolamento”
const unsigned long frameMs   = 40;       // velocità di rotolamento

// Stato pulsante (debounce semplice)
bool lastStable = HIGH;
unsigned long lastChange = 0;

void clearAll() {
  for (int i = 0; i < 7; i++) digitalWrite(ledPins[i], LOW);
}

void showFace(int n) {
  clearAll();
  const byte* patt = faces[n - 1];
  for (int i = 0; i < 7; i++) {
    if (patt[i] == 255) break;
    digitalWrite(ledPins[patt[i]], HIGH);
  }
}

bool buttonPressed() {
  bool raw = digitalRead(buttonPin);             // HIGH: rilasciato, LOW: premuto
  unsigned long now = millis();
  if (raw != lastStable && (now - lastChange) > debounceMs) {
    lastStable = raw;
    lastChange = now;
  }
  // Evento “pressed” su transizione a LOW stabile
  static bool prev = HIGH;
  bool pressed = (prev == HIGH && lastStable == LOW);
  prev = lastStable;
  return pressed;
}

void seedRandomOnce() {
  static bool seeded = false;
  if (seeded) return;
  // Semina usando rumore analogico su un pin flottante (es. A0); alternativa: combinare più letture
  unsigned long s = 0;
  for (int i = 0; i < 16; i++) {
    s ^= ((unsigned long)analogRead(A0) & 0x3FF) << (i % 22);
    delay(1);
  }
  randomSeed(s);
  seeded = true;
}

void spinAnimation(unsigned long durationMs) {
  unsigned long start = millis();
  int face = 1;
  while (millis() - start < durationMs) {
    face = 1 + (millis() / frameMs) % 6;
    showFace(face);
    delay(frameMs);
  }
}

void setup() {
  for (int i = 0; i < 7; i++) {
    pinMode(ledPins[i], OUTPUT);
    digitalWrite(ledPins[i], LOW);
  }
  pinMode(buttonPin, INPUT_PULLUP);
  // Iniziale: mostra 1
  showFace(1);
  // Precarica stato pulsante
  lastStable = digitalRead(buttonPin);
  lastChange = millis();
  // Semina PRNG
  seedRandomOnce();
}

void loop() {
  if (buttonPressed()) {
    // Effetto “rotolamento” prima del risultato
    unsigned long spinMs = spinMinMs + (unsigned long)random(spinMaxMs - spinMinMs + 1);
    spinAnimation(spinMs);
    // Estrai numero 1..6 e visualizza
    int n = 1 + (int)random(6);
    showFace(n);
  }
}