با عرض سلام خدمت همراهان سایت مایکروالکام. در مطالب قبلی نحوه راه اندازی و استفاده از سنسور دما DS18b20 بصورت تکی و چند تایی با میکروکنترلر AVR مورد بررسی قرار گرفت. در این مطلب نحوه راه اندازی سنسور دمای MAX30205 با میکروکنترلر AVR و کامپایلر کدویژن مورد بررسی قرار خواهد گرفت. پس با من تا انتهای مطلب همراه باشید. همچنین میتونید سایر مطالب من رو از این قسمت مطالعه کنید.
معرفی سنسور دما MAX30205
MAX30205 یک سنسورِ سریع و دقیق، مناسب برای اندازهگیری دمای بدن انسان میباشد. این سنسور، دمای اندازهگیری شده را با استفاده از یک مبدل آنالوگ به دیجیتالِ (ADC) سیگما-دلتا، که تفکیک پذیریِ بسیار بالایی دارد به فرمِ دیجیتال تبدیل میکند. همچنین ارتباط با این سنسور، از طریق پروتکل I2C صورت میگیرد. MAX30205 سه خطِ انتخابِ آدرس دارد که با ترکیبی از دو خط SDA و SCL طبق جدول (Table 1) دیتا شیت مجموعا 32 آدرس را شامل میشود. ولتاژ کاری سنسور، بین 2.7V تا 3.3V بوده و جریان کل مصرفی آن حدود 600uA است.
به دلیل کوچک، دقیق و سریع بودنِ این سنسور و همچنین استفاده از پروتکل I2C و تعداد کم سیمهای مورد نیاز جهت برقراری ارتباط با آن، استفاده از MAX30205 برای پروژههای مربوط به تجهیزات پزشکی بسیار ایده آل میباشد. این قطعه در پکیج TDFN 8-pin موجود بوده و دمای کاریِ آن بین 0 درجه سانتیگراد تا +50 درجه سانتیگراد میباشد. در شکل زیر، نحوه سیم بندی این قطعه نمایش داده شده است.
مزایا و ویژگیهای سنسور دمای MAX30205
1- دقت و سرعت بالای این سنسور و همچنین ولتاژ کاری پایین آن، به طراحان این اجازه را میدهد تا بتوانند در استفاده از منابع مورد نیاز جهت طراحی مدار خود، صرفه جویی کنند.
0.1°C Accuracy (37°C to 39°C)
16Bit (0.00390625°C) Temperature Resolution
2.7V to 3.3V Supply Voltage Range
2- وجود حالتهای One-shot و Shutdown که به کاهش مصرف توان کمک میکند.
3- جریان کل مصرفی 600uA.
4- داشتن توابع دیجیتالی که امکان استفاده از این سنسور در هر سامانهای را به راحتی ممکن میسازد.
هدف آزمایش
در این مطلب قصد داریم با استفاده از میکروکنترلر AVR و استفاده از کامپایلر CodeVision 3.12، سنسور دمای MAX30205 را بدون استفاده از کتابخانه آماده و صرفا از طریق توابع I2C موجود در خود کامپایلر کدویژن و با مطالعه دیتاشیت این قطعه، راه اندازی و مقادیر دما را بر روی یک LCD کاراکتری 2 در 16 نمایش دهیم.
وسایل مورد نیاز
- میکروکنترلر AVR
- LCD کاراکتری 2 در 16
- پناسیومتر 10 کیلواهم جهت تنظیم کنتراست LCD
- ماژول سنسور دمای MAX30205 (CJMCU)
- برد برد
- سیم برد بردی
اتصال ماژول به میکروکنترلر
مانند تصویر زیر، پایه های تغذیه ماژول MAX30205 (CJMCU) را متصل کرده و همچنین پایههای SDA و SCL آن که مربوط به پروتکل I2C میباشد، به پایههای I2C میکروی AVR مورد نظر خود که در این جا برای ما ATMEGA32 میباشد وصل میکنیم. (دقت شود که حداکثر ولتاژ کاری سنسور 3.3 ولت میباشد.)
همچنین پایههای A0 ،A1 و A2 مربوط به آدرس سنسور MAX30205 بوده که در این مدار به GND متصل شده. پایه OS نیز برنامه پذیر بوده و میتوانید این پایه را طوری برنامه ریزی کنید که بر روی دو دمای مورد نظر شما فعال و غیر فعال شود . این پایه میتواند به یک مدار هشدار دهنده یا گرمایشی و یا سرمایشی متصل شده و روی دماهای تعین شده روشن و خاموش شود. در شکل های زیر نمونه هایی از این نوع مدارها آورده شده است.
برنامه نویسی در محیط کدویژن
کدویژن را باز کرده و CodeWizard را اجرا کنید. در قسمت Chip Settings میکروی مورد نظر خود را که در این جا برای ما ATMEGA32 است را انتخاب و سپس فرکانس کاری میکرو را تنظیم کنید. در این مطلب ما فرکانس میکرو را بر روی 8 مگاهرتز قرار داده ایم.
در ادامه، به بخش Alphanumeric LCD رفته و آن را فعال کرده و تنظیمات مربوط به پورت و نحوه اتصال آن به پایههای را انجام دهید.
حال در کد ویزارد، بخش Bit-Banged I2C Bus Interface را انتخاب و تنظیمات I2C را مطابق شکل انجام دهید. (بهتر است نرخ ارسال و دریافت دیتا بر روی 100khz قرار داده شده باشد. همچنین میتوانید پورت و پایههای میکرو را جهت اتصال پایههای SDA و SCL سنسور به میکرو، تغییر دهید.)
تا این جای کار تنظیمات مربوط به ویزارد تمام شده است. به منوی Program رفته و با انتخاب گزینه Generate, Save and Exit پروژه را تولید و ذخیره کنید.
شروع برنامه نویسی در محیط کدویژن
قدم اول پیدا کردن آدرس سنسور MAX30205 با استفاده از دیتاشیت آن است. با توجه به جدول ارائه شده در دیتاشیت سنسور (Table 1)، و از آن جایی که ما هر سه پایه آدرس سنسور (A0، A1 و A2) را به زمین متصل کردیم، بنابراین آدرس قطعه برای نوشتن 0x90 خواهد بود که به آن آدرس Write می گوییم. توجه داشته باشید که بیت صفرم Device Address در قطعاتی که با پروتکل I2C به میکرو متصل میشوند مشخص کننده نوشتن یا خواندن از دیوایس مورد نظر میباشد. اگر این بیت صفر باشد یعنی میخواهیم در قطعه اطلاعاتی را بنویسیم و اگر یک باشد یعنی میخواهیم از قطعه بخوانیم. بنابراین برای Read کردن از سنسور، آدرس مربوطه 0x91 خواهد بود.
حال در ابتدای برنامه خود آدرسهای Read و Write را define میکنیم. ADDR آدرس خواندن و ADDW آدرس نوشتن خواهد بود.
#define ADDR 0x91 // Address to Read from MAX30205 #define ADDW 0x90 // Address to Write from MAX30205
اعمال تنظیمات اولیه و Initialize کردن سنسور MAX30205
با توجه به (Table 2)، ابتدا باید بر اساس فریمِ دیتای مربوط به اعمال تنظیمات، دیوایس را به حالت Config برده و مقدار مناسب را در رجیستر پیکر بندی قطعه قرار دهیم. برای این منظور باید در آدرس 0x01 که Configuration میباشد، مقدار مناسب ، که در جدول 0x00 میباشد را قرار دهیم. یک تابع در برنامه به نام MAX30205_begin ایجاد کرده و موارد گفته شده را مطابق با فریمِ موجود در دیتاشیت، پیاده میکنیم.
void MAX30205_begin(void) { i2c_start(); i2c_write(ADDW); i2c_write(0x01); i2c_write(0x00); i2c_stop(); delay_ms(50); }
نوشتن تابع برای خواندن دما از سنسور MAX30205
حال میخواهیم تابعی جهت خواندن دما از سنسور ایجاد کنیم. با توجه به دیتاشیت و مشاهده فریم مربوط به دریافت دما که در تصویر بالا نیز آورده شده است، مراحل به شرح زیر میباشد. شایان ذکر است این تابع دارای خروجی از نوع float بوده تا بتواند مقادیر اعشاری دما را نیز برگرداند.
- Start کردن I2C.
- نوشتن آدرس Write
- نوشتن آدرس Temperature Mode که 0x00 میباشد.
- Stop کردن I2C.
- Start مجدد I2C.
- نوشتن آدرس خواندن دیتا.
- خواندن بخش Most Significant byte دیتا که مربوط به قسمت صحیح دما میباشد با acknowledge یک.
- خواندن بخش Least Significant byte دیتا که مربوط به قسمت اعشار دما میباشد با acknowledge یک.
- Stop کردن I2C.
float MAX30205_getTemperature(void) { unsigned char readRaw[2] = {0}; int raw; float temperature; readRaw[0]=readRaw[1]=23; i2c_start(); i2c_write(ADDW); delay_ms(5); i2c_write(0x00); i2c_stop(); i2c_start(); i2c_write(ADDR); readRaw[0]=i2c_read(1); readRaw[1]=i2c_read(1); i2c_stop(); raw = (readRaw[0] << 8) | readRaw[1]; temperature = raw * 0.00390625; return temperature; }
تشریح تابع نوشته شده برای خواندن دما
در خط اول یک آرایه با دو خانه به نام readRaw برای خواندن دیتای خام از نوع unsigned char تعریف شده است تا بخش های صحیح و اعشاری دما در این آرایه قرار گیرند. در خط دوم متغیر raw از نوع int تعریف شده است که بعد از کنار هم قرار دادن هر دو دیتای خوانده شده در آرایه readRaw، مقدار دیتای خام در آن ذخیره میگردد. دیتای مربوط به بخش صحیح ابتدا 8 بار به سمت چپ شیف داده شده و با دیتای مربوط به بخش اعشار OR منطقی میشود و در متغیر raw دخیره میگردد.
در نهایت متغیر raw را برای بدست آمدن مقدار صحیح دما در عدد 0.00390625 ضرب کرده و در متغیر temperature که از نوع float تعریف شده است قرار میدهیم. با توجه به این که میخواهیم از توابع sprintf برای چاپ مقادیر float بر روی lcd استفاده کنیم لازم است که از منوی Project و سپس باز کردن بخش Configuration در کدویژن و رفتن به سربرگ C Compiler گزینه sprintf features را بر روی float, width, precision قرار دهیم.
اضافه کردن کتابخانهها و متغیرهای لازم جهت خواندن دما
در ابتدای برنامه کتابخانههای delay و stdio و همچنین متغیرهای temp و s را به برنامه اضافه میکنیم. از متغیر s برای تبدیل مقادیر float به کاراکتر جهت چاپ بر روی LCD استفاده خواهد شد.
#include <delay.h> #include <stdio.h>
float temp; char s[20];
تکمیل حلقه While و نحوه استفاده از توابع نوشته شده
قبل از حلقه while تابع MAX30205_begin را فراخوانی کرده و مانند تصویر زیر کدهای مربوطه جهت خواندن دما و چاپ مقادیر بر روی LCD را نوشته و تکمیل میکنیم.
MAX30205_begin(); while (1) { // Place your code here temp = MAX30205_getTemperature(); sprintf(s,"Temp:%4.2f",temp); lcd_gotoxy(0,0); lcd_puts(s); delay_ms(1000); } }
پروگرام کردن برنامه بر روی میکرو
برنامه را Build کرده و از بخش Chip Programmer در کدویژن، میکرو را پروگرام کنید. دقت شود که فیوزبیتهای میکرو، متناسب با Clock ای که در برنامه تعیین شده است تنظیم گردد که در این جا ما برنامه را بر روی فرکانس 8Mhz تنظیم کرده بودیم بنابراین فیوزبیتهای میکرو را بر روی 8 مگاهرتز داخلی قرار دادهایم.
در تصویر زیر، برنامه بر روی میکرو پروگرام و اجرا شده است:
برای دریافت سورس کد مربوطه و پروگرام کردن میکروکنترلر از این لینک اقدام کنید.
مشاهده نتیجه
نتیجه گیری
در این مطلب مشخصات و راه اندازی سنسور دمای MAX30205 با میکروکنترلر توضیح داده شد. MAX30205 یک سنسور سریع و دقیق، مناسب برای اندازهگیری دمای بدن انسان، به همراه خروجیِ OS و با قابلیت برنامه ریزی میباشد. این سنسور، دمای اندازهگیری شده را با استفاده از یک مبدل آنالوگ به دیجیتال (ADC) سیگما-دلتا که تفکیک پذیری بسیار بالایی دارد به فرم دیجیتال تبدیل میکند. ارتباط با این سنسور، از طریق پروتکل I2C و با دو سیم صورت میگیرد.
امیدوارم از این آموزش کمال بهره را برده باشید. در صورتی که هرگونه نظر یا سوال داشتید درباره این آموزش لطفا اون رو در انتهای همین صفحه در قسمت دیدگاه ها قرار بدید. در کوتاه ترین زمان ممکن به اون ها پاسخ خواهم داد. اگر این مطلب براتون مفید بود، اون رو حتما به اشتراک بگذارید. همینطور میتونید این آموزش را پس از اجرای عملی توی اینستاگرام با هشتگ microelecom# به اشتراک بگذارید و پیج مایکروالکام (microelecom@) رو هم منشن کنید.
سلام
مرسی از سایت خوبتون
من انگشتم روی سنسور که میزارم دمای بدن حدود ۳۳و۳۲ نشون میده مشکل از کجاس؟
جناب فتاحی از پاسخ شما متشکرم.
جناب فتاحی از پاسخ شما سپاسگذارم
سلام
با تشکر از ارایه مطلب بصورت شیوا و روان سوالی داشتم.
float MAX30205_getTemperature(void)
{
unsigned char readRaw[2] = {0};
int raw;
float temperature;
readRaw[0]=readRaw[1]=23; <<—
i2c_start();
i2c_write(ADDW);
در خط چهارم چرا readRaw[0]=readRaw[1]=23; برابر ۲۳ قرار داده شده؟
ممنون از حسن نظر شما. صرفا با یک مقدار دلخواه متغیر را مقدار دهی کردیم که مقدار قبلی دما در هنگام خواندن مجدد تابع از بین برود. شما می توانید این خط را حذف کنید و یا ۲۳ را با صفر جایگزین کنید