آموزش کامل کار با ورودی آنالوگ در ESP8266 و ESP32 (ADC)
19
آذر 1404
0 نظر

آموزش کامل کار با ورودی آنالوگ در ESP8266 و ESP32 (ADC)

در این مقاله یکی از مهم‌ترین قابلیت‌های بردهای ESP یعنی ورودی آنالوگ (ADC) را به‌صورت کاملاً کاربردی، مهندسی و حرفه‌ای بررسی می‌کنیم. از تفاوت ADC در ESP8266 و ESP32 تا نویزگیری، کالیبراسیون، Attenuation

بردهای 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 (با ۱۰ کانال ورودی)

✔ محدودهٔ ولتاژ

ولتاژ مجاز:

0V تا 3.3V

در نسخه‌های جدید ESP32-S3 و ESP32-C3 این محدوده دقیق‌تر و خطی‌تر شده است.

✔ نکتهٔ بسیار مهم

ADC2 به دلیل اشتراک منابع با Wi-Fi، هنگام فعال بودن Wi-Fi نمی‌تواند نمونه‌برداری کند.
به همین دلیل برای پروژه‌های حرفه‌ای همیشه از ADC1 استفاده کنید.


 فصل ۴ — رزولوشن ADC و محاسبات

رزولوشن ADC مشخص می‌کند خروجی چندبیتی است:

  • ESP8266 → رزولوشن 10 بیت (عدد 0 تا 1023)

  • ESP32 → رزولوشن 12 بیت (عدد 0 تا 4095)

محاسبه ولتاژ ورودی:

Voltage = (ADC_Value / Max_Value) * Vref

Vref معمولاً 3.3 ولت است اما در ESP32 تغییرپذیر است و باید کالیبره شود.


 فصل ۵ — نکات بسیار مهم درباره تغذیه و تأثیر آن روی ADC

کیفیت ADC به شدت تحت‌تأثیر تغذیه است. در مقالهٔ قبل یعنی روش‌های تغذیه صحیح ESP و جلوگیری از ریست شدن گفته شد:

  • حتماً از رگولاتور با Ripple پایین استفاده کنید.

  • ماژول‌ها هنگام اتصال Wi-Fi یک جهش جریان ۴۰۰ میلی‌آمپر دارند.

  • اگر این جریان تأمین نشود، ADC پر از نویز خواهد شد.

این بخش یکی از رایج‌ترین دلایل عدم پایداری ADC است.


 فصل ۶ — تکنیک‌های حذف نویز از ورودی آنالوگ

۱. فیلتر RC در ورودی

یک مقاومت ۱ کیلو + یک خازن 0.1µF بهترین انتخاب است.

۲. میانگین‌گیری نرم‌افزاری

کدی ساده و مؤثر:

int readADC() { long sum = 0; for(int i = 0; i < 50; i++){ sum += analogRead(34); delayMicroseconds(200); } return sum / 50; }

۳. Median Filter

باعث حذف قله‌های جهشی (Spike) می‌شود.

۴. Oversampling

یک تکنیک حرفه‌ای برای افزایش رزولوشن مؤثر.


 فصل ۷ — نکته طلایی درباره Wi-Fi و نویز ADC

در ESP32 واحد ADC2 در حالت Wi-Fi بسیار ناپایدار است.
اگر پروژه‌تان شامل ADC + Wi-Fi است، حتماً از ADC1 استفاده کنید.


 فصل ۸ — کالیبراسیون ADC در ESP32

به‌صورت پیش‌فرض دقت ADC در ESP32 ایده‌آل نیست. با استفاده از دستور زیر (در ESP-IDF):

esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, DEFAULT_VREF, &adc_chars);

مقدار واقعی ولتاژ ورودی را دقیق‌تر حساب می‌کنید.


 فصل ۹ — مثال عملی با Arduino IDE: خواندن ADC در ESP8266

void setup() { Serial.begin(115200); } void loop() { int value = analogRead(A0); float voltage = (value / 1023.0) * 3.3; Serial.println(voltage); delay(500); }

 فصل ۱۰ — مثال عملی خواندن ADC در ESP32

void setup() { Serial.begin(115200); } void loop() { int value = analogRead(34); float voltage = value * (3.3 / 4095.0); Serial.println(voltage); delay(500); }

 فصل ۱۱ — پروژه‌های واقعی با ADC در ESP

پروژه ۱ — سنسور نور محیط

فتوسل → ADC → تعیین سطح نور → روشن کردن LED یا ارسال داده به MQTT

پروژه ۲ — اندازه‌گیری سطح باتری

از تقسیم مقاومتی استفاده کنید.

پروژه ۳ — ساخت دیتالاگر محیطی

ADC + کارت MicroSD یا SPIFFS

در مقالهٔ آشنایی با ساختار فایل سیستم ESP (SPIFFS و LittleFS) دقیق توضیح داده شد که چگونه داده‌ها را ذخیره کنیم.

پروژه ۴ — اندازه‌گیری دما

ترمیستور + محاسبه دما با فرمول β

پروژه ۵ — سنسور گاز MQ

ADC بهترین روش برای خواندن خروجی این سنسورهاست.


 فصل ۱۲ — استفاده از ADC در MicroPython

from machine import ADC, Pin import time adc = ADC(Pin(34)) adc.atten(ADC.ATTN_11DB) while True: val = adc.read() print(val) time.sleep(0.5)

 فصل ۱۳ — چرا 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 بیشترین رنج قابل تحمل

 فصل ۱۵ — چرا باید ADC را به درستی سیم‌کشی کنیم؟

  • سیم‌بلند → آنتن برای نویز

  • نزدیکی به موتور یا رله → ایجاد Spike

  • دقتیل (Decoupling) ضروری است

در مقاله روش‌های تغذیه صحیح ESP و جلوگیری از ریست شدن دقیق گفتیم که چگونه باید سیستم را عایق کرد.


 فصل ۱۶ — مقایسه ESP8266 و ESP32 از نظر ADC

ESP8266:

  • فقط ۱ کانال

  • رزولوشن 10 بیت

  • نویزپذیر

  • برای سنسورهای ساده مناسب است

ESP32:

  • دو واحد ADC

  • ۱۸ کانال

  • رزولوشن ۱۲ بیت

  • قابلیت تنظیم Attenuation

  • امکان کالیبراسیون

  • مناسب پروژه‌های صنعتی


 فصل ۱۷ — تحلیل سیگنال‌های آنالوگ (پیشرفته)

برای پروژه‌های حرفه‌ای مثل:

  • سنسور ارتعاش

  • اندازه‌گیری صدا

  • تحلیل شکل موج

ADC در ESP32 به اندازه میکروکنترلرهای صنعتی (مثل STM32) سریع نیست، اما با:

  • Oversampling

  • Filtering

  • Downsampling

  • Fixed-point math

می‌توانید نتایج بسیار قابل‌قبولی بگیرید.


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

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

  • ADC در ESP8266 ساده اما کاربردی است

  • ADC در ESP32 بسیار پیشرفته و چندکاناله است

  • ولتاژ مرجع و Attenuation نقش حیاتی دارند

  • نویزگیری مهم‌ترین بخش پروژه‌های آنالوگ است

  • تغذیه صحیح، کیفیت ADC را چندین برابر بهتر می‌کند

  • کالیبراسیون در ESP32 ضروری است

  • مثال‌ها و پروژه‌های واقعی را بررسی کردیم

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