اندازه گیری دما در آردوینو با سنسور دمای داخلی

اندازه گیری دما در آردوینو با سنسور دمای داخلی

سلام به همگی.

بیشتر میکرو های avr سنسور داخلی دما دارن تا توی دمای 80 درجه میکرو رو خاموش کنن تا از آسیب دیدن به میکرو جلوگیری بشه. حالا توی این آموزش ، کدی رو معرفی میکنیم که بوسیله اون میتونید دما رو بدون سنسور و بوسیله سنسور داخلی avr اندازه گیری کنید.این سنسور دما دقیقا مثل سنسور دمای CPUتوی کامپیوتر عمل میکنه . اگر میکرو هیچ درایوی انجام نده دما پایینه اما اگر از پایه های میکرو جریان بکشیم مثلا یک LED رو درایو کنیم ، دما شروع به بالا رفتن میکنه. پس دقت کنید دمایی که اندازه گیری میشه با دمای بیرون متفاوته و از دمای اتاق بیشتره پس نمیتونید باهاش دمای اتاق رو اندازه گیری کنید مگر اینکه میکرو برای بیشتر از 10 دقیقه خاموش بوده باشه و از پایه ها هیچ جریان کشی انجام نشه . در اینصورت با خطای 2± درجه میشه دمای محیط رو اندازه گرفت.

کاربرد دیگه ای که وجود داره دونستن دمای محیط و دمای عملکرده . مثلا دمای محیط 20 درجه هست و میکرو دماش حین کار 5 درجه افزایش پیدا میکنه و اگر دما 40 نشون داده بشه ، میفهمیم یه مشکلی هست و میتونیم با خاموش کردن میکرو از آسیب بیشتر جلوگیری کنیم. از این کد میشه برای خاموش کردن میکرو در دمای بالا استفاده کرد با یکم تغییر در کدش میتونید انجامش بدید.

طبق گفته دیتاشیت هم تا 2 درجه دقت وجود داره.

توی جدول زیر میکرو هایی که سنسور داخلی دارن و این کد رو ساپورت میکنند میتونید ببینید:

نام میکرو وضعیت سنسور داخلی دما
ATmega8ندارد
ATmega8Lندارد
ATmega8Aندارد
ATmega168ندارد
ATmega168Aدارد
ATmega168Pدارد
ATmega328دارد
ATmega328Pدارد
ATmega32U4دارد

این کد برای آردوینو نوشته شده و اگر نام میکرو روی آردوینوتون توی لیست بالا هست میتونید کد رو در نرم افزار arduino ide اجرا کنید و از طریق سریال مانیتور نتیجه رو ببینید.

دقت کنید که بعد از چند دقیقه کارکرد دما به مرور بالا میره و اگر آردوینو سنسور بهش وصل باشه یا در حال درایو کردن باشه دما مدام بالا تر میره و بطور میانگین افزایش دما تا 10 درجه بالا تر از دمای اتاق طبیعیه.

/*
 * 
 * 
 * 
 * clooner.ir
 * 
 * 
 */
// Internal Temperature Sensor
// Example sketch for ATmega328 types.
void setup()
{
  Serial.begin(9600);

  Serial.println(F("Internal Temperature Sensor"));
}

void loop()
{
  // Show the temperature in degrees Celcius.
  Serial.println(GetTemp(),1);
  delay(1000);
}

double GetTemp(void)
{
  unsigned int wADC;
  double t;

  // The internal temperature has to be used
  // with the internal reference of 1.1V.
  // Channel 8 can not be selected with
  // the analogRead function yet.

  // Set the internal reference and mux.
  ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3));
  ADCSRA |= _BV(ADEN);  // enable the ADC

  delay(20);            // wait for voltages to become stable.

  ADCSRA |= _BV(ADSC);  // Start the ADC

  // Detect end-of-conversion
  while (bit_is_set(ADCSRA,ADSC));

  // Reading register "ADCW" takes care of how to read ADCL and ADCH.
  wADC = ADCW;

  // The offset of 324.31 could be wrong. It is just an indication.
  t = (wADC - 324.31 ) / 1.22;

  // The returned temperature is in degrees Celcius.
  return (t);
}

مشکلی داشتید از قسمت نظرات بپرسید تا جاییکه بلد باشم راهنماییتون میکنم .

موفق باشید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *