NodeMCU ESP8266ガイド:ピン配置、Arduino IDEのセットアップ、Webサーバー
NodeMCU ESP8266とは?D1〜D8とGPIOの対応、Arduino IDEのセットアップ、Wi-Fi、LEDを切り替えるWebサーバー、3.3 Vの制約、ESP32との違いを解説します。
NodeMCUは、Wi-Fiに対応したESP8266チップに、USB接続、3.3 Vレギュレーター、ブレッドボードに挿しやすいピンを組み合わせた手ごろな開発ボードです。Arduino IDEでおなじみの命令でプログラムでき、単体で家のネットワークに接続し、スマートフォンで開けるWebページを配信できます。温度センサーをインターネットにつなぎたい、スマートフォンからリレーを切り替えたい、家のLEDテープを制御したいなら、NodeMCU ESP8266はもっとも安く始められる選択肢のひとつです。
このガイドでは、NodeMCUの仕様、まぎらわしいD1〜D8とGPIOのピンの対応、ボードの起動に影響するピン、Arduino IDEのセットアップ、Wi-Fiへの接続、スマートフォンからLEDを切り替えるWebサーバーをステップごとに見ていきます。最後の章では、ESP8266とESP32の違いと、よくある間違いの対処法を紹介します。

ESP8266とNodeMCUとは?
ESP8266は、Espressifが2014年に発表した、Wi-Fiを内蔵した32ビットのマイコンです。とても安価だったため、メイカーの世界でWi-Fiプロジェクトを一気に身近なものにしました。NodeMCUという名前は、もともとこのチップ向けに書かれたLuaベースのファームウェアと、そのオープンソースの開発ボードを指していました。現在ではESP-12Eモジュールを使ったボードの総称として使われています。ただし、Luaでプログラムすることはまれで、ほとんどの人はArduino IDEかMicroPythonを使います。
| 項目 | 値 |
|---|---|
| チップ | ESP8266EX、Tensilica L106、32ビット |
| クロック周波数 | 80 MHz(160 MHzに上げられる) |
| RAM | ユーザー用RAM約80 KB(Wi-Fi接続中にスケッチが使えるのは40〜50 KB) |
| フラッシュメモリ | 4 MB(ESP-12Eモジュール) |
| Wi-Fi | 802.11 b/g/n、2.4 GHzのみ。ステーション、アクセスポイント、またはその両方 |
| Bluetooth | なし |
| 使えるGPIO | 約11本(D0〜D8、RX、TX) |
| アナログ入力 | 1チャンネル(A0)、10ビット、ボード上で約0〜3.2 V |
| PWM | ソフトウェア方式、初期設定1 kHz、範囲0〜255 |
| 動作電圧 | 3.3 V(USBかVINから5 Vで給電) |
| 電流 | Wi-Fi接続中の平均70〜80 mA、送信中は最大170 mA |
市場には2つの一般的なNodeMCUのバージョンがあります。V2(Amica)は幅が狭く、CP2102のUSBシリアル変換チップを使い、ブレッドボードに挿すと両側に1列ずつ空いた穴が残ります。V3(LoLin)は幅が広く、CH340Gチップを使い、標準的なブレッドボードをほぼ覆ってしまうため、ブレッドボードを2枚並べるとV3がずっと扱いやすくなります。どちらのバージョンもピン配置は同じで、同じコードが動きます。もっと小さなボードがほしいなら、Wemos D1 Miniも同じチップを積んでいて、同じスケッチが動きます。
NodeMCUのピン配置:D1〜D8とGPIOの対応
NodeMCUでいちばんまぎらわしいのは、ボードに印刷されたDの表示が、チップの本当のGPIO番号ではないことです。たとえば、D1と書かれたピンは実際にはGPIO 5です。Arduino IDEでNodeMCUのボードを選べば、コードにD1と書くとコンパイラが自動的に5に変換します。しかし、digitalWrite(1, HIGH)と書くと、シリアルポートのTXピンであるGPIO 1を駆動してしまいます。MicroPythonでは常にGPIO番号を使います。
| ボードの表示 | GPIO | 追加機能 | 使用上の注意 |
|---|---|---|---|
| D0 | GPIO 16 | ディープスリープからの復帰 | 割り込み非対応。ディープスリープ用にRSTへつなぐ |
| D1 | GPIO 5 | I2C SCL | 安全、汎用 |
| D2 | GPIO 4 | I2C SDA | 安全、汎用 |
| D3 | GPIO 0 | FLASHボタン | 起動時にLOWだと書き込みモードに入る |
| D4 | GPIO 2 | ボード上のLED(反転ロジック)、TX1 | 起動時にHIGHでなければならない |
| D5 | GPIO 14 | SPI SCK | 安全、汎用 |
| D6 | GPIO 12 | SPI MISO | 安全、汎用 |
| D7 | GPIO 13 | SPI MOSI | 安全、汎用 |
| D8 | GPIO 15 | SPI CS | 起動時にLOWでなければならない。ボードにプルダウン抵抗あり |
| RX | GPIO 3 | UART RX | シリアルモニタ使用中は空けておく |
| TX | GPIO 1 | UART TX | 起動時にブートメッセージを送る |
| A0 | ADC0 | アナログ入力 | アナログ読み取り専用、約0〜3.2 V |
| SD2、SD3 | GPIO 9、10 | フラッシュメモリにつながっている | 使わない |
この表によると、最初のプロジェクトで気兼ねなく使えるピンはD1、D2、D5、D6、D7です。D3、D4、D8はボードの起動モードを決めるピンです。電源が入ると、ESP8266はGPIO 0、GPIO 2、GPIO 15のレベルを確認し、通常の起動にはGPIO 0とGPIO 2がHIGH、GPIO 15がLOWであることを求めます。これらのピンにつないだボタン、リレー、センサーが起動時にレベルを変えてしまうと、ボードはプログラムではなく書き込みモードで起動するか、まったく起動しません。起動時にボタンは押されていないので、D3とD4はボタンには使えますが、出力がLOWのままになるモジュールはこれらのピンから離してください。
A0ピンも特別です。ESP8266チップのアナログ入力は0〜1 Vしか測れませんが、NodeMCUのボードにある220 kΩと100 kΩの分圧回路のおかげで、A0には約0〜3.2 Vを入力でき、analogRead(A0)はその範囲を0〜1023で返します。アナログ入力は1つしかないため、複数のアナログセンサーを使いたいなら、ADS1115のようなI2CのADCが必要です。D1とD2のピンは初期設定のI2Cバスです。I2Cの基本はI2Cとは?で確認できます。
Arduino IDEでESP8266をセットアップする
- Arduino IDEで「ファイル」>「基本設定」を開き、「追加のボードマネージャのURL」欄にhttps://arduino.esp8266.com/stable/package_esp8266com_index.jsonを追加します。
- 「ツール」>「ボード」>「ボードマネージャ」を開き、esp8266を検索して、ESP8266 Communityのパッケージをインストールします。
- 「ツール」>「ボード」メニューでNodeMCU 1.0 (ESP-12E Module)を選びます。Wemos D1 Miniを使うなら、代わりにLOLIN(WEMOS) D1 R2 & miniを選んでください。
- データ通信用ケーブルでボードをつなぎ、「ツール」>「ポート」でポートを選びます。ポートが表示されなければ、V3ボードならCH340の、V2ボードならCP2102のドライバをインストールしてください。
- Upload Speedは115200のままにしておきます。書き込みが安定して動くようになったら、921600に上げて速くできます。
最初のスケッチ:ボード上のLEDを点滅させる
NodeMCUでは、ESP-12Eモジュール上にGPIO 2(D4)につながった青いLEDがあります。V2(Amica)ボードにはD0に2つ目のLEDがあります。これらのLEDは反転ロジックで、ピンがLOWのときに点き、HIGHのときに消えます。Arduinoコアでは、LED_BUILTIN定数はすでに2と定義されています。
1// NodeMCU dahili LED'i: GPIO2 (D4), ters mantık / onboard LED: GPIO2 (D4), inverted logic
2
3void setup() {
4 pinMode(LED_BUILTIN, OUTPUT);
5}
6
7void loop() {
8 digitalWrite(LED_BUILTIN, LOW); // LOW = yanar / LOW = on
9 delay(500);
10 digitalWrite(LED_BUILTIN, HIGH); // HIGH = söner / HIGH = off
11 delay(500);
12}Wi-Fiに接続する
Wi-FiこそがESP8266の本当の強みです。次のスケッチは、ボードをステーションモードで家のネットワークに接続し、ルーターが割り当てたIPアドレスと信号の強さをシリアルモニタに表示します。20秒以内に接続できなければ、待つのをやめて警告を表示します。ネットワーク名とパスワードを自分のものに置き換え、シリアルモニタを115200 baudで開いてください。
1#include <ESP8266WiFi.h>
2
3const char* ssid = "AgAdi"; // Wi-Fi adın / your Wi-Fi name
4const char* password = "Sifre123"; // Wi-Fi şifren / your Wi-Fi password
5
6void setup() {
7 Serial.begin(115200);
8 Serial.println();
9 WiFi.mode(WIFI_STA); // istemci modu / station mode
10 WiFi.begin(ssid, password);
11 Serial.print("Baglaniyor / connecting");
12 unsigned long start = millis();
13 while (WiFi.status() != WL_CONNECTED) {
14 delay(500);
15 Serial.print('.');
16 if (millis() - start > 20000) { // 20 sn'de bağlanamazsa / give up after 20 s
17 Serial.println("\nBaglanamadi, ag adini ve sifreyi kontrol et / failed, check SSID and password");
18 return;
19 }
20 }
21 Serial.println();
22 Serial.print("IP: ");
23 Serial.println(WiFi.localIP()); // modemin verdiği adres / address given by the router
24 Serial.print("Sinyal / RSSI: ");
25 Serial.print(WiFi.RSSI()); // -50 iyi, -80 zayıf / -50 good, -80 weak
26 Serial.println(" dBm");
27}
28
29void loop() {
30}| RSSIの値 | 信号の品質 | 期待できること |
|---|---|---|
| -30〜-50 dBm | 非常によい | 安定した高速な接続 |
| -50〜-67 dBm | よい | Webサーバーやセンサーデータには十分 |
| -67〜-80 dBm | 弱い | ときどき切断、ページの読み込みが遅い |
| -80 dBm未満 | 非常に弱い | まったく接続できないこともある。ボードをルーターに近づける |
スマートフォンからLEDを操作する:簡単なWebサーバー
では、NodeMCUを小さなWebサーバーにしてみましょう。LEDを220 Ωの抵抗を通してD1(GPIO 5)ピンにつなぎます。LEDの長い足を抵抗経由でD1に、短い足をGNDにつなぎます。赤いLEDなら、この抵抗で電流は(3.3 V − 2 V) / 220 Ω ≈ 6 mAとなり、ピンの上限を余裕で下回ります。自分のLEDに合った値はLED抵抗計算ツールで計算してください。書き込んだら、シリアルモニタに表示されたアドレスを、同じWi-Fiにつないだスマートフォンのブラウザで開きます。
1#include <ESP8266WiFi.h>
2#include <ESP8266WebServer.h>
3#include <ESP8266mDNS.h>
4
5const char* ssid = "AgAdi"; // Wi-Fi adın / your Wi-Fi name
6const char* password = "Sifre123"; // Wi-Fi şifren / your Wi-Fi password
7
8const int LED_PIN = D1; // GPIO5, 220 ohm direnç ile LED / LED through a 220 ohm resistor
9bool ledOn = false;
10
11ESP8266WebServer server(80);
12
13void handleRoot() {
14 String html = "<!DOCTYPE html><html><head><meta charset='utf-8'>"
15 "<meta name='viewport' content='width=device-width,initial-scale=1'>"
16 "<title>NodeMCU</title></head>"
17 "<body style='font-family:sans-serif;text-align:center'>"
18 "<h1>NodeMCU LED</h1><p>LED: <b>";
19 html += ledOn ? "ACIK / ON" : "KAPALI / OFF";
20 html += "</b></p><p>A0: ";
21 html += analogRead(A0); // 0-1023 arası analog değer / analog value 0-1023
22 html += "</p><p><a href='/on'><button>AC / ON</button></a> "
23 "<a href='/off'><button>KAPAT / OFF</button></a></p></body></html>";
24 server.send(200, "text/html", html);
25}
26
27void setLed(bool on) {
28 ledOn = on;
29 digitalWrite(LED_PIN, on ? HIGH : LOW);
30 server.sendHeader("Location", "/"); // ana sayfaya yönlendir / redirect to the main page
31 server.send(303, "text/plain", "");
32}
33
34void setup() {
35 pinMode(LED_PIN, OUTPUT);
36 digitalWrite(LED_PIN, LOW);
37 Serial.begin(115200);
38 WiFi.mode(WIFI_STA);
39 WiFi.begin(ssid, password);
40 while (WiFi.status() != WL_CONNECTED) {
41 delay(500);
42 Serial.print('.');
43 }
44 Serial.println();
45 Serial.print("Tarayicida ac / open in browser: http://");
46 Serial.println(WiFi.localIP());
47
48 if (MDNS.begin("nodemcu")) { // http://nodemcu.local adresi / address http://nodemcu.local
49 MDNS.addService("http", "tcp", 80);
50 }
51
52 server.on("/", handleRoot);
53 server.on("/on", []() { setLed(true); });
54 server.on("/off", []() { setLed(false); });
55 server.onNotFound([]() { server.send(404, "text/plain", "Bulunamadi / not found"); });
56 server.begin();
57}
58
59void loop() {
60 server.handleClient(); // gelen istekleri işle / handle incoming requests
61 MDNS.update();
62}| コードの部分 | 働き |
|---|---|
| ESP8266WebServer server(80) | 80番ポート(HTTP)でサーバーを作ります |
| server.on("/on", ...) | ブラウザが/onを要求したらLEDを点けます |
| sendHeader("Location", "/")とsend(303) | 操作のあとブラウザをメインページに戻すので、ページを再読み込みしても命令が再送されません |
| analogRead(A0) | A0の値をページに表示します。LDRやポテンショメーターをつなげます |
| MDNS.begin("nodemcu") | IPの代わりにnodemcu.localという名前で機器にアクセスできるようにします |
| server.handleClient() | loopで常に呼ぶ必要があります。届いたリクエストを処理します |
ページが開かないときは、スマートフォンがゲストネットワークやモバイルデータではなく、NodeMCUと同じWi-Fiネットワークにつながっているか確認してください。nodemcu.localという名前はたいていパソコンやiPhoneで使えますが、mDNSに対応していないAndroidのスマートフォンもあるので、その場合はIPアドレスが必要です。LEDの代わりにリレーモジュールをつなげば、同じコードで本物のランプを操作できます。くわしくはリレーモジュールとは?を参照してください。
アクセスポイント(AP)モード:ルーターなしで接続する
周りにWi-Fiがなければ、NodeMCUは自分のネットワークを作れます。アクセスポイントモードでは、スマートフォンをNodeMCU-APネットワークに直接つなぎ、ボードはたいてい192.168.4.1で応答します。このモードは、庭の水やりシステムや屋外で使う測定器に最適です。上のWebサーバーとこのモードを組み合わせるには、WiFi.beginの行の代わりにsoftAPの行を使うだけです。WIFI_AP_STAモードなら両方の役割を同時にこなせます。パスワードは8文字以上でなければならず、そうでないとネットワークが作られません。
1#include <ESP8266WiFi.h>
2
3void setup() {
4 Serial.begin(115200);
5 WiFi.mode(WIFI_AP); // kendi ağını kur / create its own network
6 bool ok = WiFi.softAP("NodeMCU-AP", "12345678"); // ad ve en az 8 karakter şifre / name and 8+ char password
7 Serial.println(ok ? "AP hazir / AP ready" : "AP hatasi / AP error");
8 Serial.print("IP: ");
9 Serial.println(WiFi.softAPIP()); // genellikle 192.168.4.1 / usually 192.168.4.1
10}
11
12void loop() {
13 Serial.print("Bagli cihaz / stations: ");
14 Serial.println(WiFi.softAPgetStationNum());
15 delay(3000);
16}MicroPythonでESP8266を使う
NodeMCUはArduinoの言語のほかにMicroPythonでもプログラムできます。esptoolでMicroPythonのファームウェアをボードに書き込めば、Thonnyのようなエディタから直接Pythonのコードを実行できます。ESP8266はメモリが限られているため、大きなMicroPythonのプログラムではメモリエラーにぶつかることがありますが、簡単なWi-Fiやセンサーのプロジェクトにはとても便利です。MicroPythonでは、ピン番号としてDの表示ではなくGPIO番号を書くことに注意してください。
1import network, time
2from machine import Pin
3
4led = Pin(2, Pin.OUT) # D4 = GPIO2, dahili LED / onboard LED
5wlan = network.WLAN(network.STA_IF)
6wlan.active(True)
7wlan.connect("AgAdi", "Sifre123") # Wi-Fi adı ve şifresi / Wi-Fi name and password
8
9while not wlan.isconnected():
10 time.sleep(0.5)
11print("IP:", wlan.ifconfig()[0])
12
13while True:
14 led.value(not led.value()) # ters mantık: 0 = yanar / inverted: 0 = on
15 time.sleep(0.5)ESP8266とESP32、どちらにする?
| 項目 | ESP8266(NodeMCU) | ESP32(DevKit) |
|---|---|---|
| プロセッサ | シングルコア、80/160 MHz | デュアルコア、240 MHz |
| RAM | ユーザー用RAM約80 KB | 520 KB |
| Wi-Fi | 802.11 b/g/n、2.4 GHz | 802.11 b/g/n、2.4 GHz |
| Bluetooth | なし | ClassicとBLE |
| GPIO | 約11本 | 約34本(一部は入力専用) |
| アナログ入力 | 1チャンネル、10ビット | 18チャンネル、12ビット |
| PWM | ソフトウェア方式 | 16チャンネルのハードウェアPWM(LEDC) |
| I2CとUART | ソフトウェアI2C、完全なUART 1つと送信専用のUART1 | ハードウェアI2C 2つ、UART 3つ |
| タッチピンとDAC | なし | タッチピン10本、DAC 2つ |
| 価格 | より安い | 少し高い |
まとめると、センサー1つのデータをインターネットに送る、スマートフォンからリレーを切り替える、簡単なWebページを配信するといった用途なら、ESP8266は今でも十分以上で、しかも安価です。Bluetooth、多くのアナログ入力、カメラ、高速な処理、多くのタスクの同時実行が必要な新しいプロジェクトには、ESP32のほうが適しています。コードの移植は簡単で、ESP8266WiFi.hをWiFi.hに、ESP8266WebServer.hをWebServer.hに、ESP8266mDNS.hをESPmDNS.hに替え、MDNS.update()の行を削除し(ESP32にはありません)、D1のようなボードの表示の代わりにGPIO番号を使えば、たいていそれで済みます。くわしくはESP32とは?とArduinoとESP32の違いは?を参照してください。
電源とディープスリープ
NodeMCUにはUSBかVINピンから5 Vで給電し、ボード上のレギュレーターが3.3 Vに下げます。Wi-Fi送信中の170 mAの電流のピークは、電力の弱いUSBポートや細いケーブルで電圧低下を起こし、ボードが勝手にリセットされる原因になります。品質のよいケーブルと、1 A以上を供給できるACアダプターを使ってください。電池で動かすプロジェクトでは、ESP.deepSleep()でチップを約20 µAで眠らせられます。タイマーが切れたときに起きられるよう、D0(GPIO 16)ピンをRSTピンにつなぐ必要があります。ただし、ボード上のUSBシリアル変換チップとレギュレーターはスリープ中も電流を消費し続けるため、電池を長持ちさせるなら単体のESP-12モジュールか低消費電力ボードのほうがよい結果になります。電池の持ちを見積もるには電池寿命計算ツールを使ってください。
NodeMCUを使ったプロジェクトアイデア
- Wi-Fi温度計:DHT11で測った温度と湿度を、スマートフォンで開くページに表示します。
- スマートプラグ:リレーモジュールとWebページのボタンで、ランプをオン・オフします。
- 植物の水やりアラート:土壌水分センサーをA0につなぎ、土が乾いたらページに警告を表示します。
- Wi-Fi LEDテープ:WS2812Bテープの色とエフェクトをスマートフォンから選びます。
- インターネット時計:NTPサーバーから時刻を取得し、I2C LCDディスプレイに表示します。
- 動体アラーム:PIRセンサーが動きを検知したらTelegramのメッセージを送ります。
よくある間違いと対処法
| 症状 | 考えられる原因 | 対処法 |
|---|---|---|
| ポートが表示されない | 充電専用ケーブル、またはドライバがない | データ通信用ケーブルを使う。CH340かCP2102のドライバをインストールする |
| 「Failed to connect to ESP8266: Timed out waiting for packet header」(ESP8266に接続できない) | ボードが書き込みモードに入れなかった | FLASHを押したままRSTを押して離し、FLASHを離してから書き込みをやり直す |
| ボードが起動しない、またはリセットを繰り返す | D3、D4、D8の回路が起動時のレベルを乱している | その回路をD5、D6、D7などの安全なピンに移す |
| シリアルモニタに文字化けした文字が出る | ボーレートの不一致 | コードと同じ速度を選ぶ。ブートメッセージは74880 baud |
| Wi-Fiに接続できない | 5 GHzのネットワーク、パスワードの間違い、または弱い信号 | 2.4 GHzのネットワークを使い、大文字・小文字を確認し、RSSIを見る |
| LEDが点かず、シリアルモニタも黙ってしまう | コードにD1ではなく1と書いた(GPIO 1 = TX) | コードではD1の表示かGPIO 5を使う |
| 「Soft WDT reset」エラー(ウォッチドッグによるリセット) | loop()の中のループが長く続きすぎる | 長いループの中にyield()かdelay(1)を入れる。どちらもバックグラウンドのWi-Fiの処理とウォッチドッグを動かす |
NodeMCU ESP8266は、Arduinoで学んだことをワイヤレスの世界へ広げる、もっとも手ごろな方法です。数行のコードで家のネットワークにつながり、スマートフォンから操作できる機器を作れます。BlueGraysアプリには、ESP32でのWi-Fi接続、Webサーバー、WebSocket、NTP時計、mDNSなどのワイヤレスプロジェクトが、ステップごとの回路図とコード付きでそろっており、同じ考え方をNodeMCUにも簡単に応用できます。
よくある質問
NodeMCUとESP8266は同じものですか?
ESP8266は、Espressifが製造するWi-Fiチップの名前です。NodeMCUは、そのチップを載せたESP-12Eモジュールに、USB接続、レギュレーター、ブレッドボードに挿しやすいピンを組み合わせた開発ボードです。つまり、NodeMCUはすべてESP8266ボードですが、ESP8266ボードがすべてNodeMCUというわけではありません。ESP-01やWemos D1 Miniも同じチップを使っています。
NodeMCUは5 Vで動きますか?
ボードにはUSBかVINピンから5 Vで給電でき、レギュレーターがそれを3.3 Vに下げます。ただし、GPIOピンは3.3 Vで動作し、公式には5 Vトレラントではありません。5 Vの信号は分圧回路かレベル変換モジュールを通してつないでください。
NodeMCUのD1はどのGPIOですか?
D1はGPIO 5で、初期設定のI2C SCLピンです。ほかによく使う対応は、D2 = GPIO 4、D4 = GPIO 2、D5 = GPIO 14、D6 = GPIO 12、D7 = GPIO 13、D8 = GPIO 15です。Arduino IDEではコードにD1と直接書けますが、MicroPythonではGPIO番号を使う必要があります。
ESP8266は5 GHzのWi-Fiに接続できますか?
できません。ESP8266が対応しているのは2.4 GHz帯の802.11 b/g/nのネットワークだけです。ルーターの2.4 GHz帯が有効になっているか確認してください。両方の帯域が同じ名前なら、2.4 GHz帯に別のネットワーク名を付けると接続のトラブルが解決することがよくあります。
NodeMCU V2とV3の違いは?
V2(Amica)は幅の狭いボードで、CP2102のUSBシリアル変換チップを使い、ブレッドボードの両側に空いた穴が残ります。V3(LoLin)は幅が広く、CH340Gチップを使います。ピン、プロセッサ、コードは同じで、違うのは大きさとインストールすべきUSBドライバだけです。
ESP8266にBluetoothはありますか?
ありません。ESP8266にはBluetoothのハードウェアがなく、Wi-Fiだけに対応しています。BluetoothやBLEが必要なプロジェクトでは、ESP32を使うか、HC-05のような別のBluetoothモジュールをボードに加えてください。
この記事を読んだ後に作れるプロジェクト
全プロジェクトを見る
ESP32でLEDを点滅
ESP32のGPIO出力の基本を学びます。デジタルピンからLEDを点灯・消灯させて、点滅させます。Arduino UNOの定番のLED点滅プロジェクトのESP32版です。Arduino環境で使う基本的な点滅コマンドは同じですが、ESP32のピン配置と3.3 VのGPIO電圧レベルはArduino UNOとは異なります。

ESP32の内蔵LEDを点滅
ESP32 DevKit V1に内蔵された青色LEDを点滅させます。外付け部品は不要です!ESP32を購入したら、最初に試すプロジェクトです。GPIO 2が内蔵LEDにつながっています。

ESP32 Wi-Fi STA接続(LCDディスプレイ付き)
このプロジェクトでは、ESP32をステーション(STA)モードで家庭のWi-Fiネットワークに接続し、安全で障害に強い接続を実現します。SSIDとパスワードを別のsecrets.hファイルに保存してGitへの流出を防ぎ、自動再接続の仕組みを実装します。RSSIによる信号強度とIPアドレスはI2C LCDディスプレイに表示します。内蔵LEDは状態表示に使います。実運用を想定した接続管理の仕組みです。

ESP32非同期Webサーバー(LCDにIPアドレスを表示)
このプロジェクトでは、ESP32を同じWi-Fiネットワーク上のスマートフォンやパソコンから操作できる非同期Webサーバーにします。ESPAsyncWebServerライブラリを使うと、従来のWebServer.hのように1つのリクエストで処理がブロックされず、複数のリクエストを同時に処理できます。ブラウザーでESP32のIPアドレスを開き、ON/OFFボタン(/onと/offのルート)を押すと、GPIO 5に接続したLEDを点灯・消灯できます。

ESP32 WebSocketカウンター(2つのボタン+LCD+Webリアルタイム表示)
このプロジェクトでは、ESP32に接続した2つのボタンでカウンターの値を変更します(GPIO 5で増加、GPIO 4で減少)。値は16x2 I2C LCDに即座に反映され、ESPAsyncWebServerのWebSocket機能により、接続中のすべてのブラウザーでもページを再読み込みせずに更新されます。HTTPポーリングの代わりに1つの接続を維持し、ESP32がws.textAll()で新しい値を全員に送信します。

ESP32 mDNS:bluegrays-esp.localでデバイスにアクセス(LCD付き)
このプロジェクトでは、ESP32にmDNS(Multicast DNS)サービスを追加し、IPアドレスの代わりにbluegrays-esp.localのような覚えやすいホスト名でアクセスできるようにします。DHCPで割り当てられるIPアドレスが変わっても、同じ名前でデバイスにアクセスできます。小さなWebサーバーも動かし、ブラウザーでhttp://bluegrays-esp.local/を開いてLEDを操作します。I2C LCDディスプレイにはホスト名、IPアドレス、LEDの状態をトルコ語と英語で表示します。iOS、macOS、LinuxはmDNSに標準対応しています。

ESP32とNTPでインターネットから正確な時刻を取得
ESP32をWi-Fiに接続し、NTP(Network Time Protocol)サーバーからミリ秒精度の現在時刻を取得します。configTzTime()関数でタイムゾーンを自動適用し、夏時間を採用する国ではPOSIX TZ文字列で夏時間と標準時間の切り替えも自動管理します。時刻はシリアルモニタと、必要に応じて接続するI2C LCDに表示します。configTzTime()がSNTPサービスを開始し、ネットワークにアクセスできる間は定期的に再同期します。

ESP32 OTA更新:無線でファームウェアを書き込み(LCD付き)
このプロジェクトでは、USBケーブルを使わず、Wi-Fi経由でESP32に新しいファームウェアを書き込む方法を学びます。ArduinoOTAライブラリを使うと、ESP32がネットワーク上で検出され、Arduino IDEの「ネットワークポート」タブにbluegrays-otaとして自動表示されます。初回はUSBで書き込み、その後の更新はすべて無線で行えます。設置済みのデバイスにとって非常に重要な機能です。I2C LCDディスプレイには、Wi-Fiの状態、IPアドレス、ホスト名、OTA書き込みの進捗率、エラーメッセージをトルコ語と英語で表示します。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

