آموزش کامل کار با ورودی آنالوگ در ESP8266 و ESP32 (ADC)
بردهای ESP بهخصوص ESP8266 و ESP32 در سالهای اخیر به یکی از مهمترین اجزای پروژههای IoT تبدیل شدهاند. قابلیت اتصال Wi-Fi، مصرف توان مناسب، قیمت اقتصادی و انعطافپذیری بالا، این بردها را به گزینهای ایدهآل برای پروژههای حرفهای و صنعتی تبدیل کرده است.
در میان قابلیتهای متعدد این خانواده از ماژولها، ورودی آنالوگ یا ADC یکی از کاربردیترین بخشهاست؛ زیرا تقریباً تمام پروژههای سنجش محیط (مثل دما، نور، گاز، لرزش، ولتاژ، جریان، فشار و …) به ADC نیاز دارند.
در این مقاله به صورت حرفهای، مفصل، عملی و کاملاً مهندسی تمام مفاهیم زیر را بررسی میکنیم:
-
معماری ADC در ESP8266
-
ساختار پیچیده و چندکانالهٔ ADC در ESP32
-
نکات بسیار مهم مربوط به ولتاژ ورودی
-
روشهای ضد نویز کردن ADC
-
تفاوت ADC های Hall Sensor ,WiFi Effect و External Channels
-
تنظیم سرعت نمونهبرداری و دقت رزولوشن
-
کالیبراسیون و تصحیح خطای ADC
-
پروژههای کاربردی و عملی
-
روش خواندن ADC در Arduino IDE، ESP-IDF و MicroPython
در طول مقاله، به طور طبیعی به مباحثی مانند روشهای تغذیه صحیح ESP و جلوگیری از ریست شدن و همچنین کنترل GPIO در ESP8266 و ESP32 اشاره میکنیم؛ چون این مقالات ارتباط مستقیم با کیفیت ADC دارند.
فصل ۱ — آشنایی با مفهوم ورودی آنالوگ (ADC)
وسایل الکترونیکی در دنیای فیزیکی با مقادیر پیوسته (Continuous) سروکار دارند؛ مثل:
-
شدت نور
-
شدت صدا
-
دمای محیط
-
میزان ولتاژ
-
میزان رطوبت
اما میکروکنترلرها فقط اعداد دیجیتال را درک میکنند. برای این تبدیل، باید از ADC — Analog to Digital Converter استفاده کنیم.
ADC به زبان ساده کاری میکند که:
مقدار ولتاژ ورودی (بین ۰ تا یک مقدار مشخص) به یک عدد دیجیتال بین ۰ تا 4095 (یا 0 تا 1023) تبدیل شود.
فصل ۲ — ADC در ESP8266
ESP8266 دارای فقط یک ورودی آنالوگ است:
✔ A0 (ADC0)
ولتاژ قابلقبول این پایه حداکثر 1.0 ولت است.
بردهای NodeMCU یا Wemos یک تقسیم مقاومتی داخلی دارند و مقدار ورودی را به ۳٫۳ ولت افزایش میدهند.
چرا فقط یک ADC؟
معماری ESP8266 ساده است و تمرکز آن روی Wi-Fi و قیمت پایین بوده. اما همین یک ADC هم برای بسیاری از پروژهها کافی است.
معایب ADC در ESP8266:
-
رزولوشن واقعی آن کمتر از مقدار اسمیست.
-
نویزپذیری بالا (به دلیل Wi-Fi)
-
سرعت متوسط
فصل ۳ — ADC در ESP32: معماری پیشرفته و پیچیده
ESP32 یک غول تمامعیار در پروژههای IoT است، خصوصاً وقتی پای ورودیهای آنالوگ وسط باشد.
✔ تعداد ADCها
ESP32 دارای دو واحد ADC مستقل است:
-
ADC1 (با ۸ کانال ورودی)
-
ADC2 (با ۱۰ کانال ورودی)
✔ محدودهٔ ولتاژ
ولتاژ مجاز:
در نسخههای جدید ESP32-S3 و ESP32-C3 این محدوده دقیقتر و خطیتر شده است.
✔ نکتهٔ بسیار مهم
ADC2 به دلیل اشتراک منابع با Wi-Fi، هنگام فعال بودن Wi-Fi نمیتواند نمونهبرداری کند.
به همین دلیل برای پروژههای حرفهای همیشه از ADC1 استفاده کنید.
فصل ۴ — رزولوشن ADC و محاسبات
رزولوشن ADC مشخص میکند خروجی چندبیتی است:
-
ESP8266 → رزولوشن 10 بیت (عدد 0 تا 1023)
-
ESP32 → رزولوشن 12 بیت (عدد 0 تا 4095)
محاسبه ولتاژ ورودی:
Vref معمولاً 3.3 ولت است اما در ESP32 تغییرپذیر است و باید کالیبره شود.
فصل ۵ — نکات بسیار مهم درباره تغذیه و تأثیر آن روی ADC
کیفیت ADC به شدت تحتتأثیر تغذیه است. در مقالهٔ قبل یعنی روشهای تغذیه صحیح ESP و جلوگیری از ریست شدن گفته شد:
-
حتماً از رگولاتور با Ripple پایین استفاده کنید.
-
ماژولها هنگام اتصال Wi-Fi یک جهش جریان ۴۰۰ میلیآمپر دارند.
-
اگر این جریان تأمین نشود، ADC پر از نویز خواهد شد.
این بخش یکی از رایجترین دلایل عدم پایداری ADC است.
فصل ۶ — تکنیکهای حذف نویز از ورودی آنالوگ
۱. فیلتر RC در ورودی
یک مقاومت ۱ کیلو + یک خازن 0.1µF بهترین انتخاب است.
۲. میانگینگیری نرمافزاری
کدی ساده و مؤثر:
۳. Median Filter
باعث حذف قلههای جهشی (Spike) میشود.
۴. Oversampling
یک تکنیک حرفهای برای افزایش رزولوشن مؤثر.
فصل ۷ — نکته طلایی درباره Wi-Fi و نویز ADC
در ESP32 واحد ADC2 در حالت Wi-Fi بسیار ناپایدار است.
اگر پروژهتان شامل ADC + Wi-Fi است، حتماً از ADC1 استفاده کنید.
فصل ۸ — کالیبراسیون ADC در ESP32
بهصورت پیشفرض دقت ADC در ESP32 ایدهآل نیست. با استفاده از دستور زیر (در ESP-IDF):
مقدار واقعی ولتاژ ورودی را دقیقتر حساب میکنید.
فصل ۹ — مثال عملی با Arduino IDE: خواندن ADC در ESP8266
فصل ۱۰ — مثال عملی خواندن ADC در ESP32
فصل ۱۱ — پروژههای واقعی با ADC در ESP
پروژه ۱ — سنسور نور محیط
فتوسل → ADC → تعیین سطح نور → روشن کردن LED یا ارسال داده به MQTT
پروژه ۲ — اندازهگیری سطح باتری
از تقسیم مقاومتی استفاده کنید.
پروژه ۳ — ساخت دیتالاگر محیطی
ADC + کارت MicroSD یا SPIFFS
در مقالهٔ آشنایی با ساختار فایل سیستم ESP (SPIFFS و LittleFS) دقیق توضیح داده شد که چگونه دادهها را ذخیره کنیم.
پروژه ۴ — اندازهگیری دما
ترمیستور + محاسبه دما با فرمول β
پروژه ۵ — سنسور گاز MQ
ADC بهترین روش برای خواندن خروجی این سنسورهاست.
فصل ۱۲ — استفاده از ADC در MicroPython
فصل ۱۳ — چرا ADC در ESP32 یک هنر است؟ (نکات حرفهای)
-
ADC وابسته به فضای Wi-Fi است → رفتار آن غیرخطی میشود
-
وابسته به دماست → در دمای بالا کمی تغییر میکند
-
ولتاژ رفرنس دقیق نیست → نیاز به کالیبراسیون دارد
-
باید از Attenuation مناسب استفاده کنید
-
از سیمکشی بلند پرهیز کنید
فصل ۱۴ — جدول Attenuation در ESP32
| مقدار | محدوده ولتاژ | کاربرد |
|---|---|---|
| 0dB | 0–1.1V | سنسورهای با خروجی پایین |
| 2.5dB | 0–1.5V | عمومی |
| 6dB | 0–2.2V | ولتاژهای نیمه بالا |
| 11dB | 0–3.3V | بیشترین رنج قابل تحمل |