رفتن به محتوا

انتقال کدهای ESP8266 به ESP32

اخیراً شرکت اسپرسیف اعلام کرده است که قصد دارد ESP8266 را به‌تدریج کنار بگذارد و آن را با نسل جدید یعنی ESP32-S3 جایگزین کند.

حال فرض کنید می‌خواهید از ESP8266 به برادر بزرگ‌تر آن یعنی ESP32 مهاجرت کنید. دلایل زیادی برای این کار دارید؛ همان‌طور که قبلاً دیدیم، قابلیت‌های ESP32 بسیار فراتر است.

اما در این میان یک سؤال مهم پیش می‌آید: تکلیف برنامه‌ها، کدها و پروژه‌های قبلی چه می‌شود؟ نگران نباشید… معمولاً تبدیل برنامه از ESP8266 به ESP32 اگر چند نکته کوچک را در نظر بگیرید، بسیار ساده است.

برخی هم ممکن است به حالت برعکس فکر کنند؛ یعنی تبدیل کد از ESP32 به ESP8266. به‌طور کلی این کار معمولاً ممکن نیست، مگر در برنامه‌های بسیار ساده، چون ESP32 از نظر قدرت و امکانات بسیار فراتر از ESP8266 است.


نام کتابخانه‌ها بین ESP8266 و ESP32 متفاوت است. در ESP8266 معمولاً پیشوند ESP8266 در نام کتابخانه‌ها وجود دارد، در حالی که در ESP32 این پیشوند حذف شده است.

برای مثال، کتابخانه ESP8266WiFi.h در ESP32 به WiFi.h تبدیل می‌شود. همچنین ESP8266HTTPClient در ESP32 به HTTPClient تغییر می‌کند و همین الگو برای سایر کتابخانه‌ها نیز صدق می‌کند.

در واقع این تغییر در ESP32 یک بهبود محسوب می‌شود. به بیان دیگر، این موضوع یکی از اشتباهات اولیه در طراحی کتابخانه‌های ESP8266 بود که در نسخه ESP32 اصلاح شد. مزیت حذف پیشوند این است که می‌توان کد را با تغییرات بسیار کمتر روی پلتفرم‌های دیگر نیز کامپایل کرد.

اگر بخواهید برنامه‌ای بنویسید که هم روی ESP8266 و هم روی ESP32 اجرا شود، می‌توانید از دستورات پیش‌پردازنده (Preprocessor) مانند زیر استفاده کنید:

#if defined(ESP8266)
#define HARDWARE "ESP8266"
#include "ESP8266WiFi.h"
#elif defined(ESP32)
#define HARDWARE "ESP32"
#include "WiFi.h"
#endif

در این بخش نکته پیچیده‌ای وجود ندارد. پایه‌های GPIO در ESP8266 و ESP32 کاملاً متفاوت هستند. اگر جایی در کد پین‌ها را درست انتخاب کرده باشید، بیشتر شبیه به شانس بوده است تا تطابق.

بنابراین باید بررسی کنید که در ESP32 از کدام پین‌ها می‌خواهید استفاده کنید و آن‌ها را در کد خود تغییر دهید.

خوشبختانه ESP32 تعداد GPIO بسیار بیشتری نسبت به ESP8266 دارد، بنابراین از نظر تعداد پایه‌ها محدودیتی نخواهید داشت؛ فقط کافی است انتخاب درستی انجام دهید.


در ESP32 تابعی مانند analogWrite که در ESP8266 وجود دارد، به‌صورت پیش‌فرض وجود ندارد. دلیل آن این است که ESP32 روش‌های متنوع‌تری برای تولید سیگنال PWM ارائه می‌دهد.

اگر در کد ESP8266 از خروجی PWM استفاده کرده‌اید، بهترین کار این است که از کتابخانه‌هایی استفاده کنید که قابلیت مشابه analogWrite را برای ESP32 فراهم می‌کنند. در این صورت، تقریباً نیازی به تغییر زیاد در کد نخواهید داشت.


در مورد سایر کتابخانه‌ها چه؟ مثل کتابخانه‌های خواندن سنسورها یا انجام عملیات مختلف… پاسخ این است که همه چیز به خود کتابخانه بستگی دارد (چون تعداد آن‌ها بسیار زیاد است).

در حالت کلی، احتمال زیادی وجود دارد که بسیاری از کتابخانه‌ها بدون تغییر روی ESP32 کار کنند، اما این موضوع به این بستگی دارد که در داخل آن‌ها از چه توابعی (مثل تایمرها یا رجیسترها) استفاده شده باشد و تا چه حد قابل حمل (Portable) طراحی شده باشند.

اگر خوش‌شانس باشید، همه چیز مستقیم کار می‌کند؛ و اگر نه، باید جایگزین مناسب پیدا کنید. اما معمولاً این کار سخت نیست، چون تقریباً برای تمام کتابخانه‌های مهم، نسخه سازگار با ESP8266 وجود دارد.