بسیاری از سنسورها (پتانسیومتر، سنسور نور LDR، سنسور رطوبت خاک و ...) خروجی آنالوگ میدهند، یعنی ولتاژی پیوسته بین ۰ تا ۳٫۳ ولت. برای خواندن این ولتاژ، از ADC (مبدل آنالوگ به دیجیتال) استفاده میکنیم.
پایههای ADC در ESP32
ESP32 دارای دو واحد ADC است (ADC1 و ADC2) که روی پایههای خاصی مانند GPIO32 تا GPIO39 در دسترساند. هنگام استفادهٔ همزمان از Wi-Fi، ADC2 ممکن است در دسترس نباشد؛ بنابراین پایههای ADC1 (32 تا 39) انتخاب امنتریاند.
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
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) بود که در نسخهٔ میکروپایتون این درس دیدید.
برای اجرای مثال پتانسیومتر بالا (بدون سروو)، یک پروژهٔ خالی Arduino/ESP32 در Wokwi بسازید.
ساخت پروژهٔ خالی Arduino/ESP32 در Wokwi ↗کارگاه عملی: یک مدار با پتانسیومتر بسازید و مقدار آن را به روشنایی LED یا یک عدد در سریال مانیتور نگاشت کنید.