دما و رطوبت

آموزش LM35 با ESP32 و آردوینو؛ رفع خطای ADC و خرید در ایران

اندازه‌گیری دما با LM35DZ، اتصال به ESP32 و Uno، خواندن میلی‌ولت، عیب‌یابی ADC و مرجع، کد قابل دانلود و لینک خرید تاریخ‌دار ایران.

آموزش LM35 با ESP32 و آردوینو؛ رفع خطای ADC و خرید در ایران

آزمایشگاه سنسورها • دمای آنالوگ • ۲۴ شهریور ۱۴۰۵

چرا LM35 دمای اشتباه نشان می‌دهد؟

یک دماسنج رومیزی بسازیم که به‌جای پنهان‌کردن خطا، ولتاژ اندازه‌گیری‌شده را هم نشان بدهد. در این پروژه، LM35DZ را به ESP32 کلاسیک یا Arduino Uno R3 وصل می‌کنیم و مسیر «سنسور ← ولتاژ ← ADC ← دما» را مرحله‌به‌مرحله بررسی می‌کنیم.

این آموزش برای شروع اندازه‌گیری و عیب‌یابی است؛ کد هیچ هیتر یا رله‌ای را کنترل نمی‌کند و جای ابزار پزشکی یا حفاظت حرارتی مستقل نیست.

عکس واقعی بدنهٔ مشکی و سه پایهٔ سنسور LM35DZ با نوشتهٔ LM35 و DZ روی سطح تخت
عکس واقعی: © Nevit Dilmen، Wikimedia Commons، CC BY-SA 3.0. تغییر: کوچک‌سازی متناسب، حاشیه و تبدیل WebP؛ بدون برش. عکس، نقشهٔ پایه‌ها یا تأیید اصالت کالای فروشگاه نیست.

۱. خروجی پروژه و محدودهٔ آزمایش

هدف ما دیدن دمای محیط روی Serial Monitor و مقایسهٔ آن با مولتی‌متر و یک دماسنج مرجع است. پنجرهٔ آموزشی کد را ۱۵ تا ۹۰ درجه انتخاب کرده‌ایم؛ این انتخاب نرم‌افزاری است، نه ادعای دقت یا محدودهٔ نامی سنسور. ابتدا فقط در دمای اتاق آزمایش کنید؛ برای گرم‌کردن از شعله، هیتر کنترل‌نشده یا برق شهر استفاده نکنید.

اگر نخستین پروژهٔ سنسوری شماست، از دورهٔ سنسورها در ۷ قدم شروع کنید و سپس به هاب دما و رطوبت برگردید.

۲. LM35DZ با همهٔ اعضای خانواده یکسان نیست

مرجع مشخصات، دیتاشیت TI است: خروجی آنالوگ با ضریب ۱۰ میلی‌ولت بر درجه، تغذیهٔ مجاز ۴ تا ۳۰ ولت، و محدودهٔ نامی گرید LM35D برابر صفر تا ۱۰۰ درجه است. مدار سادهٔ تک‌تغذیه برای ناحیهٔ مثبت از حدود ۲ درجه به بالا مطرح می‌شود؛ اندازه‌گیری زیر صفر با همین اتصال قابل تعمیم نیست. مشخصات قطعهٔ اصلی را نمی‌توان برای نمونهٔ بی‌نام یا کپی تضمین کرد.

در این پروژه تغذیهٔ سنسور ۵ ولت تنظیم‌شده است؛ ۳٫۳ ولت زیر حد تغذیهٔ دیتاشیت است. ۵ ولت تغذیه را با ولتاژ خروجی اشتباه نگیرید و هرگز آن را به GPIO برد ESP32 وصل نکنید.

۳. تبدیل ولتاژ به دما؛ محاسبه را قابل بررسی نگه دارید

پس از اندازه‌گیری معتبر ولتاژ، رابطهٔ تبدیل T = Vout_mV / 10 است. مثال محاسباتی: ۲۵۰ میلی‌ولت به ۲۵ درجه و ۳۲۰ میلی‌ولت به ۳۲ درجه تبدیل می‌شود. این‌ها دادهٔ آزمایش فیزیکی ما نیستند.

خطای کوچک ولتاژ، اثر قابل دیدنی دارد: اختلاف ۸ میلی‌ولت یعنی اختلاف ۰٫۸ درجه در نتیجهٔ محاسبه. به همین دلیل فقط چاپ چند رقم اعشار نشانهٔ دقت نیست. هر بار عدد دما غیرمنطقی شد، پیش از تغییر ضریب تبدیل، خود ولتاژ و زمین مشترک را بررسی کنید.

۴. وسایل مورد نیاز

  • LM35DZ خام با سازنده و پایه‌بندی مشخص؛ ماژول آماده را بدون بررسی شماتیک جایگزین نکنید.
  • ESP32 کلاسیک یا Arduino Uno R3، کابل USB سالم و بردبورد.
  • تغذیهٔ ۵ ولت تنظیم‌شده و خازن ۱۰۰ نانوفاراد برای بای‌پس تغذیه.
  • مولتی‌متر، سیم کوتاه و دماسنج مرجع با دقت معلوم.

شمارهٔ دقیق برد مهم است: ESP32-S3 و C3 پین‌ها و رفتار ADC متفاوتی دارند. کد عمداً برای این مدل‌ها خطای کامپایل می‌دهد تا سیم‌بندیِ بررسی‌نشده به‌طور تصادفی استفاده نشود.

۵. اتصال ایمن به ESP32 و آردوینو

برای پکیج LP/TO-92، صفحهٔ ۳ دیتاشیت را با توجه به عبارت Bottom View تطبیق دهید: پایهٔ ۱ تغذیه، ۲ خروجی و ۳ زمین است. جهت نگاه از زیر را با نمای روبه‌رو اشتباه نگیرید. خازن بای‌پس را نزدیک تغذیه و زمین سنسور بگذارید؛ این خازن روی خروجی نیست.

پایه / بخشESP32 کلاسیکUno R3پیش از روشن‌کردن
۱، +VS۵ ولت تنظیم‌شدهپایهٔ 5Vتغذیهٔ سنسور را به ورودی ADC نزنید
۲، VOUTGPIO34A0ابتدا خروجی را با مولتی‌متر نسبت به GND بسنجید
۳، GNDزمین مشترک با بردGNDقطب‌ها و جهت پکیج را دوباره تطبیق دهید
خازن ۱۰۰ nFبین +VS و GND نزدیک سنسورسیم خروجی کوتاه بماند

اگر منبع ۵ ولت جداگانه دارید، زمین‌ها را مشترک کنید؛ خروجی دو منبع ۵ ولت را به هم متصل نکنید. پیش از جابه‌جایی سیم‌ها برق را قطع کنید. در صورت داغ‌شدن غیرعادی قطعه، ادامه ندهید.

۶. چرا raw × 3.3 ÷ 4095 کافی نیست؟

در API رسمی Espressif، analogRead دادهٔ خام و analogReadMilliVolts تبدیل کالیبره‌شده به میلی‌ولت را می‌دهد. برای ESP32 کلاسیک، بازهٔ مستند تنظیم ADC_2_5db حدود ۱۰۰ تا ۱۲۵۰ میلی‌ولت است؛ کد از همین تنظیم و تفکیک ۱۲ بیت استفاده می‌کند. جدول این مدل را به S3 یا C3 تعمیم ندهید.

پنجرهٔ ۱۵۰ تا ۹۰۰ میلی‌ولتِ این نمونه، انتخاب محافظه‌کارانهٔ ما برای تمرین است. کالیبراسیون داخلی ADC جای مقایسهٔ کل سامانه با مرجع را نمی‌گیرد. در Uno، مبدل ۱۰ بیت است و مرجع پیش‌فرض به تغذیه وابسته است؛ مقدار واقعی 5V را با مولتی‌متر نسبت به GND و زیر بار معمول اندازه بگیرید. در این برنامه هیچ منبع خارجی به AREF وصل نکنید.

۷. کد نمایش دما با میانگین‌گیری

هر ۲۰ میلی‌ثانیه یک نمونه و پس از ۱۶ نمونه یک خروجی تولید می‌شود. قرائت بیرون پنجره، بافر را پاک می‌کند؛ عدد قبلی به‌عنوان اندازه‌گیری تازه چاپ نمی‌شود. میانگین‌گیری برای آرام‌کردن نوسان است و خطای ثابت را اصلاح نمی‌کند.

در Uno ابتدا UNO_VREF_MV را از صفر به ولتاژ تغذیهٔ اندازه‌گرفته‌شده بر حسب میلی‌ولت تغییر دهید؛ تا آن زمان پیام CONFIG_REQUIRED طبیعی است. دانلود کد اصلی، کد RAW و راهنمای اتصال. نرخ سریال: ۱۱۵۲۰۰.

#include <Arduino.h>

// Educational display only. No heater, relay, or safety control.
#if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_IDF_TARGET_ESP32)
constexpr uint8_t SENSOR_PIN = 34;
#elif defined(ARDUINO_AVR_UNO)
constexpr uint8_t SENSOR_PIN = A0;
// Set to measured board supply in millivolts; 0 deliberately disables temperature.
constexpr uint16_t UNO_VREF_MV = 0;
#else
#error "Select classic ESP32 or Arduino Uno R3; other boards need reviewed ADC settings."
#endif

constexpr uint8_t SAMPLE_COUNT = 16;
uint32_t lastSample = 0;
uint32_t sumMv = 0;
uint8_t count = 0;

void setup() {
  Serial.begin(115200);
#if defined(ARDUINO_ARCH_ESP32)
  analogReadResolution(12);
  analogSetPinAttenuation(SENSOR_PIN, ADC_2_5db);
#else
  analogReference(DEFAULT); // Do not connect an external voltage to AREF.
#endif
  Serial.println(F("LM35 display: application window 15..90 C; not a safety monitor."));
}

void loop() {
  const uint32_t now = millis();
  if (now - lastSample < 20) return;
  lastSample = now;
  uint32_t mv;
#if defined(ARDUINO_ARCH_ESP32)
  mv = analogReadMilliVolts(SENSOR_PIN);
#else
  if (UNO_VREF_MV < 4500 || UNO_VREF_MV > 5500) {
    if (now % 1000 < 20) Serial.println(F("CONFIG_REQUIRED: measure VCC and set UNO_VREF_MV."));
    return;
  }
  mv = (uint32_t(analogRead(SENSOR_PIN)) * UNO_VREF_MV + 512) / 1024;
#endif
  // Plausibility window, NOT reliable open-wire or short-circuit detection.
  if (mv < 150 || mv > 900) {
    count = 0; sumMv = 0;
    Serial.print(F("OUTSIDE_DEMO_WINDOW mV=")); Serial.println(mv);
    return;
  }
  sumMv += mv;
  if (++count < SAMPLE_COUNT) return;
  const float averageMv = float(sumMv) / SAMPLE_COUNT;
  Serial.print(F("mV=")); Serial.print(averageMv, 1);
  Serial.print(F(" C=")); Serial.println(averageMv / 10.0f, 1);
  count = 0; sumMv = 0;
}

نمونهٔ RAW برای جداکردن مشکل سیم‌بندی از تبدیل دماست. در ESP32، raw و mV چاپ‌شده دو تبدیل جداگانه‌اند و نباید دقیقاً یک نمونه فرض شوند. این دو برنامه روی Uno و ESP32 کامپایل بررسی می‌شوند؛ آزمایش روی سخت‌افزار فیزیکی انجام نشده است.

۸. آزمایش را از مولتی‌متر شروع کنید

  1. تغذیه را قطع کنید، نام پکیج و پایه‌ها را تطبیق دهید و اتصال کوتاه ناخواسته را بررسی کنید.
  2. سنسور را روشن کنید؛ ابتدا VOUT را بدون اتصال به GPIO بسنجید. اگر نزدیک ریل تغذیه است، اتصال به ESP32 را ادامه ندهید.
  3. پس از قطع برق، خروجی را به ADC وصل کنید. با روشن‌کردن دوباره، کد RAW را اجرا و ولتاژ برد را با مولتی‌متر مقایسه کنید.
  4. کد اصلی را اجرا کنید؛ دماسنج مرجع و LM35 را کنار هم و دور از رگولاتور برد قرار دهید و برای پایدارشدن صبر کنید.
  5. در چند وضعیت پایدار، ولتاژ مولتی‌متر، میلی‌ولت برنامه و دمای مرجع را ثبت کنید؛ نتیجهٔ یک نقطه را به همهٔ دماها تعمیم ندهید.

بدنهٔ خام ضدآب نیست؛ آن را در آب فرو نبرید. لمس سنسور نیز شرایط آزمایش را تغییر می‌دهد؛ قرائت هنگام لمس را «دمای اتاق» گزارش نکنید.

۹. جدول عیب‌یابی قبل از تعویض سنسور

نشانهبررسی بعدیبرداشت درست
ولتاژ مولتی‌متر درست، عدد نرم‌افزار متفاوتمدل برد، پین، attenuation و مرجع Unoابتدا مسیر ADC را بررسی کنید
نوسان با تغییر بار بردزمین، بای‌پس و مسیر سیم‌هافیلتر نرم‌افزاری تنها راه‌حل نیست
اختلاف تقریباً ثابت با مرجعچند نقطهٔ پایدار و محل نصبیک offset شتاب‌زده علت را پنهان می‌کند
OUTSIDE_DEMO_WINDOWولتاژ واقعی و بازهٔ ۱۵ تا ۹۰ درجهٔ نمونهلزوماً خرابی سنسور نیست
سیم خروجی جدا ولی عدد ظاهراً عادیقطع برق و بررسی اتصال فیزیکیورودی شناور ممکن است عدد معتبرنما بدهد

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

۱۰. چه زمانی سراغ گزینهٔ دیگری برویم؟

برای یادگیری ADC و آزمایش رومیزی با سیم‌های کوتاه، LM35 گزینهٔ آموزشی قابل فهمی است. اگر نمی‌خواهید تبدیل آنالوگ را در نرم‌افزار مدیریت کنید، آموزش DS18B20 را بررسی کنید. اگر رطوبت هم لازم دارید، راهنمای SHT31 موضوع مرتبطی است. برای تمرین دیگرِ ورودی آنالوگ، هاب نور و رنگ را ببینید. انتخاب نهایی باید با محیط نصب و مشخصات دقیق مدل سنسور تطبیق داشته باشد.

۱۱. خرید در ایران؛ قطعهٔ خام، موجودی و اصالت

بررسی لینک‌ها: ۲۴ شهریور ۱۴۰۵، برابر با ۲۰۲۶/۰۹/۱۵. وجود فهرست فروش در دو فروشگاه و پرسش‌های کاربردی خریداران دربارهٔ اندازه‌گیری و کنترل دما، نشانهٔ کاربرد عملی در بازار ایران است؛ آمار فروش یا تضمین مشتری‌داشتن هر پروژه نیست. مشخصات فنی را از دیتاشیت بگیرید، نه عنوان یا توضیح فروشگاهی.

فروشگاه و محصول دقیقنوع / شناسهوضعیت هنگام بررسی
خرید LM35DZ از ECAقطعهٔ خام؛ 3051001001موجود؛ اصالت TI تأیید نشده
LM35DZ بستهٔ دوتایی در آفتاب‌رایانهقطعهٔ خام؛ 6006-78-9704ناموجود؛ لینک برای بررسی تأمین بعدی

در بخش پرسش‌وپاسخ ECA یک پاسخ قدیمی فروشنده، محصول را «های کپی» توصیف کرده است. این پاسخ اثبات وضعیت محمولهٔ فعلی نیست، اما دلیل کافی است که اصالت را فرض نکنیم. پیش از خرید، سازنده و اصالت سری موجود را از فروشگاه بپرسید؛ برای دقت تضمین‌شده، قطعهٔ قابل‌ردیابی و مستند لازم است.

موجودی تغییر می‌کند و قیمت ثابت درج نکرده‌ایم. LM35 سنسور آنالوگ است؛ عنوان فروشگاهی «دیجیتال»، آن را به سنسور دیجیتال تبدیل نمی‌کند. ماژول آماده یا پروب سیم‌دار نیز بدون بررسی مدار و عایق‌بندی معادل همین قطعهٔ خام نیست.

۱۲. پرسش‌های رایج

آیا LM35DZ را با ۳٫۳ ولت تغذیه کنیم؟

در این آموزش خیر؛ تغذیهٔ ۵ ولت تنظیم‌شده در نظر گرفته شده است و خروجی باید پیش از اتصال به ESP32 با مولتی‌متر بررسی شود.

چرا برنامهٔ Uno پیام CONFIG_REQUIRED می‌دهد؟

مقدار مرجع ابتدا صفر است. تغذیهٔ برد را اندازه بگیرید و مقدار میلی‌ولت واقعی را در UNO_VREF_MV وارد کنید؛ تا آن زمان تبدیل دما عمداً غیرفعال است.

آیا میانگین‌گیری دقت واقعی را افزایش می‌دهد؟

می‌تواند نوسان را کمتر کند، اما خطای ثابت سنسور، مرجع یا محل نصب را برطرف نمی‌کند. دقت نهایی باید با مرجع بررسی شود.

آیا OUTSIDE_DEMO_WINDOW یعنی سنسور خراب است؟

نه؛ فقط قرائت بیرون پنجرهٔ انتخابی این نمونه است. ابتدا ولتاژ و اتصال را بررسی کنید و از این پیام برای تشخیص قطعی خرابی استفاده نکنید.

آیا کد برای روشن‌کردن هیتر آماده است؟

خیر؛ این کد فقط نمایش آموزشی است و تشخیص خطای کافی، کنترل توان یا حفاظت مستقل ندارد. آزمایش فیزیکی نیز انجام نشده است.

۱۳. منابع و مسیر ادامه

گام بعدی: یک جدول از اندازه‌گیری‌های واقعی خود بسازید؛ تا اختلاف ADC، خطای سنسور و اثر نصب از هم جدا نشده‌اند، ضریب تصحیح نهایی نسازید. سایر آموزش‌ها در آزمایشگاه سنسورها در دسترس است.

پرسش و پاسخ مقاله

سوال فنی خود را مطرح کنید

پرسش‌ها و پاسخ‌ها پس از بررسی مدیر منتشر می‌شوند. نویسنده، پیش‌نویس در انتظار بررسی را می‌بیند.

هنوز پرسش تاییدشده‌ای برای این مقاله ثبت نشده است.