متوسط⏱ 14 دقیقه مطالعه

بسیاری از سنسورها (پتانسیومتر، سنسور نور LDR، سنسور رطوبت خاک و ...) خروجی آنالوگ می‌دهند، یعنی ولتاژی پیوسته بین ۰ تا ۳٫۳ ولت. برای خواندن این ولتاژ، از ADC (مبدل آنالوگ به دیجیتال) استفاده می‌کنیم.

پایه‌های ADC در ESP32

ESP32 دارای دو واحد ADC است (ADC1 و ADC2) که روی پایه‌های خاصی مانند GPIO32 تا GPIO39 در دسترس‌اند. هنگام استفادهٔ هم‌زمان از Wi-Fi، ADC2 ممکن است در دسترس نباشد؛ بنابراین پایه‌های ADC1 (32 تا 39) انتخاب امن‌تری‌اند.

اتصال پتانسیومتر به ورودی آنالوگ ESP32
CPP
const int ADC_PIN = 34;

void setup() {
  Serial.begin(115200);
  analogReadResolution(12);       // دقت ۱۲ بیتی: ۰ تا ۴۰۹۵
}

void loop() {
  int raw = analogRead(ADC_PIN);
  float voltage = raw / 4095.0 * 3.3;
  Serial.print("مقدار خام: ");
  Serial.print(raw);
  Serial.print("   ولتاژ: ");
  Serial.println(voltage, 2);
  delay(500);
}
ℹ️ اطلاعات

هستهٔ Arduino-ESP32 به‌طور پیش‌فرض دقت ADC را روی ۱۲ بیت (۰ تا ۴۰۹۵) تنظیم می‌کند؛ با analogReadResolution() می‌توانید آن را صراحتاً مشخص کنید. برای تغییر بازهٔ ولتاژ قابل‌اندازه‌گیری، از analogSetAttenuation() (مثلاً ADC_11db برای بازهٔ کامل ۰ تا ۳٫۳ ولت) استفاده کنید.

مثال کاربردی: نگاشت پتانسیومتر به PWM

CPP
const int ADC_PIN = 34;
const int LED_PIN = 2;

void setup() {
  analogReadResolution(12);
  ledcAttach(LED_PIN, 1000, 10);
}

void loop() {
  int raw = analogRead(ADC_PIN);            // ۰ تا ۴۰۹۵
  int duty = map(raw, 0, 4095, 0, 1023);    // نگاشت به بازهٔ PWM
  ledcWrite(LED_PIN, duty);
}
💡 نکته

تابع map() یک ابزار بسیار کاربردی در Arduino است که یک مقدار را از یک بازه به بازهٔ دیگر نگاشت می‌کند؛ معادل دستی آن در پایتون همان محاسبهٔ نسبت (raw/4095*1023) بود که در نسخهٔ میکروپایتون این درس دیدید.

شبیه‌سازی زندهٔ ADC در یک پروژهٔ واقعی (تشخیص‌دهندهٔ گاز) — دقیقاً همان analogRead روی پایهٔ ۳۴ که در این درس دیدید باز کردن در Wokwi ↗
در حال بارگذاری شبیه‌ساز… (ممکن است چند ثانیه طول بکشد)

این یک شبیه‌سازی واقعی و قابل اجراست؛ روی دکمه پخش (▶) در Wokwi بزنید تا کد روی برد مجازی ESP32 اجرا شود. اگر جعبهٔ بالا بیش از حد سیاه/خالی ماند، صفحه را رفرش کنید یا از دکمهٔ «باز کردن در Wokwi» بالا استفاده کنید.

🧩

برای اجرای مثال پتانسیومتر بالا (بدون سروو)، یک پروژهٔ خالی Arduino/ESP32 در Wokwi بسازید.

ساخت پروژهٔ خالی Arduino/ESP32 در Wokwi ↗
🛠️ کارگاه عملی

کارگاه عملی: یک مدار با پتانسیومتر بسازید و مقدار آن را به روشنایی LED یا یک عدد در سریال مانیتور نگاشت کنید.

❓ کدام تابع Arduino یک مقدار عددی را از یک بازه به بازهٔ دیگر نگاشت می‌کند؟
طراحی و توسعه: امین شیخ نجدیglcd.ir | نسخهٔ افزونه: 1.21.0