Nota
Ciao, benvenuto nella community SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 con altri appassionati.
Perché unirsi?
Supporto Esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del nostro team.
Impara & Condividi: Scambia consigli e tutorial per migliorare le tue competenze.
Anteprime Esclusive: Ottieni l’accesso anticipato agli annunci di nuovi prodotti e anteprime esclusive.
Sconti Speciali: Goditi sconti esclusivi sui nostri prodotti più recenti.
Promozioni e Concorsi Festivi: Partecipa a concorsi e promozioni festive.
👉 Pronto a esplorare e creare con noi? Clicca [Qui] e unisciti oggi stesso!
Dado Digitale
Questo codice è progettato per simulare un lancio di dadi utilizzando un registro a scorrimento 74HC595 e un display digitale a 7 segmenti. La simulazione del lancio del dado viene attivata agitando direttamente l’interruttore inclinabile. Al compimento di questa azione, il display digitale scorre tra numeri casuali tra 1 e 6, simulando il lancio di un dado. Dopo un breve intervallo, il display si ferma, mostrando un numero casuale che rappresenta il risultato del lancio del dado.
Componenti Necessari
In questo progetto, abbiamo bisogno dei seguenti componenti.
È sicuramente conveniente acquistare un kit completo, ecco il link:
Nome |
ELEMENTI IN QUESTO KIT |
LINK |
|---|---|---|
Elite Explorer Kit |
300+ |
Puoi anche acquistarli separatamente dai link sottostanti.
INTRODUZIONE COMPONENTI |
LINK ACQUISTO |
|---|---|
- |
|
- |
|
Collegamenti
Schema Elettrico
Codice
Nota
Puoi aprire il file
05_digital_dice.inonel percorsoelite-explorer-kit-main\fun_project\05_digital_dicedirettamente.Oppure copia questo codice nell’Arduino IDE.
1/*
2 This code simulates a dice roll on a 7-segment display. Shaking the device
3 (tilt switch activation) starts the roll, displaying random numbers rapidly
4 and stopping after a short duration.
5
6 Board: Arduino Uno R4
7 Component: 7-segment Display with 74HC595 and Tilt Switch
8*/
9
10const int dataPin = 10; // DS of 74HC595
11const int clockPin = 13; // SH_CP of 74HC595
12const int latchPin = 12; // ST_CP of 74HC595
13const int tiltPin = 2; // The pin where the tilt switch is connected
14
15// Byte representation for numbers in a common-cathode 7-segment display
16byte numbers[] = {
17 // 0b00111111, // 0
18 0b00000110, // 1
19 0b01011011, // 2
20 0b01001111, // 3
21 0b01100110, // 4
22 0b01101101, // 5
23 0b01111101, // 6
24 //... Add the values for the rest of the numbers
25};
26
27// State and timing variables
28volatile bool rolling = false;
29unsigned long lastShakeTime = 0;
30
31void setup() {
32 // Initialize pins
33 pinMode(dataPin, OUTPUT);
34 pinMode(clockPin, OUTPUT);
35 pinMode(latchPin, OUTPUT);
36 pinMode(tiltPin, INPUT_PULLUP); // Enable internal pull-up resistor
37
38 // Attach an interrupt to the tiltPin. When the tilt switch is activated, the shakeDetected function will be called
39 attachInterrupt(digitalPinToInterrupt(tiltPin), rollDice, CHANGE);
40}
41
42void loop() {
43 // Check if it's rolling
44 if (rolling) {
45 byte number = random(1, 7); // Generate a random number between 1 and 6
46 displayNumber(number);
47 delay(80); // Delay to make the rolling effect visible
48
49 // Stop rolling after 1 second
50 if ((millis() - lastShakeTime) > 1000) {
51 rolling = false;
52 }
53 }
54}
55
56// Interrupt handler for shake detection
57void rollDice() {
58 if (digitalRead(tiltPin) == LOW) {
59 lastShakeTime = millis(); // Record the time of shake
60 rolling = true; // Start rolling
61 }
62}
63
64// Function to display a number on the 7-segment display
65void displayNumber(byte number) {
66 digitalWrite(latchPin, LOW);
67 shiftOut(dataPin, clockPin, MSBFIRST, numbers[number - 1]);
68 digitalWrite(latchPin, HIGH);
69}
Come funziona?
Ecco una spiegazione dettagliata del codice:
Inizializzazione delle variabili:
dataPin,clockPin,latchPin: Pin per il 74HC595.buttonPin: Il pin digitale a cui è collegato il pulsante.numbers[]: Un array per memorizzare la codifica che rappresenta i numeri da 1 a 6 su un tubo digitale ad anodo comune.Variabili volatili:
rolling: Questa è una variabile volatile che indica se il dado sta attualmente rotolando. È dichiarata volatile poiché viene acceduta sia nella routine di servizio degli interrupt sia nel programma principale.
setup():Imposta le modalità per i pin rilevanti. Imposta la modalità input per il pulsante utilizzando il resistore pull-up interno. Assegna un interrupt al pulsante, che chiama la funzione rollDice quando lo stato del pulsante cambia.
loop():Controlla se rolling è true. Se lo è, continua a visualizzare un numero casuale tra 1 e 6. Se il pulsante è stato premuto per più di 500 millisecondi, il rolling si ferma.
rollDice():Questa è la routine di servizio degli interrupt per il pulsante. Controlla se il pulsante è premuto (livello basso). Se lo è, il tempo corrente viene registrato e il rolling inizia.
displayNumber():Questa funzione visualizza un numero sul tubo digitale. Invia il numero al tubo digitale attraverso il registro a scorrimento 74HC595.