🌗 PWM روی ESP32 با ledc: کم و زیاد کردن نور LED

✍️ تیم ووکوی فارسی ·

در آردوینو اونو برای کم‌نور کردن LED از analogWrite استفاده می‌کنیم. ESP32 برای این کار یک بخش مخصوص و قدرتمند دارد به اسم ledc. در این قسمت از آموزش ESP32 یاد می‌گیریم با ledc یک چراغ «نفس‌کش» بسازیم که نرم روشن و خاموش می‌شود، و بعد نورش را با یک ولوم کنترل کنیم. مثل همیشه همه‌چیز را در شبیه‌ساز ESP32 فارسی امتحان می‌کنیم؛ همان نوع تجربه‌ای که در ووکوی (Wokwi) داری، ولی با توضیح فارسی.

PWM یعنی چه؟

پین دیجیتال فقط دو حالت دارد: روشن یا خاموش. PWM یعنی پین را خیلی سریع، مثلاً پنج هزار بار در ثانیه، روشن و خاموش کنیم. اگر بیشتر وقت روشن باشد، LED پرنور به نظر می‌رسد و اگر کم‌تر، کم‌نور. به درصد روشن بودن «دیوتی سایکل» می‌گویند. چشم ما آن‌قدر سریع نیست که چشمک‌ها را ببیند و فقط میانگین نور را می‌بیند.

قطعه‌ها و سیم‌کشی

قطعهپایهبه
LED + مقاومت ۲۲۰ اهمآند (از طریق مقاومت)GPIO4
LEDکاتدGND
پتانسیومتر (برای بخش دوم)دو پایه‌ی کناری / وسط3V3 و GND / GPIO34

کد ۱: چراغ نفس‌کش

این کد برای هسته‌ی ESP32 نسخه‌ی ۳ (Arduino-ESP32 3.x) نوشته شده که دستورهایش ساده‌تر است:

// ESP32 PWM with the LEDC unit (Arduino-ESP32 core 3.x)
const int LED = 4;
const int FREQ = 5000;    // 5000 pulses per second: too fast to see flicker
const int BITS = 10;      // 10-bit resolution: duty goes 0..1023

void setup() {
  Serial.begin(115200);
  ledcAttach(LED, FREQ, BITS);   // pin, frequency, resolution
  Serial.println("Fading with ledc, 0..1023");
}

void loop() {
  for (int duty = 0; duty <= 1023; duty += 16) {
    ledcWrite(LED, duty);         // core 3.x: write to the PIN
    delay(10);
  }
  for (int duty = 1023; duty >= 0; duty -= 16) {
    ledcWrite(LED, duty);
    delay(10);
  }
}

توضیح خط به خط

⚠️ اگر روی کامپیوترت هسته‌ی نسخه‌ی ۲ نصب است، ledcAttach را نمی‌شناسد. آنجا باید با «کانال» کار کنی: ledcSetup(0, 5000, 10); ledcAttachPin(4, 0); ledcWrite(0, duty); که در آن عدد اول ledcWrite شماره‌ی کانال است، نه پین.

کد ۲: نور با پتانسیومتر

// Knob on GPIO34 sets the LED brightness (core 3.x)
const int LED = 4;
const int KNOB = 34;

void setup() {
  ledcAttach(LED, 5000, 12);     // 12-bit: 0..4095, same range as analogRead
}

void loop() {
  int value = analogRead(KNOB);  // 0..4095 on ESP32
  ledcWrite(LED, value);
  delay(20);
}

نکته‌ی قشنگ این کد این است که ADC ورودی ESP32 هم ۱۲ بیتی است (۰ تا ۴۰۹۵). وقتی دقت PWM را هم ۱۲ بیت بگذاریم، عدد خوانده‌شده را بدون map مستقیم به LED می‌دهیم.

امتحانش کن

کد اول به‌صورت آماده در تینکرکد فارسی هست: کم و زیاد شدن نور با ledc (خواندن رایگان، اجرای ESP32 با اشتراک Plus). درس «PWM در ESP32 با ledc» همین را با تمرین درس می‌دهد و اگر می‌خواهی اصل PWM را اول روی اونو یاد بگیری، مقاله‌ی PWM در آردوینو را بخوان.

اشکال‌های رایج

قبلی را نخوانده‌ای؟ اولین پروژه‌ی ESP32: چشمک‌زن دو LED. همین ledc بعداً در داشبورد خانه‌ی هوشمند سرعت پنکه را کنترل می‌کند. همه‌ی آموزش‌ها در صفحه‌ی ESP32.

چراغ نفس‌کش ESP32 را باز کن 🌗

مقاله‌های مرتبط

🌡️

صفحه‌ی وب دما و رطوبت با سنسور DHT روی ESP32

🧩

ساخت API با JSON روی ESP32 با کتابخانه‌ی ArduinoJson

⚡

داده‌ی زنده با WebSocket روی ESP32

🐍

آموزش میکروپایتون از صفر: متغیر، شرط، حلقه، تابع، لیست و کار با پایه‌های برد

همه‌ی آموزش‌های ESP32 و اینترنت اشیا ← · همه‌ی مقاله‌ها