سنسور دما MLX90615.
با توجه به شیوع بیماری کرونا و اینکه یکی از علائم این بیماری دمای بالای بدن است، نیاز است تا دمای بدن افراد اندازهگیری شود، این کار را با یکی از پروژه های آردوینو می توانیم انجام دهیم. راهحل ایمن و مطمئن این است که ما بدون نزدیک شدن به افراد بتوانیم دمای بدن آنها را اندازه بگیریم.
خب این راهحلی است که پزشکان با توجه به خطراتی که این بیماری دارد به سایرین پیشنهاد میکنند. در این باید به دنبال پیادهسازی راهحل بود.
یکی از راههای پیادهسازی این راهحل، سنسور دمای مادون قرمز میباشد ک در ادامه به معرفی یک نوع از این سنسورها میپردازیم و در نهایت این سنسور را راهاندازی خواهیم کرد.
سنسور دما MLX90615 یک دماسنج مادون قرمز برای اندازهگیری دما، بدون تماس مستقیم است.
مشخصات سنسور دما MLX90615
- سایز کوچک و هزینه پایین
- قابل حمل
- رنج دمایی 40- تا 85+ برای دمای سنسور
- رنج دمایی 40- تا 115+ برای دمای پکیج
- رزولوشن 0.02 درجهی سانتیگراد
- حالت ذخیره انرژی
- خروجی PWM قابل تنظیم
- تغذیه 3 ولت
- اندازهگیری دمای بدون تماس، با دقت بالا
- پشتیبانی از پروتکل I2C
- پشتیبانی از 127 سنسور مختلف در پروتکل I2C
پکیج این سنسور دما، در استاندارد صنعتی TO-46 است. این سنسور دمای محیط و همچنین دمای پکیج را یا با استفاده از پروتکل I2C و یا یک خروجی PWM به ما میدهد.
دو دمای ذکر شده درون RAMی که در خود سنسور وجود دارد، ذخیره میشوند. و همانطور که گفتیم یا باید از پروتکل I2C و یا خروجی PWM این مقادیر را بخوانیم.
زمانی که از پروتکل I2C استفاده میکنیم هر یک از این دماها در 16 بیت و زمان استفاده از PWM این دماها در 10 بیت قابل دسترس هستند.
پروتکلی که ما در این پروژه برای خواندن دما استفاده خواهیم کرد پروتکل I2C است.
در ادامه به بررسی اجمالی پروتکل I2C میپردازیم و چگونگی انتقال دیتا با سنسور را شرح خواهیم داد.
پروتکل I2C
پروتکل I2C یکی از پروتکلهای پایه و متدوال در الکترونیک میباشد و بسیاری از آیسیها، سنسورها و ماژولها با استفاده از این پروتکل راهاندازی میشوند.
این پروتکل، یک پروتکل سنکرون میباشد که تنها با استفاده از دو سیم دیتا را انتقال میدهد و همین تعداد پایههای کم، یکی از مزایای مهم این پروتکل است.
دو سیم ذکر شده در بالا عبارتاند از SDA و SCL. در واقع روی سیم SDA دیتا قرار میگیرد و سیم SCL وظیفهی تامین کلاک را بر عهده دارد.
برای این که درک درستی از این پروتکل داشته باشید ابتدا به تصویر زیر توجه کنید:
همانطور که از تصویر بالا مشخص است این پروتکل به صورت Master-Slave کار میکند. در تصویر بالا چنیدن Slave وجود دارد اما تنها یک Master موجود است. به عنوان یک نکته مهم در نظر داشته باشید که بر خلاف پروتکل SPI در این پروتکل چندین Master نیز میتوانند وجود داشته باشند. در تصویر بالا فقط برای سادگی یک Master آورده شده است.
در این پروتکل همهی سیمهای SDA به هم و همهی سیمهای SCL نیز به هم متصل میشوند!
حال شاید از خود بپرسید اگر همهی این سیمها به هم وصل میشوند، پس چگونه مشخص میشود که دیتا باید به کدام Slave برود یا این دیتا را کدام Master فرستاده است؟
این سوال یک سوال بسیار خوب و برخواسته از آنجایی است که در پروتکل SPI تنها یک Master وجود دارد و مشکلی در اینکه کدام Master دیتا را میفرستد نداریم و همچنین به ازای هر Slave نیز یک پین برای انتخاب آن وجود دارد و مشخص است که قرار است دیتا به کدام Slave فرستاده شود و هیچ ابهامی وجود ندارد. حال زمانی که پروتکل SPI را با پروتکل I2C مقایسه میکنیم این سوال مهم پیش میآید که کدام Master دیتا را میفرستد و همچنین دیتای فرستاده شده توسط کدام Slave دریافت میشود وقتی که کلا دو سیم بیشتر نداریم و این دو سیم بین تمام Master و Slaveها مشترک است.
جواب سوال این است در ابتدا هر کدام از Masterها بخواهد دیتا بفرستد باید کنترل باس را در اختیار بگیرد. Master برای به کنترل در آوردن باس باید زمانی که SCL بالا یا در حالت 1 منطقی قرار دارد یک لبهی پایین رونده روی خط SDA ایجاد کند به این حالت وضعیت شروع یا Start هم گفته میشود که بعدا به آن میپردازیم. پس با عمل بالا مشخص شد که کدام Master قرار است دیتا را بفرستد.
اکنون باید تکلیف Slave را مشخص کنیم که کدام یک میخواهد دیتا را دریافت کند.
پس از اینکه Master کنترل باس را در اختیار گرفت، باید آدرس دستگاه Slaveی که میخواهد به آن دیتا بفرستد را روی خط SDA قرار دهد. توجه شود که هر Slave آدرس منحصر به فردی دارد و با دریافت این آدرس از سمت Master خود را برای ارتباط آماده میکند.
پس تا اینجا مشخص شد که کدام Master قرار است دیتا را بفرستد و کدام Slave قرار است دیتا را دریافت کند.
اکنون باید مشخص کنیم که پس از وضعیت شروع، آدرس چگونه فرستاده میشود و چه اعمال دیگری باید انجام شود تا یک ارتباط کامل صورت گرفته باشد.
فریم آدرس و داده در پروتکل I2C
به تصویر زیر دقت کنید:
شکل بالا یک پیام کامل را نشان میدهد که اکنون قصد داریم به جزئیات این پیام بپردازیم.
در ابتدا توسط Master شرایط شروع را ایجاد میکند و پس از آن آدرس Slave را بر روی خط SDA قرار میدهدکه این آدرس میتواند بین 7 تا 10 بیت متغیر باشد. حال با توجه به اینکه میخواهد روی حافظهی Slave بخواند یا بنویسد یک یت 0 یا 1 به Slave میفرستد.
اکنون نوبت این است که Slave پاسخ بدهد. Slave اگر آدرس و همچنین Read/Write Bit را دریافت کرده باشد خط SDA را پایین میکشد یا 0 منطقی میکند که اصطلاحا به آن ACK میگویند.
پس از مراحل بالا، 8 بیت داده به Slave فرستاده میشود و دوباره یک ACK از سمت Slave خواهیم داشت این عمل با توجه به شکل بالا چون دیتا 16 بیتی است دوبار تکرار میشود.
در نهایت شرایط پایان یا همان Stop از سمت Master ایجاد میشود. شرایط پایان اینگونه است که زمانی که SCL بالا یا در حالت 1 منطقی قرار دارد Master یک لبهی بالا رونده روی خط SDA ایجاد کند.
ما در بالا به صورت کلی و البته مختصر و مفید در رابطه با پروتکل I2C توضیح دادیم و نهایتا یک ارتباط کامل را در این پروتکل بررسی کردیم. اما جزئیات این پروتکل بیشتر از توضیحات بالا حواهد بود که شما برای اشراف بیشتر میتوانید به این لینک در ویکیپدیا و یا این لینک که یک داکیومنت از شرکت NXP میباشد مراجعه کنید.
حال که با کلیات پروتکل I2C آشنا شدیم نوبت راهاندازی سنسور دما MLX90615 است.
راهاندازی سنسور دما MLX90615 با آردوینو
در ابتدا این را بگویم که طبق دیتاشیت سنسور دما MLX90615 کلیات نحوهی انتقال دیتا شبیه به آنچه که در بخش فریم آدرس و داده توضیح دادیم، است. فقط بسته به اینکه قرار باشد دستوری فرستاده شود یا با حافظه RAM یا EEPROM ارتباط برقرار شود کمی میتواند متفاوت باشد که دیگر به توضیح آن نخواهیم پرداخت و خودتان میتوانید به دیتاشیت که پیوست همین مقاله برای دانلود قرار داده شده است مراجعه کنید.
طبق دیتاشیت سنسور باید همانند شکل زیر سیمبندی شود:
معمولا در پروتکل I2C مقاوتهای پولآپِ خطوط SDA و SCL مقدار 4.7K انتخاب میشود و همچنین با توجه به توصیه دیتاشیت یک خازن 0.1UF بین Vdd و زمین قرار میدهیم.
چون ما در این پروژه از آردوینو UNO استفاده میکنیم و پینهای I2C روی A4 و A5 قرار دارد، پس SDA و SCL را به این پینهای آردوینو متصل میکنیم. همچنین تغذیه 3.3 ولتی سنسور را هم میتوانیم از طریق برد آردوینو تامین کنیم.
توجه کنید چون این سنسور گران قیمت است پینهای آن را اشتباهی متصل نکنید. برای اتصال سیمها به سنسور میتوانید از تصویر این سنسور در ابتدای مقاله و همچنین تصویر زیر که نمای زیر سنسور است کمک بگیرید.
ابتدا کتابخانه MLX90615-master که پیوست همین مقاله برای دانلود قرار دارد را از مسیری که در تصویر زیر میبینید، به لیست کتابخانههای آردوینو اضافه کنید.
سپس درون همین کتابخانه یک پوشه به اسم example وجود دارد که کد راهاندازی درون آن قرار دارد و به شرح زیر است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <Wire.h> #include <mlx90615.h> MLX90615 mlx = MLX90615(); void setup() { Serial.begin(9600); Serial.println("Melexis MLX90615 infra-red temperature sensor test"); mlx.begin(); Serial.print("Sensor ID number = "); Serial.println(mlx.get_id(), HEX); } void loop() { Serial.print("Ambient = "); Serial.print(mlx.get_ambient_temp()); Serial.print(" *C\tObject = "); Serial.print(mlx.get_object_temp()); Serial.println(" *C"); Serial.println(); delay(500); } |
در کد بالا درون main برنامه ابتدا سنسور انشیالایز یا حالت شروع به کار میگیرد، سپس ID سنسور خوانده میشود و به روی پورت سریال فرستاده میشود، سپس درون حلقه دو دمای محیط و خود پکیج سنسور دریافت و دوباره به روی پورت سریال فرستاده میشود.
کد بالا را کامپایل و سپس آپلود میکنیم پس از آپلود و راهاندازی سنسور، سریال مانیتور نرمافزار را باز میکنیم.
همانطور که مشاهده میکنید ابتدا ID سنسور و سپس هم دمای محیط و سنسور پشت سرهم خوانده میشود.
حال اگر جسمی را در مجاورت سنسور قرار دهید، دمای محیط مانند زیر تغییر میکند:
ما جزئیات و اطلاعات مربوط به این سنسور را به صورت مختصر و مفید ارائه کردیم و همچنین کتابخانه و کد راهاندازی آن را در اختیار شما گذاشتیم، امیدوارم که شما هم با استفاده از این اطلاعات بتوانید یک نمونه از آن را به صورت پک شده بسازید و در این بحران کرونا برای اندازهگیری دمای بدن استفاده کنید.
اگر در رابطه با خود این مقاله یا ساخت دماسنج کاربردی برای اندازهگیری دمای بدن سوالی داشتید در پایین همین پست کامنت بگذارید.
توجه داشته باشید که مدلهای مشابه این سنسور مانند MLX90614 ،MLX90640 ،MLX90632 نیز با همین شماتیک مداری و همین پروتکلها راهاندازی میشوند، فقط کمی در محدودههای ولتاژ کاری متفاوت هستند.
کتابخانه و دیتاشیت سنسور دما MLX90615 را میتوانید از طریق لینکهای زیر دانلود کنید:
لینکهای دانلود
اسم فایلها
- MLX90615-master.zip
- MLX90615-Datasheet-Melexis.pdf
سلام
با این سنسور مشکل دارم
خیلی خروجی نوسان داره و وقتی سنسور رو به بدن نزدیک و دور میکنم خیلی دما تغییر میکنه مثلا تو فاصله دو سانتی متری حدود 45 درجه و فاصله 20 سانتی متری حدود 27 درجه نشون میده و با نوسان یکی دو درجه همون رو هم نشون میده
پیشنهادتون چیه واسه رفع این مشکل ؟
ممنون میشم راهنمایی کنید
سلام احسان جان. فکر میکنم با استفاده از لنزی که بر روی سنسور قرار میگیره مشکلتون برطرف بشه.
https://www.google.com/imgres?imgurl=https%3A%2F%2Fuser-images.githubusercontent.com%2F5562918%2F52284814-700f5700-2965-11e9-9e39-0e63cbe973e3.png&imgrefurl=https%3A%2F%2Fgithub.com%2Farendst%2FTasmota%2Fissues%2F5108&tbnid=JLWu18lzXj8cLM&vet=12ahUKEwiK_L-bl_nqAhWS0oUKHQvUCQoQMygCegUIARCmAQ..i&docid=bbLMVtNMGx5otM&w=531&h=454&q=MLX90615%20lens&ved=2ahUKEwiK_L-bl_nqAhWS0oUKHQvUCQoQMygCegUIARCmAQ