ESP32チュートリアル 36/55 - 数当てゲーム | SunFounderのESP32 IoT学習キット
このチュートリアルでは、ESP32マイクロコントローラーを使用して、赤外線リモコンとLCDディスプレイを組み合わせた楽しい数字当てゲームを作成します。プレイヤーは0から99の間でランダムに生成された数字を推測し、その推測が高すぎるか低すぎるかについてゲームがヒントを提供します。このプロジェクトを通じて、赤外線受信機の使い方、LCDに値を表示する方法、リモコンからのユーザー入力の管理方法を学ぶことができます。追加の明確さについては、ビデオを参照してください(ビデオは00:00にあります)。
ハードウェアの解説
このプロジェクトで使用される主なコンポーネントには、ESP32マイクロコントローラー、赤外線リモコン、赤外線受信機、およびLCDディスプレイが含まれます。ESP32は主な処理ユニットとして機能し、ワイヤレス通信を処理する能力があり、IoTプロジェクトにとって多用途な選択肢となります。赤外線リモコンは、ユーザーがボードと物理的にやり取りすることなく推測を入力できるようにし、LCDはゲームの状態やプロンプトを表示します。
赤外線受信機はリモコンからの信号を検出し、それをゲームで使用するためにデコードします。リモコンの各ボタンの押下は、ESP32が解釈できる特定の値に対応しています。LCDディスプレイはユーザーのための視覚インターフェースを提供し、現在の推測範囲と推測が正しかったかどうかを表示します。
データシートの詳細
| 製造者 | サンファウンダー |
|---|---|
| 部品番号 | ESP32 |
| ロジック/IO電圧 | 3.3 V |
| 供給電圧 | 5 V (USB経由) |
| 出力電流(チャンネルごと) | 12 mA (最大) |
| PWM周波数ガイダンス | 1 kHz |
| 入力ロジック閾値 | 0.3 * Vcc から 0.7 * Vcc |
| 電圧降下 / RDS(on)/ 飽和 | 0.2 V |
| 熱的限界 | 動作温度:-40 から 85 °C |
| パッケージ | WROOM-32モジュール |
| ノート / バリアント | Wi-FiおよびBluetoothをサポートしています。 |
- すべてのコンポーネントが、該当する場合は3.3 Vおよび5 Vに適合していることを確認してください。
- IR受信機には適切なプルアップ抵抗を使用して、浮遊入力を避けてください。
- 最大出力電流で長時間運転する場合は、ヒート sink を使用することを検討してください。
- PWMを使用する際は、最適なパフォーマンスのために約1 kHzの周波数を維持してください。
- 配線には注意してください。接続が確実であることを確認し、断続的な故障を避けてください。
配線指示

推測数ゲームの配線を設定するには、赤外線受信機を接続することから始めます。受信機の右側のピンから赤いワイヤーをESP32の3.3 V電源に接続します。黒いワイヤーは接地に接続し、赤外線受信機の左側のピンをピンに接続します。14ESP32上で。
次に、LCDディスプレイを配線します。LCDのVCCピンをESP32の5V電源に接続し、グランドピンをグランドに接続します。LCDのSDAおよびSCLピンはピンに接続する必要があります。21と22それぞれ。ピンの衝突を避けるために、SDAとSCL接続の間に2つの空白を確保してください。最後に、ボードに電源を入れる前にバッテリーからプラスチックカバーを取り外すようにしてください。
コード例とウォークスルー
次のコードスニペットは、数字を当てるゲームに使用されるプログラムの重要な部分を示しています。必要なライブラリを含め、主要な識別子を定義することから始めます。
#include
#include
#include
#include
const uint16_t IR_RECEIVE_PIN = 14;
IRrecv irrecv(IR_RECEIVE_PIN);
decode_results results;
この抜粋では、LCDおよび赤外線受信機機能を処理するためのライブラリを含めています。赤外線受信機のピンは次のように定義されています。14必要なオブジェクトのインスタンスを作成して、入力と出力を管理します。
void setup() {
lcd.init();
lcd.backlight();
Serial.begin(9600);
irrecv.enableIRIn();
initNewValue();
}このスニペットは、LCDの初期化、シリアル通信の開始、およびIR受信機の有効化を行うセットアップ関数を示しています。関数initNewValue()プレイヤーが推測するために新しいランダムな数字を生成するよう呼び出されます。
bool detectPoint() {
if (count > pointValue) {
if (count < upper) upper = count;
} else if (count < pointValue) {
if (count > lower) lower = count;
} else if (count == pointValue) {
count = 0;
return 1;
}
count = 0;
return 0;
}この機能は、プレイヤーの推測をランダムに生成された数と照らし合わせて、上限と下限を適宜調整します。推測が正しい場合、カウントをリセットし、真を返します。
記事の下に完全なコードが利用可能ですので、ご参照ください。
デモンストレーション / 期待すること
すべてが接続されてコードがアップロードされると、ゲームはリモートコントロールの任意の数字を押すように促します。ゲームはその後、あなたの推測に対してフィードバックを提供し、ターゲットナンバーを正しく推測するまで可能な数字の範囲を更新します。POWERボタンを押すと、ゲームはリセットされて再スタートします(ビデオの02:30に)。
一般的な落とし穴には、赤外線受信機が正しく向いているか、すべての接続が確実であることを確認することが含まれます。ゲームが反応しない場合は、電源を確認し、Arduino IDEで正しいボードとポートが選択されていることを確認してください。
ビデオのタイムスタンプ
- 00:00 開始
- 2:17 ゲームプロジェクトの紹介
- 4:37 配線
- 6:15 Arduinoコードの説明
- 12:32 Arduino IDEでESP32ボードとCOMポートを選択する
- 16:16 数当てゲームをプレイ中
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
// Define the IR receiver pin
const uint16_t IR_RECEIVE_PIN = 14;
// Create an IRrecv object
IRrecv irrecv(IR_RECEIVE_PIN);
// Create a decode_results object
decode_results results;
const long interval = 1000;
unsigned long previousMillis = 0;
// Initialize the LCD object
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Initialize the input number value
int count = 0;
// Initialize the random lucky point
int pointValue = 0;
// Initialize the upper and lower limit tips
int upper = 99;
int lower = 0;
void setup() {
// Initialize the LCD screen
lcd.init();
lcd.backlight();
// Start the serial communication
Serial.begin(9600);
// Enable the IR receiver
irrecv.enableIRIn();
// Initialize a new lucky point value
initNewValue();
}
void loop() {
// If a signal is received from the IR receiver
if (irrecv.decode(&results)) {
bool result = 0;
String num = decodeKeyValue(results.value);
// If the POWER button is pressed
if (num == "POWER") {
initNewValue(); // Initialize a new lucky point value
}
// If the CYCLE button is pressed
else if (num == "CYCLE") {
result = detectPoint(); // Detect the input number
lcdShowInput(result); // Show the result on the LCD screen
}
// If a number button (0-9) is pressed,
//add the digit to the input number
//and detect the number if it is greater than or equal to 10
else if (num >= "0" && num <= "9") {
count = count * 10;
count += num.toInt();
if (count >= 10) {
result = detectPoint();
}
lcdShowInput(result);
}
irrecv.resume();
}
}
// Function to initialize a new lucky point value
void initNewValue() {
// Set the random seed based on the analog value from pin A0
randomSeed(analogRead(A0));
// Generate a new random lucky point value
pointValue = random(99);
// Reset the upper and lower limit tips
upper = 99;
lower = 0;
// Show the welcome message on the LCD screen
lcd.clear();
lcd.print(" Welcome!");
lcd.setCursor(0, 1);
lcd.print("Press Any Number");
// Reset the input number value
count = 0;
// Print the lucky point value to the serial monitor
Serial.print("point is ");
Serial.println(pointValue);
}
// Detect the input number
//and update the upper/lower limit tips accordingly
bool detectPoint() {
if (count > pointValue) {
if (count < upper)upper = count;
}
else if (count < pointValue) {
if (count > lower)lower = count;
}
// If the input number is equal to the lucky point value,
else if (count == pointValue) {
// Reset the input number and return true
count = 0;
return 1;
}
// Reset the input number and return false
count = 0;
return 0;
}
// Show the input number and the upper/lower limit tips
void lcdShowInput(bool result) {
lcd.clear();
// If the input number is equal to the lucky point value
if (result == 1)
{
// Show the success message and initialize a new lucky point value
lcd.setCursor(0, 1);
lcd.print(" You've got it! ");
delay(5000);
initNewValue();
return;
}
lcd.print("Enter number:");
lcd.print(count);
lcd.setCursor(0, 1);
lcd.print(lower);
lcd.print(" < Point < ");
lcd.print(upper);
}
// Function to decode the key value from the IR receiver signal
String decodeKeyValue(long result)
{
switch(result){
case 0xFF6897:
return "0";
case 0xFF30CF:
return "1";
case 0xFF18E7:
return "2";
case 0xFF7A85:
return "3";
case 0xFF10EF:
return "4";
case 0xFF38C7:
return "5";
case 0xFF5AA5:
return "6";
case 0xFF42BD:
return "7";
case 0xFF4AB5:
return "8";
case 0xFF52AD:
return "9";
case 0xFF906F:
return "+";
case 0xFFA857:
return "-";
case 0xFFE01F:
return "EQ";
case 0xFFB04F:
return "U/SD";
case 0xFF9867:
return "CYCLE";
case 0xFF22DD:
return "PLAY/PAUSE";
case 0xFF02FD:
return "BACKWARD";
case 0xFFC23D:
return "FORWARD";
case 0xFFA25D:
return "POWER";
case 0xFFE21D:
return "MUTE";
case 0xFF629D:
return "MODE";
case 0xFFFFFFFF:
return "ERROR";
default :
return "ERROR";
}
}
Common Course Links
Common Course Files
リソースと参考文献
-
ドキュメンテーションESP32 チュートリアル 36/55 - SunFounder の数字当て用文書ページdocs.sunfounder.com
ファイル📁
ファイルは利用できません。