注釈
こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Communityへようこそ!Facebook上で、仲間と一緒にRaspberry Pi、Arduino、ESP32をさらに深く探求しましょう。
なぜ参加するのか?
専門的なサポート:購入後の問題や技術的な課題をコミュニティやチームの助けを借りて解決。
学びと共有:スキルを向上させるためのヒントやチュートリアルを交換。
限定プレビュー:新製品発表や予告編に早期アクセス。
特別割引:最新製品の特別割引を楽しむ。
フェスティブプロモーションとプレゼント:プレゼントやホリデープロモーションに参加。
👉 私たちと一緒に探索と創造を始める準備はできましたか?[ここ]をクリックして、今すぐ参加しましょう!
レッスン42: デジタルサイコロ
このプログラムは、OLEDディスプレイを使用してサイコロの転がりをシミュレートします。 振動スイッチを振ることでシミュレーションがトリガーされ、ディスプレイはサイコロを転がすように1から6の数字を循環させます。 短時間後に表示が停止し、サイコロの結果を示すランダムに選ばれた数字が表示されます。
必要なコンポーネント
このプロジェクトでは、以下のコンポーネントが必要です。
セット全体を購入するのが便利です、リンクはこちら:
Name |
ITEMS IN THIS KIT |
LINK |
---|---|---|
Universal Maker Sensor Kit |
94 |
以下のリンクから個別に購入することもできます。
Component Introduction |
Purchase Link |
---|---|
ESP32 & Development Board |
|
- |
|
配線
コード
注釈
ライブラリをインストールするには、Arduino Library Managerを使用し、 "Adafruit SSD1306"**と **"Adafruit GFX" を検索してインストールしてください。
コード解析
コードの詳細な説明:
変数の初期化:
vibPin
: 振動センサーに接続されたデジタルピン。const int vibPin = 35; // The pin where the vib switch is connected
ボラタイル変数:
rolling
: サイコロの転がり状態を示すボラタイルフラグ。これは割り込みサービスルーチンとメインプログラムの両方でアクセスされるため、volatileとして宣言されています。volatile bool rolling = false;
setup()
:振動センサーの入力モードを設定します。 センサーに割り込みを割り当て、状態変化時にrollDice関数をトリガーします。 OLEDディスプレイを初期化します。
void setup() { // Initialize pins pinMode(vibPin, INPUT); // initialize the OLED object if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for (;;) ; } // Attach an interrupt to the vibPin. When the vib switch is activated, the shakeDetected function will be called attachInterrupt(digitalPinToInterrupt(vibPin), rollDice, CHANGE); }
loop()
rolling
がtrueであるかを連続してチェックし、この状態で1から6のランダムな数字を表示します。センサーが500ミリ秒以上振動している場合、転がりが停止します。void loop() { // Check if it's rolling if (rolling) { byte number = random(1, 7); // Generate a random number between 1 and 6 displayNumber(number); delay(80); // Delay to make the rolling effect visible // Stop rolling after 1 second if ((millis() - lastShakeTime) > 1000) { rolling = false; } } }
rollDice()
:振動センサーの割り込みサービスルーチン。センサーが振動したときにサイコロの転がりを開始し、現在の時間を記録します。
// Interrupt handler for shake detection void rollDice() { if (digitalRead(vibPin) == LOW) { lastShakeTime = millis(); // Record the time of shake rolling = true; // Start rolling } }
displayNumber()
:OLEDディスプレイに選択された数字を表示します。
// Function to display a number on the 7-segment display void displayNumber(byte number) { display.clearDisplay(); // Clear the screen // Display Text display.setTextSize(4); // Set text size display.setTextColor(WHITE); // Set text color display.setCursor(54, 20); // Set cursor position display.println(number); display.display(); // Display the content on the screen }