ArduinoとESP32の違いは?主な違いとどちらを選ぶべきか
ArduinoとESP32を比較:速度、RAM、Wi-Fi、5 Vと3.3 Vのロジック、ADC、ピン、電池の持ち、Picoとの比較、共通のコード、プロジェクト別の選び方を解説します。
ArduinoとESP32、どちらにするべき?短く答えると、プロジェクトにWi-Fi、Bluetooth、インターネット、または高い処理能力が必要ならESP32を選びましょう。電子工作の基本を学びたい、5 Vのセンサーやモジュールを手間なく使いたい、チュートリアルのとおりに進めたいならArduino Unoです。どちらのボードもArduino IDEで、同じdigitalWrite、analogRead、Serialの命令を使ってプログラムします。本当の違いはハードウェア、つまり速度、メモリ、動作電圧、ピン、無線接続にあります。
このガイドでは、Arduino Uno R3と、もっとも普及しているESP32ボードであるESP32 DevKit(ESP-WROOM-32モジュール搭載)を実際の数値で比べます。CPUとメモリの違いは実際に何を意味するのか、5 Vと3.3 Vの違いはどのモジュールに影響するのか、アナログ入力とPWMはどう変わるのか、電池で何時間動くのか。そのうえで同じスケッチを両方のボードで動かし、Raspberry Pi Picoにも簡単にふれ、プロジェクトの種類ごとにどのボードを選ぶべきかを表にまとめます。

短い答え:どちらを、いつ選ぶ?
| 状況 | おすすめのボード | 理由 |
|---|---|---|
| 電子工作が初めて | Arduino Uno | 5 V、丈夫なピン、例とレッスンがいちばん多い |
| Wi-Fiやインターネットが必要 | ESP32 | Wi-Fi内蔵で追加モジュール不要 |
| スマートフォンとBluetoothで接続 | ESP32 | Classic BluetoothとBLEを内蔵 |
| 5 Vのモジュールやシールドを使う | Arduino Uno | レベル変換モジュールが不要 |
| ディスプレイ、多数のLED、大きなデータ | ESP32 | RAMは520 KB(Unoは2 KB) |
| 電池で何か月も動くセンサー | ESP32(低消費電力ボード) | ディープスリープで約10 µA |
| Pythonでプログラミング | Raspberry Pi Pico | MicroPythonのサポートが非常に成熟している |
| 予算をいちばん抑えたい | ESP32またはPico | Unoの互換品と同じ価格ではるかに多機能 |
Arduino UnoとESP32とは?
Arduino Uno R3は、イタリアで開発されたArduinoプラットフォームでもっとも有名なボードです。心臓部は16 MHzで動く8ビットのATmega328Pマイコンです。ボードは5 Vで動作し、ピン配置は何年も変わっていないため、数百種類のシールド(上に差し込む拡張ボード)、本、講座がこれに対応しています。シンプルな設計なので、何が起きているかがはっきりわかります。ピンにHIGHを書けば、本当にそのピンに5 Vが出ます。新しいUno R4は48 MHzの32ビットArmプロセッサと32 KBのRAMを備え、R4 WiFi版は無線接続のためにESP32-S3をボードに載せています。この記事で「Uno」と言うときは、今でもいちばん普及しているR3を指します。プラットフォームについてもっと知りたい方はArduinoとは?を読んでみてください。

一方のESP32は、Espressifが2016年に発表した32ビットのシステムオンチップ(SoC)で、Wi-FiとBluetoothを同じチップに内蔵しています。手にするボードは、このチップを載せた開発ボードで、USBシリアル変換、3.3 Vレギュレーター、ENボタンとBOOTボタンを備えています。大事な点として、ESP32はArduinoではありませんが、Espressifが作ったArduinoコアのおかげで、Arduinoと同じようにArduino IDEでプログラムできます。セットアップと最初のプロジェクトにはESP32とは?がおすすめです。
大比較表:Arduino Uno、ESP32、Raspberry Pi Pico
| 項目 | Arduino Uno R3 | ESP32 DevKit(WROOM-32) | Raspberry Pi Pico |
|---|---|---|---|
| プロセッサ | ATmega328P、8ビットAVR | Xtensa LX6、32ビット、デュアルコア | RP2040、32ビットArm Cortex-M0+、デュアルコア |
| クロック周波数 | 16 MHz | 最大240 MHz | 133 MHz |
| RAM(SRAM) | 2 KB | 520 KB | 264 KB |
| プログラムメモリ(フラッシュ) | 32 KB(ブートローダが0.5 KBを使用) | 一般的に4 MB | 2 MB |
| EEPROM | 1 KB | なし(フラッシュでエミュレート) | なし(フラッシュ上のファイルシステム) |
| ロジック電圧 | 5 V | 3.3 V(5 Vトレラントではない) | 3.3 V(5 Vトレラントではない) |
| 電源 | USB 5 Vまたは7〜12 V(ジャック/VIN) | USB 5 VまたはVINに5 V | USB 5 VまたはVSYSに1.8〜5.5 V |
| 使えるGPIO | 20(デジタル14+アナログ6) | 約25(制約のあるピンを除く) | 26 |
| アナログ入力(ADC) | 6チャンネル、10ビット | 18チャンネル、12ビット(Wi-Fi使用中はADC1のみ) | 3チャンネル、12ビット |
| アナログ出力(DAC) | なし | 2チャンネル、8ビット | なし |
| PWM | 6ピン、8ビット、490/980 Hz | 16チャンネル、周波数可変、ほぼすべてのピンで使用可 | 16チャンネル、全GPIOで使用可 |
| Wi-Fi | なし | 802.11 b/g/n、2.4 GHz | なし(Pico Wにはあり) |
| Bluetooth | なし | Bluetooth 4.2:Classic+BLE | なし(Pico Wにはあり) |
| UART / I2C / SPI | 1 / 1 / 1 | 3 / 2 / 2(ユーザーが使える数) | 2 / 2 / 2 |
| ピンあたりの電流 | 推奨20 mA(最大40 mA) | 推奨約20 mA | 初期設定4 mA(最大12 mAまで設定可) |
| ボードの一般的な消費電流 | 約45 mA | Wi-Fi使用時の平均50〜130 mA、ピーク240 mA | 約25 mA |
| 最小のスリープ電流 | チップは1 µA未満、ボードは約30 mA | ディープスリープでチップは約10 µA | ドーマントモードでボードは約1 mA |
| プログラミング | Arduino C/C++ | Arduino C/C++、ESP-IDF、MicroPython | MicroPython、C/C++ SDK、Arduino |
| おおよその価格 | 純正品$25〜30、互換品$5〜10 | 互換品のDevKit $4〜8 | $4(Pico Wは$6) |
CPUとメモリ:数値は実際に何を意味する?
Unoのプロセッサは1秒間に約1,600万命令を実行し、一度に扱うのは8ビットの数値です。32ビットのlongやfloatの演算には何十もの命令が必要で、ハードウェアの浮動小数点演算ユニット(FPU)もありません。ESP32は240 MHzで32ビットの数値を扱い、単精度のFPUを備えています。そのため、floatを多用する計算ではESP32がUnoより数十倍、ときには数百倍速くなります。LEDを点滅させたり、1秒に数回センサーを読んだりする程度では差に気づきませんが、フィルタ処理、音声処理、暗号化、数百個のLEDのアニメーション計算では決定的な差になります。ちょっとした注意点として、ESP32のFPUが扱えるのはfloatだけで、doubleの演算はソフトウェアで処理されるため、目に見えて遅くなります。
メモリの差には、はるかに頻繁にぶつかります。Unoの2 KBのRAMは、変数、Serialのバッファ、ライブラリが確保する領域で共有されます。RAMが足りなくなっても、コンパイラはたいてい警告してくれず、プログラムがランダムに止まったり、おかしな動きをしたりします。UnoのRAMがすぐ足りなくなる典型的な例は次のとおりです。
- OLEDディスプレイ:128×64のSSD1306ディスプレイのフレームバッファだけで1 KB、つまりRAMの半分を使います(OLEDディスプレイの使い方を参照)。
- アドレス指定できるLED:WS2812BのLEDは1個につき3バイトを使うので、300個のLEDテープには900バイトが必要です(WS2812B NeoPixelを参照)。
- インターネットからのデータ:天気サービスが返すJSONは数KBになることがあり、Unoには収まりませんが、ESP32なら楽に扱えます。
- 文字列の連結:ループの中で大きくなり続けるStringオブジェクトは小さなRAMを断片化させ、数時間後にクラッシュを引き起こすことがあります。
- SDカード:SDライブラリは512バイトのセクタバッファを確保します。ディスプレイやセンサーのライブラリと合わせると、すぐに上限に達します。
電圧の違い:5 Vと3.3 V
これがもっとも見落とされやすい違いです。Unoのピンは5 Vロジックで、HIGH出力は5 V、入力は3 Vを超えるとHIGHとみなされます。ESP32のピンは3.3 Vロジックで、5 Vトレラントではありません。ピンに5 Vをかけてもすぐに壊れるとは限りませんが、内部の保護ダイオードに負担がかかり、徐々に、あるいは一気にチップを壊すことがあります。逆方向はそれほど問題になりません。ESP32の3.3 VのHIGH信号は、Unoの3 Vのしきい値をぎりぎり超えるので、たいていHIGHとして読まれます。ただし、それも安全な設計とは言えません。よく使うモジュールが各ボードでどう動くかは次のとおりです。
| モジュール | Arduino Unoの場合 | ESP32の場合 | 備考 |
|---|---|---|---|
| HC-SR04距離センサー | 直結 | ECHOラインに分圧回路 | ECHOピンは5 Vを出力する |
| 5 Vリレーモジュール | 直結 | 多くは動くが、オフにならないものもある | アクティブLOWのモジュールでは、3.3 VのHIGHでリレーが完全に解放されないことがある |
| SG90サーボ | 直結 | 信号は直結、電源は5 Vから | サーボの電源をボードの3V3ピンからとらない |
| DHT11 / DHT22 | 直結 | 3.3 Vで直結 | どちらの電圧でも動く |
| I2C LCD(16x2) | 直結 | 電源は5 V、レベル変換モジュール推奨 | モジュールのプルアップ抵抗がラインを5 Vに引き上げる |
| SSD1306 OLED | 直結 | 直結(3V3) | 基板にレギュレーターがある |
| WS2812Bテープ | 直結 | たいてい動く | 確実に動かすには74AHCT125などのレベル変換を使う |
| MPU6050(GY-521) | 直結 | 直結(3V3) | 基板に3.3 Vレギュレーターがある |
ピン、アナログ入力、PWM
Unoでは20本のピンがどれもほぼ同じように動きます。どのピンも入力にも出力にもでき、20 mAまで余裕をもって供給でき、起動に影響しません。ESP32 DevKitはカタログ上のピン数こそ多いものの、すべてが同等ではありません。GPIO 6〜11は内部フラッシュにつながっていて使えず、GPIO 34〜39は入力専用で、GPIO 0、2、5、12、15は起動時に決まったレベルでなければなりません。実際に気兼ねなく使えるのは20〜25本ほどです。ボードのピン配置はピン配置ツールで確認できます。
アナログ入力では、Unoの10ビットADCは0〜5 Vを1024段階に分け、1段階は約4.9 mVで、読み取り値はかなり直線的です。ESP32の12ビットADCは4096段階ですが、初期設定では約0.15 V未満や3.1 Vを超える値を区別できず、ノイズも多く、Wi-Fi使用中はADC2のピンがまったく使えません。ESP32で正確な電圧が必要なら、analogReadMilliVolts()を使い、センサーをADC1のピン(GPIO 32〜39)につなぎましょう。PWMではESP32が上回ります。Unoは6本のピンで490 Hzか980 Hzの8ビットPWMしか使えませんが、ESP32は周波数と分解能を変えられる16チャンネルを、ほぼすべての出力ピンに割り当てられます。さらに、本物のアナログ電圧を出すDACも2つ(GPIO 25と26)あります。PWMの基本はPWMとは?を参照してください。
同じスケッチを両方のボードで:何が変わる?
うれしいことに、Arduinoで学んだことはすべてESP32にも通用します。次のスケッチはポテンショメーターを読み、電圧をシリアルモニタに表示し、値が半分を超えるとボード上のLEDを点けます。#if defined(ESP32)の行で、どのボード向けにコンパイルしているかを判別し、ピン番号、基準電圧、ADCの分解能だけを切り替えます。ポテンショメーターの両端の足はUnoなら5VとGNDに、ESP32なら3V3とGNDにつなぎます。中央の足はUnoならA0に、ESP32ならGPIO 34につなぎ、シリアルモニタを115200 baudで開いてください。コード以外の主な違いは表のとおりです。
1// Aynı kod Uno ve ESP32'de çalışır / The same sketch runs on Uno and ESP32
2#if defined(ESP32)
3const int LED_PIN = 2; // DevKit dahili LED / DevKit onboard LED
4const int POT_PIN = 34; // ADC1 pini, Wi-Fi ile de çalışır / ADC1 pin, works with Wi-Fi too
5const float VREF = 3.3; // ESP32 pinleri 3,3 V / ESP32 pins are 3.3 V
6const int ADC_MAX = 4095; // 12 bit
7#else
8const int LED_PIN = 13; // Uno dahili LED / Uno onboard LED
9const int POT_PIN = A0;
10const float VREF = 5.0; // Uno referansı 5 V / Uno reference is 5 V
11const int ADC_MAX = 1023; // 10 bit
12#endif
13
14void setup() {
15 Serial.begin(115200);
16 pinMode(LED_PIN, OUTPUT);
17}
18
19void loop() {
20 int raw = analogRead(POT_PIN);
21 float volts = raw * VREF / ADC_MAX;
22 Serial.print("Ham / raw: ");
23 Serial.print(raw);
24 Serial.print(" Gerilim / voltage: ");
25 Serial.println(volts, 2);
26 digitalWrite(LED_PIN, raw > ADC_MAX / 2 ? HIGH : LOW); // yarıdan fazlaysa LED yanar / LED on above half
27 delay(250);
28}| 項目 | Arduino Uno | ESP32 |
|---|---|---|
| ボード上のLED | 13番ピン | 多くの互換品DevKitではGPIO 2(EspressifのDevKitCにはなし) |
| analogReadの範囲 | 0〜1023(10ビット) | 0〜4095(12ビット) |
| 外部割り込み(attachInterrupt) | 2番ピンと3番ピンのみ | ほぼすべてのピン(割り込み関数にIRAM_ATTRを付ける) |
| 2つ目のシリアルポート | SoftwareSerialが必要 | ハードウェアのSerial2(GPIO 16と17) |
| EEPROM | 本物のEEPROM、1 KB | フラッシュ内。EEPROM.commit()またはPreferences |
| 書き込み | ワンクリック | BOOTボタンを押す必要があるボードもある |
| コンパイル時間 | 数秒 | 初回のビルドは1分ほどかかることがある |
Wi-Fi、Bluetooth、インターネット
ESP32を本当に際立たせているのは無線接続です。ボードは2.4 GHzのWi-Fiネットワークに接続でき、自分のアクセスポイントを作り、Webサーバーを動かし、MQTTでスマートホームシステムにデータを送り、NTPでインターネットから時刻を取得し、ファームウェアを無線で更新(OTA)できます。Bluetoothは、Classic Bluetooth(シリアルポートプロファイル)と低消費電力のBLEの両方に対応し、ESP-NOWを使えば複数のESP32がルーターなしで通信できます。Unoにはこれらのどれも内蔵されていません。BluetoothにはHC-05のようなモジュールが、Wi-FiにはESP-01のような別チップとATコマンドが必要です。次のスケッチは同じポテンショメーターを、今度はWi-Fi経由で読みます。シリアルモニタに表示されたアドレスを、同じネットワークにつないだスマートフォンのブラウザで開くと、電圧がミリボルト単位で表示され、ページは2秒ごとに自動で更新されます。
1#include <WiFi.h>
2#include <WebServer.h>
3
4const char* ssid = "AgAdi"; // Wi-Fi adın / your Wi-Fi name
5const char* password = "Sifre123"; // Wi-Fi şifren / your Wi-Fi password
6const int POT_PIN = 34; // ADC1 pini / ADC1 pin
7
8WebServer server(80);
9
10void handleRoot() {
11 uint32_t mv = analogReadMilliVolts(POT_PIN); // kalibre edilmiş mV / calibrated mV
12 String html = "<meta name='viewport' content='width=device-width'>"
13 "<meta http-equiv='refresh' content='2'>"
14 "<h1>ESP32</h1><p>Pot: ";
15 html += mv;
16 html += " mV</p>";
17 server.send(200, "text/html", html);
18}
19
20void setup() {
21 Serial.begin(115200);
22 WiFi.begin(ssid, password);
23 while (WiFi.status() != WL_CONNECTED) delay(500);
24 Serial.print("Telefonda aç / open on your phone: http://");
25 Serial.println(WiFi.localIP());
26 server.on("/", handleRoot);
27 server.begin();
28}
29
30void loop() {
31 server.handleClient();
32}消費電力と電池での運用
カタログ上、ESP32はもっとも電力を食うボードであり、同時にもっとも省電力なボードでもあります。Wi-Fiでデータを送信している間は最大240 mAのピーク電流が流れるため、電力の弱いUSBポートでは「Brownout detector was triggered(電圧低下を検出)」のエラーで再起動します。一方、ディープスリープ中のチップの消費電流はわずか約10 µAです。Unoのボードは何もしていなくても約45 mAを消費します。ATmega328Pをスリープさせても、USBシリアル変換チップ、レギュレーター、電源LEDが約30 mAを使い続けます。例で計算してみましょう。2000 mAhの電池で、連続動作するUnoは約2000 / 45 ≈ 44時間動きます。Wi-Fiを常時オンにしたESP32(平均100 mA)は約20時間です。しかし、ESP32が10分ごとに3秒だけ起きて120 mAで測定値を送り、残りの597秒を10 µAで眠るなら、平均電流は(3 × 120 + 597 × 0.01) / 600 ≈ 0.61 mAとなり、同じ電池で理論上3000時間以上、つまり4か月以上動きます。この結果を得るには低消費電力ボードか単体のモジュールが必要です。標準的なDevKitのレギュレーターとUSBチップは、スリープ中でも数mAを消費します。自分の使い方での計算は電池寿命ツールでできます。
Raspberry Pi Picoはどこに位置する?
3つ目の有力な選択肢がRaspberry Pi Picoです。RP2040チップは133 MHzのCortex-M0+コアを2つ、264 KBのRAM、2 MBのフラッシュを備え、価格は約$4です。ESP32と同じく3.3 Vで動作し、26本のGPIOがありますが、アナログ入力は3つだけです。最大の強みは、非常に成熟したMicroPythonのサポート、パソコンにUSBドライブのように認識されるので簡単にファームウェアを入れられること、そしてプロセッサに負担をかけずに正確なタイミングのプロトコルを作れるPIOというユニットです。無線が必要ならPico W(Wi-FiとBluetooth)を、もっと性能がほしいならRP2350チップを積んだPico 2を選びましょう。くわしくはRaspberry Pi Picoとは?を参照してください。同じポテンショメーターの読み取りは、PicoのMicroPythonでは次のようになります(中央の足をGP26に、両端の足を3V3とGNDに)。
1from machine import ADC, Pin
2import time
3
4pot = ADC(26) # GP26 = ADC0, potansiyometre orta ucu / pot wiper
5led = Pin("LED", Pin.OUT) # dahili LED (Pico ve Pico W) / onboard LED (Pico and Pico W)
6
7while True:
8 raw = pot.read_u16() # 0–65535 (12 bit ölçüm ölçeklenir / 12-bit reading, scaled)
9 volts = raw * 3.3 / 65535
10 print("Ham / raw:", raw, " Gerilim / voltage: {:.2f}".format(volts))
11 led.value(raw > 32767) # yarıdan fazlaysa yanar / on above half
12 time.sleep(0.25)価格と学びやすさ
価格だけで決まることはあまりありません。純正のUno R3は約$25〜30、CH340のUSBチップを使った互換品は$5〜10で売られています。互換品のESP32 DevKitは$4〜8、Picoは$4です。つまり、ESP32とUnoの互換品の価格差はほとんどなく、本当のコストは追加部品に表れます。ESP32で5 Vのモジュールを使うには抵抗を数本か$1〜2のレベル変換モジュールが必要で、UnoにWi-Fiを加えるには別のモジュールが必要です。学びやすさではUnoが上です。ボードを選んで「書き込み」をクリックするだけで、エラーメッセージや例は何年も変わらず、5 Vのモジュールとの電圧の不一致もありません。ESP32では、まずEspressifのボードパッケージと、必要ならUSBチップ(CP2102またはCH340)のドライバをインストールし、正しいボードの型番を選び、ボードによっては書き込み中にBOOTボタンを押し続けます。また、ネット上の例の中には古いコアのバージョン向けに書かれていてコンパイルできないものもあります(たとえばコア3.xでは、ledcSetupの代わりにledcAttachを使います)。こうしたハードルは数時間で越えられますが、初めて回路を組むなら、問題がコードと配線のどちらにあるのかを見分けやすいのはUnoです。
どのプロジェクトにどのボード?
| プロジェクト | 最適なボード | 理由 |
|---|---|---|
| LED、ボタン、ブザーを使った最初のレッスン | Arduino Uno | 失敗に強く、5 Vで、例が豊富 |
| ロボットカー(L298N、HC-SR04) | Arduino Uno | 5 Vのモジュールと直接つなげる |
| Wi-Fi気象観測所 | ESP32 | スマートフォンやインターネットにデータを送れる |
| リレーを使ったスマートホームの自動化 | ESP32 | Web、MQTT、音声アシスタントと連携できる |
| スマートフォンからのBluetoothリモコン | ESP32 | BLEとClassic Bluetoothを内蔵 |
| 電池で動く遠隔センサー | ESP32(低消費電力ボード) | ディープスリープと短時間のWi-Fi送信 |
| Pythonを学ぶ | Raspberry Pi Pico | MicroPythonが第一級の扱い |
| 数百個のアドレス指定できるLED | ESP32またはPico | RAMが豊富でプロセッサが速い |
| カメラの映像を配信する | ESP32-CAM | カメラとmicroSDスロットがボードにある |
| モーターシールドや5 Vのシールド | Arduino Uno | シールドはUnoのピン配置に合わせて作られている |
よくある間違いと誤解
- 「ESP32のほうが常に優れている」:性能は高いものの、3.3 Vのピン、起動に影響するピン、BOOTボタン、電源の電圧低下は初心者を疲れさせます。基本を学ぶなら、Unoのほうが予想外のことが少なくて済みます。
- 5 VのセンサーをESP32に直結する:HC-SR04のECHO出力のような5 Vの信号を分圧回路なしでつなぐと、ピンが壊れることがあります。
- Wi-Fi使用中にADC2のピンを読む:GPIO 0、2、4、12〜15、25〜27はWi-Fi動作中にアナログ値を読めません。センサーをGPIO 32〜39に移してください。
- UnoのRAMを忘れる:コードはコンパイルできるのにボードがランダムに止まるなら、RAMが足りなくなっているかもしれません。固定の文字列はF("...")で囲み、ループ内でStringを連結しないようにしましょう。
- ESP32を弱いUSBで給電する:Wi-Fiを起動したときにボードが再起動するなら、品質のよいデータ通信用ケーブルと、1 A以上を供給できるACアダプターを使ってください。
- PicoとPico Wを取り違える:無印のPicoにはWi-Fiがありません。無線のプロジェクトには、名前にWが付いたモデルを買いましょう。
まとめると、Arduino Unoは学ぶためのボード、ESP32はつなぐためのボード、Raspberry Pi PicoはPythonで実験するためのボードです。Arduinoファミリーのどのモデルが合うか迷ったら、どのArduinoを買うべき?を見てみてください。BlueGraysアプリには、LEDの点滅からWi-Fi Webサーバーまで、NTP時計から天気表示まで、Arduino、ESP32、Pico向けの何十ものプロジェクトが、ステップごとの回路図とコード付きでそろっています。
よくある質問
ESP32はArduinoより優れていますか?
純粋な性能、メモリ、無線接続の点では、そのとおりです。ESP32は240 MHzで動作し、520 KBのRAM、Wi-Fi、Bluetoothを備えています。しかし、3.3 Vのピン、制約のあるGPIO、より複雑な起動のため、初心者にとってはArduino Unoのほうが予想外のことが少なくて済みます。どちらが優れているかは、プロジェクトに何が必要かによります。
ESP32はArduino IDEでプログラムできますか?
できます。Arduino IDEにEspressifのesp32ボードパッケージを追加すれば、Arduinoの命令でESP32をプログラムできます。pinMode、digitalWrite、analogRead、Serial、Wireなどの関数は同じように動き、変わるのは主にピン番号と電圧レベルです。
ArduinoのコードはESP32で動きますか?
ほとんどのコードは少しの変更で動きます。ピン番号をESP32用に直し、analogReadが0〜4095を返すことを考慮し、AVR固有のレジスタにアクセスするコードやSoftwareSerialのようなライブラリをESP32用のものに置き換える必要があります。
Arduino UnoにWi-Fiを追加できますか?
できます。ESP-01(ESP8266)のようなモジュールをシリアルポート経由でATコマンドで使うか、Uno R4 WiFiを購入します。ただし、ESP-01には3.3 Vの電源とレベル変換が必要で、Unoの2 KBのRAMではWebの処理に苦労します。そのため、多くの場合はESP32を直接使うほうが簡単で安上がりです。
ArduinoとRaspberry Pi Pico、どちらがよいですか?
C/C++でArduinoのエコシステムにとどまり、5 Vのモジュールを使い、もっとも多くの例を見つけたいならArduino Unoが向いています。Pythonでのプログラミング、安い価格、PIOによる正確なタイミングを求めるならRaspberry Pi Picoを選びましょう。Picoは3.3 Vで動作するため、ESP32と同じく5 Vの信号には注意が必要です。
ESP32で5 Vのセンサーを使えますか?
センサーが3.3 Vでも動くなら、3V3ピンから給電するのがいちばん簡単です。5 Vでしか動かず5 Vを出力するセンサーには、出力ラインに分圧回路かレベル変換モジュールを入れてください。ESP32のピンに5 Vを直接入れると、チップが壊れることがあります。
この記事を読んだ後に作れるプロジェクト
全プロジェクトを見る
LEDの点滅
電子工作の第一歩は、1個のLEDを点けたり消したりすることです。Arduinoで短い間隔で点灯と消灯を繰り返すと、LEDが素早く点滅します。ボードが光を制御する仕組みを最もシンプルな形で確かめ、これから取り組むプロジェクトの基礎を身につけます。

ESP32でLEDを点滅
ESP32のGPIO出力の基本を学びます。デジタルピンからLEDを点灯・消灯させて、点滅させます。Arduino UNOの定番のLED点滅プロジェクトのESP32版です。Arduino環境で使う基本的な点滅コマンドは同じですが、ESP32のピン配置と3.3 VのGPIO電圧レベルはArduino UNOとは異なります。

Raspberry Pi Picoの内蔵LEDを点滅(PicoとPico W)
Raspberry Pi Picoシリーズの最初のプロジェクトです!ボード上の緑色LEDを点滅させて動作を確認する、定番の「Hello World」に相当する実験です。外付け部品は不要で、PicoとUSBケーブルだけで始められます。コードはMicroPython(Raspberry Pi Foundationが公式にサポートする言語)で書きます。Thonny IDEでmachine.Pinクラス、Pin.OUTモード、led.on()/off()メソッド、time.sleep()を学びます。シリアル(REPL)出力で、切り替わる様子をリアルタイムに確認できます。

DHT11で温度と湿度を測定
部屋の温度は何度で、空気は湿っているでしょうか、それとも乾燥しているでしょうか?DHT11センサーが温度と湿度を測定し、Arduinoが2行のLCDディスプレイに値を表示して、数秒ごとに更新します。センサーに異常があればエラーメッセージが表示されます。自分だけの小さな気象観測装置を作る第一歩です。

ESP32と可変抵抗でLEDの明るさを制御(アナログ→PWM)
可変抵抗を使ってLEDの明るさをアナログ操作で調整します。ESP32のADCピンで可変抵抗からの0-3.3Vの電圧を読み取り、PWM(パルス幅変調)信号に変換してLEDに出力します。可変抵抗を回すと、LEDが徐々に明るくなったり暗くなったりします。Arduino Core 3.0+ではanalogWrite()を直接使えます。ESP32-S2/S3ではADCの分解能を12ビットに固定します。

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 HTTPClient+天気API(LCD付き)
このプロジェクトでは、ESP32でHTTPClient.hを使い、インターネット経由で天気API(wttr.in)をREST APIとして呼び出します。返されたJSONレスポンスをArduinoJson v7で解析し、都市名、気温、湿度、天気、風の情報をI2C LCDディスプレイにトルコ語と英語で表示します。wttr.inは無料で、APIキーも不要です。都市名を入力するだけで、その都市の現在の天気を取得できます。30分ごとに自動更新し、表示画面ごとに異なるLEDの光り方で状態を知らせます。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

