注釈
こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。
参加する理由は?
エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。
学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。
独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。
特別割引:最新製品の独占割引をお楽しみください。
祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。
👉 私たちと一緒に探索し、創造する準備はできていますか?[ ここ]をクリックして今すぐ参加しましょう!
デジタルダイス
このコードは、74HC595 シフトレジスタと7セグメントデジタルディスプレイを使用して、サイコロを振るシミュレーションを行います。サイコロを振るシミュレーションは、直接チルトスイッチを振ることで起動します。このアクションにより、デジタルディスプレイは1から6の間のランダムな数をサイクルし、サイコロの振る動作をシミュレートします。短い間隔の後、ディスプレイは停止し、サイコロの振りの結果を意味するランダムな数を表示します。
必要なコンポーネント
このプロジェクトには以下のコンポーネントが必要です。
全体のキットを購入すると便利です。こちらがリンクです:
名称 |
このキットのアイテム数 |
リンク |
|---|---|---|
Elite Explorer Kit |
300+ |
以下のリンクから別々に購入することもできます。
コンポーネント紹介 |
購入リンク |
|---|---|
- |
|
- |
|
配線図
回路図
コード
注釈
ファイル
05_digital_dice.inoをelite-explorer-kit-main\fun_project\05_digital_diceのパスから直接開くことができます。または、このコードを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}
どのように動作しますか?
以下はコードの詳細な説明です:
変数の初期化:
dataPin,clockPin,latchPin:74HC595用のピン。buttonPin:ボタンが接続されているデジタルピン。numbers[]:共通アノードデジタルチューブで1から6までの数を表すエンコーディングを格納する配列。揮発性変数:
rolling:ダイスが現在ローリング中であるかどうかを示す揮発性変数。 割り込みサービスルーチンとメインプログラムの両方でアクセスされるため、揮発性として宣言されます。
setup():関連するピンのモードを設定します。 内部プルアップ抵抗を使用してボタンの入力モードを設定します。 ボタンに割り込みを割り当て、ボタンの状態が変わったときにrollDice関数を呼び出します。
loop():rollingがtrueであるかどうかをチェックします。trueの場合、1から6の間のランダムな数を表示し続けます。ボタンが500ミリ秒以上押されている場合、ローリングは停止します。
rollDice():これはボタンの割り込みサービスルーチンです。ボタンが押されている(低レベル)かどうかをチェックします。もしそうなら、現在の時間を記録し、ローリングを開始します。
displayNumber():この関数はデジタルチューブに数を表示します。74HC595シフトレジスタを通じてデジタルチューブに数を送信します。