⚖️ ESP32 یا ESP8266؟ مقایسهی کامل دو برد وایفای و راهنمای انتخاب
اگر میخواهی پروژهای بسازی که به وایفای وصل شود، خیلی زود به این سؤال میرسی: ESP32 یا ESP8266؟ هر دو از شرکت اسپرسیف (Espressif) هستند، هر دو با زبان آردوینو برنامهنویسی میشوند و هر دو وایفای دارند. ولی ESP8266 نسل قبلی و سادهتر است و ESP32 نسل بعدی و پرامکاناتتر. در این مقایسهی ESP32 و ESP8266 فرقها را با جدول مشخصات، تفاوت پینها و تفاوت کد توضیح میدهیم و در آخر یک برنامهی وبسرور مینویسیم که بدون تغییر روی هر دو برد کامپایل میشود.
دو برد در یک نگاه
ESP8266 معمولاً به شکل بردهای NodeMCU یا Wemos D1 mini فروخته میشود و ESP32 به شکل بردهای DevKit با ۳۰ یا ۳۸ پایه. جدول زیر نسخهی کلاسیک هر دو را مقایسه میکند:
| ویژگی | ESP8266 (NodeMCU، D1 mini) | ESP32 (DevKit) |
|---|---|---|
| پردازنده | یک هسته، ۸۰ یا ۱۶۰ مگاهرتز | دو هسته، تا ۲۴۰ مگاهرتز |
| رم | حدود ۸۰ کیلوبایت (بعد از وایفای حدود ۴۰ کیلو آزاد) | ۵۲۰ کیلوبایت |
| وایفای | ۲٫۴ گیگاهرتز | ۲٫۴ گیگاهرتز |
| بلوتوث | ندارد | بلوتوث کلاسیک و BLE |
| پین قابل استفاده | حدود ۱۱ روی NodeMCU | حدود ۲۵ روی DevKit |
| ورودی آنالوگ (ADC) | فقط یکی (A0)، ۱۰ بیتی | تا ۱۸ کانال، ۱۲ بیتی |
| خروجی آنالوگ (DAC) | ندارد | دو کانال (GPIO25 و GPIO26) |
| PWM | نرمافزاری | سختافزاری (ledc)، ۱۶ کانال |
| سریال سختافزاری | یکی کامل و یکی فقط ارسال | سه |
| پین لمسی | ندارد | ۱۰ پین |
| قیمت | ارزانتر | کمی گرانتر |
خانوادهی ESP32 هم چند عضو دارد: ESP32-S2 (یک هسته، بدون بلوتوث)، ESP32-S3 (دو هسته، مناسب پردازش تصویر و USB) و ESP32-C3 (یک هستهی RISC-V، فقط BLE). وقتی در آموزشها فقط «ESP32» میگویند، منظور همان ESP32 کلاسیک روی بردهای DevKit است.
نقطهی قوت ESP8266: ساده و ارزان
ESP8266 بردی بود که اینترنت اشیای ارزان را همهگیر کرد. برای یک کلید وایفای، یک سنسور دما که هر چند دقیقه عددی به سرور میفرستد یا یک چراغ که از گوشی روشن میشود، هنوز کاملاً کافی است. Wemos D1 mini خیلی کوچک است و جای کمی در جعبهی پروژه میگیرد. آموزشها و کتابخانههای قدیمی زیادی هم برایش نوشته شده است.
ولی محدودیتهایش زود خودشان را نشان میدهند. فقط یک ورودی آنالوگ دارد، پس اگر بخواهی همزمان رطوبت خاک و نور را بخوانی، به یک مبدل جدا نیاز داری. روی خود تراشه ورودی A0 فقط ۰ تا ۱ ولت را میخواند؛ بردهای NodeMCU یک تقسیمکنندهی ولتاژ دارند که این بازه را به ۳٫۳ ولت میرساند، ولی ماژول خام چنین چیزی ندارد. چند پین هم هنگام روشن شدن نقش ویژه دارند: GPIO0 و GPIO2 باید HIGH و GPIO15 باید LOW باشند، وگرنه برد بوت نمیشود. روی NodeMCU شمارههای چاپشده (D1، D2، …) با شمارهی GPIO فرق دارند؛ مثلاً D4 همان GPIO2 است که LED داخلی رویش است و با LOW روشن میشود.
نقطهی قوت ESP32: جا برای بزرگ شدن
ESP32 تقریباً در هر چیزی جلوتر است. دو هسته دارد، پس وایفای و برنامهی تو کمتر سر وقت پردازنده دعوا میکنند. رمش چند برابر است و صفحهی وب بزرگ، WebSocket و JSON را راحتتر تحمل میکند. ADC دوازده بیتی روی پینهای زیاد، PWM سختافزاری با واحد ledc، پینهای لمسی و بلوتوث هم دارد. خواب عمیقش هم راحتتر است: ESP32 با تایمر داخلی بیدار میشود، ولی ESP8266 برای بیدار شدن با تایمر باید GPIO16 با یک سیم به پین RST وصل شود.
ESP32 هم ریزهکاریهای خودش را دارد: ADC2 وقتی وایفای روشن است کار نمیکند، پینهای ۳۴ تا ۳۹ فقط ورودیاند و چند پین strapping دارد. همهی اینها در پین اوت ESP32 آمده است.
تفاوت کد: کمتر از آنچه فکر میکنی
هر دو با Arduino IDE برنامهنویسی میشوند و setup، loop، digitalWrite و Serial در هر دو یکی است. فرق اصلی در اسم کتابخانههاست:
| کار | ESP8266 | ESP32 |
|---|---|---|
| وایفای | #include <ESP8266WiFi.h> | #include <WiFi.h> |
| وبسرور | ESP8266WebServer | WebServer |
| کم و زیاد کردن نور | analogWrite (در هستههای جدید ۰ تا ۲۵۵، در قدیمیها ۰ تا ۱۰۲۳) | ledcAttach و ledcWrite |
| ورودی آنالوگ | analogRead(A0)، ۰ تا ۱۰۲۳ | analogRead(34)، ۰ تا ۴۰۹۵ |
با دستور پیشپردازندهی #if defined(ESP32) میشود یک برنامه نوشت که روی هر دو برد کامپایل شود. این وبسرور کوچک LED داخلی را با یک دکمه در مرورگر روشن و خاموش میکند:
// One web server sketch for both boards.
#if defined(ESP32)
#include <WiFi.h>
#include <WebServer.h>
WebServer server(80);
const int LED = 2; // DevKit blue LED, HIGH = on
const bool ON = HIGH;
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
ESP8266WebServer server(80);
const int LED = 2; // NodeMCU / D1 mini LED on GPIO2 (D4), LOW = on
const bool ON = LOW;
#else
#error "This sketch is for ESP32 or ESP8266"
#endif
const char* ssid = "Wokwi-GUEST"; // simulator network; use your own on a real board
const char* password = "";
bool ledOn = false;
void sendPage() {
String html = "<!doctype html><html><head><meta charset='utf-8'>";
html += "<meta name='viewport' content='width=device-width, initial-scale=1'></head><body>";
html += "<h2>LED is " + String(ledOn ? "ON" : "OFF") + "</h2>";
html += "<a href='/toggle'><button>Toggle</button></a></body></html>";
server.send(200, "text/html", html);
}
void setup() {
Serial.begin(115200);
pinMode(LED, OUTPUT);
digitalWrite(LED, !ON); // start with the LED off
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(300);
Serial.print(".");
}
Serial.println();
Serial.print("Open http://");
Serial.println(WiFi.localIP());
server.on("/", sendPage);
server.on("/toggle", []() {
ledOn = !ledOn;
digitalWrite(LED, ledOn ? ON : !ON);
sendPage();
});
server.begin();
}
void loop() {
server.handleClient(); // answer the browser
}
- بلوک
#if defined(ESP32)قبل از کامپایل انتخاب میشود؛ پس روی هر برد فقط کتابخانهی خودش include میشود. - ثابت
ONفرق LED داخلی دو برد را پنهان میکند: در ESP32 با HIGH روشن میشود و در ESP8266 با LOW. - بقیهی برنامه، یعنی
WiFi.begin،server.onوhandleClient، در هر دو یکی است.
Wokwi-GUEST اسم و رمز وایفای خودت را بنویس. هر دو برد فقط وایفای ۲٫۴ گیگاهرتز را میبینند؛ اگر وصل نشد، عیبیابی وایفای ESP32 را بخوان.کدام را انتخاب کنم؟
| هدف تو | پیشنهاد |
|---|---|
| یاد گرفتن اینترنت اشیا از صفر | ESP32؛ آموزش و مثال بیشتر و جا برای پروژههای بزرگتر |
| یک کلید یا سنسور سادهی وایفای | ESP8266 (D1 mini) کافی و ارزان است |
| چند سنسور آنالوگ همزمان | ESP32 |
| بلوتوث یا اتصال به گوشی بدون مودم | ESP32 |
| داشبورد وب با WebSocket و نمودار زنده | ESP32 به خاطر رم بیشتر |
| پروژهی باتریخور با خواب عمیق | هر دو؛ ESP32 راحتتر |
اگر هنوز بین آردوینو و ESP32 مردد هستی، مقایسهی ESP32 و آردوینو اونو و پیکو، ESP32 یا آردوینو را هم ببین.
قبل از خرید، در شبیهساز امتحان کن
برد ESP32 در شبیهساز تینکرکد فارسی هست: به شبکهی مجازی Wokwi-GUEST وصل میشود، صفحهی وبی که میسازد در تب «مرورگر» ویرایشگر باز میشود و MQTT هم یک داشبورد آماده دارد. البته این وایفای به اینترنت واقعی نمیرسد و برای تمرین وبسرور و ارتباط داخلی است. ESP8266 در این شبیهساز نیست (در خود Wokwi هم تمرکز روی خانوادهی ESP32 است)، ولی برنامهی بالا با همان بلوک #if بهعنوان ESP32 اجرا میشود. باز کردن و خواندن پروژهها رایگان است و اجرای ESP32 به اشتراک Plus نیاز دارد. برای شروع، پروژهی روشن کردن LED از صفحهی وب و درس وصل شدن به وایفای مناسباند.
اشتباههای رایج در انتخاب و مهاجرت
- شمارهی D را با GPIO یکی گرفتن: روی NodeMCU،
digitalWrite(4, HIGH)یعنی GPIO4 که روی برد D2 نوشته شده، نه D4. - ولتاژ ۵ ولت روی پین: هر دو برد با ۳٫۳ ولت کار میکنند. سنسور ۵ ولتی را بدون تقسیم ولتاژ به پین ورودی وصل نکن.
- انتظار ADC دقیق: ADC هیچکدام خطی و دقیق نیست. برای اندازهگیری حساس، مبدل جدا مثل ADS1115 بگذار.
- خرید ESP32 برای یک کار خیلی ساده: اشکالی ندارد، ولی اگر صد عدد لازم داری، ESP8266 یا ESP32-C3 اقتصادیترند.
همهی آموزشهای این برد در صفحهی ESP32 جمع شدهاند و اگر دنبال ایدهای، ایدههای پروژهی اینترنت اشیا با ESP32 را ببین.
وبسرور ESP32 را در تینکرکد فارسی ببین ⚖️سؤالهای رایج
برای شروع اینترنت اشیا ESP32 بخرم یا ESP8266؟
برای بیشتر کسانی که تازه شروع میکنند ESP32 انتخاب بهتری است: پین و ADC بیشتر، بلوتوث، PWM سختافزاری و آموزش و شبیهساز بیشتر. ESP8266 برای کارهای خیلی ساده و ارزان، مثل یک کلید وایفای، هنوز کافی است.
کد ESP8266 روی ESP32 اجرا میشود؟
منطق برنامه بله، ولی اسم چند کتابخانه فرق دارد: ESP8266WiFi.h به WiFi.h و ESP8266WebServer به WebServer تبدیل میشود. شمارهی پینها و پین ADC را هم باید دوباره بررسی کنی.
ESP8266 را هم میشود شبیهسازی کرد؟
در شبیهساز فارسی برد ESP8266 نیست، ولی ESP32 هست. چون مفهومها و بیشتر دستورها یکی است، میتوانی وایفای و وبسرور را روی ESP32 تمرین کنی و بعد روی ESP8266 واقعی ببری.