کنترل GPIO در ESP8266 و ESP32 — آموزش جامع ورودی، خروجی، PWM و Interrupt
16
آذر 1404
0 نظر

کنترل GPIO در ESP8266 و ESP32 — آموزش جامع ورودی، خروجی، PWM و Interrupt

در این مقاله کنترل GPIO در ESP8266 و ESP32 را کاملاً عملی و پروژه‌محور یاد می‌گیرید: نحوه کار با ورودی و خروجی دیجیتال، PWM، Interrupt، پایه‌های بوت، محدودیت‌های GPIO و نکات جلوگیری از ریست شدن برد

مقدمه: GPIO چیست و چرا مهم است؟

پایه‌های ورودی/خروجی دیجیتال یا همان GPIO (General Purpose Input Output) مهم‌ترین رابط میان بردهای ESP8266 و ESP32 با دنیای بیرون هستند. هر پروژه‌ای که با ESP انجام می‌دهید—از روشن کردن یک LED ساده گرفته تا کنترل رله‌ها، خواندن سنسورها، سیستم‌های هوشمند، ارسال داده به اینترنت و …—بسته به GPIO ها اجرا می‌شود.

به همین دلیل، تسلط کامل بر GPIO اولین قدم برای حرفه‌ای شدن در دنیای ESP است.

اما کنترل GPIO در ESP فقط روشن و خاموش کردن نیست!
شامل موضوعات زیر هم می‌شود:

  • ورودی دیجیتال (خواندن دکمه، سنسورهای on/off)

  • خروجی دیجیتال (کنترل LED، رله، ماژول‌ها)

  • PWM (کنترل سرعت موتور، نور LED)

  • Interrupt یا وقفه

  • محدودیت‌های GPIO ها

  • ویژگی‌های خاص GPIO در ESP8266 و ESP32

  • Pull-up و Pull-down داخلی

  • Mapping پایه‌ها در مدل‌های مختلف

در این مقاله، تمام این موارد را کاملاً عملی و پروژه محور یاد می‌گیری.


فصل 1 — تفاوت GPIO در ESP8266 و ESP32

ESP8266 و ESP32 هر دو پایه‌های ورودی/خروجی دارند، اما ESP32 پیشرفته‌تر است. جدول مقایسه زیر کمک بزرگی به انتخاب برد مناسب می‌کند:

ویژگی ESP8266 ESP32
تعداد GPIO واقعی حدود 11 حدود 25
قابلیت PWM دارد (ساده) پیشرفته (LED PWM)
ADC یک کانال چندین کانال
DAC ندارد دو کانال DAC
وقفه (Interrupt) دارد بسیار قدرتمند
Touch Sensor ندارد دارد

فصل 2 — معرفی GPIO های مهم در ESP8266

تمام پایه‌های ESP8266 قابل استفاده نیستند. برخی از پایه‌ها نقش‌های خاص دارند. مهم‌ترین توضیح مربوط به پایه‌های زیر است:

GPIO0 – GPIO2 – GPIO15

این پایه‌ها هنگام بوت نقش حیاتی دارند. اشتباه در اتصال آنها باعث عدم بوت شدن ESP می‌شود.

GPIO16

برای interrupt سطح بالا محدودیت دارد.

GPIO6 تا GPIO11

برای ارتباط با حافظه فلش استفاده می‌شوند؛ هرگز نباید به آنها چیزی وصل شود!


فصل 3 — معرفی GPIO های ESP32

ESP32 تعداد زیادی پایه دارد، اما باز هم برخی پایه‌ها مخصوص هستند:

GPIO34 – GPIO35 – GPIO36 – GPIO39

فقط ورودی هستند. خروجی نیستند.

GPIO0

برای بوت استفاده می‌شود.

GPIO12

می‌تواند باعث تغییر تنظیمات داخلی ولتاژ فلش شود. بهتر است از آن دوری کنید.


فصل 4 — نوشتن اولین برنامه کنترل GPIO

قبل از شروع، اگر مقاله آپلود اولین برنامه روی ESP را نخوانده‌ای، بشدت توصیه می‌کنم آن را مطالعه کنی.

روشن کردن یک LED در ESP8266 و ESP32

#define LED_PIN 2 // GPIO2 void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); delay(500); digitalWrite(LED_PIN, LOW); delay(500); }

فصل 5 — خواندن ورودی دیجیتال (مثلاً دکمه)

اتصال پایه‌ها:

  • یک طرف دکمه → GND

  • طرف دیگر → GPIO + Pull-up داخلی

کد:

#define BUTTON_PIN 0 void setup() { Serial.begin(115200); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { if(digitalRead(BUTTON_PIN) == LOW){ Serial.println("Button Pressed"); } }

نکته سئو و فنی:

Pull-up داخلی باعث می‌شود نیازی به مقاومت خارجی نباشد و نویز کمتر شود.


فصل 6 — استفاده از PWM برای کنترل شدت نور یا سرعت موتور

در ESP8266

analogWrite(LED_PIN, 128); // (0 - 1023)

در ESP32

ESP32 PWM بسیار حرفه‌ای دارد:

const int freq = 5000; const int ledChannel = 0; const int resolution = 8; void setup(){ ledcSetup(ledChannel, freq, resolution); ledcAttachPin(2, ledChannel); } void loop(){ for(int i=0;i<255;i++){ ledcWrite(ledChannel, i); delay(10); } }

فصل 7 — وقفه یا Interrupt؛ مهم‌ترین ابزار در پروژه‌های حرفه‌ای

وقتی با دکمه، سنسور حرکتی، IR و ... کار می‌کنید، استفاده از وقفه بهترین انتخاب است.

void IRAM_ATTR handleInterrupt(){ Serial.println("Interrupt Fired!"); } void setup(){ pinMode(4, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(4), handleInterrupt, FALLING); }

فصل 8 — جدول Mapping پایه‌ها در بردهای مختلف

NodeMCU ESP8266

شماره روی برد GPIO واقعی
D0 16
D1 5
D2 4
D3 0
D4 2
D5 14
D6 12
D7 13
D8 15

ESP32 DevKit

پایه‌ها معمولاً همان شماره GPIO هستند.


فصل 9 — محدودیت‌های مهم GPIO که باید همیشه در ذهن داشته باشید

  • GPIO0، GPIO2، GPIO15 در بوت نقش دارند

  • GPIO12 حساس است و باعث بوت نشدن می‌شود

  • GPIO34-39 فقط ورودی هستند

  • GPIO6-11 در ESP8266 غیرقابل استفاده‌اند

این موارد باید همیشه در طراحی رعایت شود.


فصل 10 — کنترل چند خروجی و چند ورودی همزمان

مثلاً کنترل 4 رله + خواندن 2 دکمه + یک PWM:

int relays[] = {5, 4, 14, 12}; int buttons[] = {0, 2}; void setup(){ for(int i=0;i<4;i++) pinMode(relays[i], OUTPUT); for(int i=0;i<2;i++) pinMode(buttons[i], INPUT_PULLUP); } void loop(){ for(int i=0;i<2;i++){ if(!digitalRead(buttons[i])){ digitalWrite(relays[i], HIGH); } } }

فصل 11 — جلوگیری از ریست شدن ESP هنگام کار با GPIO

موضوع بسیار مهمی است؛ مقاله مرتبط:
روش‌های تغذیه صحیح ESP و جلوگیری از ریست شدن

شایع‌ترین دلایل ریست:

  • جریان ناکافی برای WiFi

  • اتصال سنسورها بدون منبع تغذیه درست

  • نویز روی GPIO ها

  • اشتباه در پایه‌های بوت


فصل 12 — کاربردهای عملی GPIO در پروژه‌های واقعی

  • کنترل رله در خانه هوشمند

  • کنترل LED RGB

  • خواندن سنسور PIR

  • گرفتن ورودی از کیپد

  • کنترل موتور PWM

  • خواندن سنسورهای دیجیتال مثل Hall

  • مانیتورینگ دما، رطوبت، حرکت و …


فصل 13 — جمع‌بندی

در این مقاله یاد گرفتید:

  • همه چیز درباره GPIO در ESP8266 و ESP32

  • پایه‌های حساس و قابل استفاده

  • ورودی، خروجی، pull-up/down

  • PWM حرفه‌ای ESP32

  • interrupt واقعی برای پروژه‌های حرفه‌ای

  • mapping پایه‌ها در NodeMCU و ESP32

  • جلوگیری از بوت نشدن و ریست شدن

اگر این مقاله را کامل یاد بگیری، 80٪ پروژه‌های ESP را از همین امروز می‌توانی بسازی.


  1. آشنایی کامل با بردهای توسعه ESP

  2. نصب درایور CH340 و CP2102 برای بردهای ESP

  3. آموزش آپلود اولین برنامه روی ESP

  4. روش‌های تغذیه صحیح ESP و جلوگیری از ریست شدن

  5. آشنایی کامل با فایل‌سیستم ESP (SPIFFS و LittleFS)



ارسال نظر
(بعد از تائید مدیر منتشر خواهد شد)
  • - نشانی ایمیل شما منتشر نخواهد شد.
  • - لطفا دیدگاهتان تا حد امکان مربوط به مطلب باشد.
  • - لطفا فارسی بنویسید.
  • - میخواهید عکس خودتان کنار نظرتان باشد؟ به gravatar.com بروید و عکستان را اضافه کنید.
  • - نظرات شما بعد از تایید مدیریت منتشر خواهد شد