با عرض سلام خدمت همراهان سایت مایکروالکام. در مطالب قبلی نحوه راه اندازی سنسور دمای MAX30205 بررسی گردید. در این مطلب نحوه راه اندازی سنسور لوکس متر GY-30 و ساخت دستگاه لوکس متر با میکروکنترلر AVR و کامپایلر کدویژن (CodeVision) مورد بررسی قرار خواهد گرفت. پس با من تا انتهای مطلب همراه باشید. همچنین میتونید سایر مطالب من رو از این قسمت مطالعه کنید.
ماژول لوکس متر GY-30
ماژول لوکس متر GY-30 مجهز به سنسور BH1750 بوده که حساس به شدت نور میباشد. این ماژول دارای دقت و رزولوشن بالایی است و دادههای خروجی آن بر حسب واحد لوکس (lx) میباشد. این سنسور دارای یک مبدل آنالوگ به دیجیتال 16 بیتی بوده و میتواند مقادیر مربوط به شدت روشنایی را به مقادیر دیجیتال، در خروجی تبدیل کند. همچنین پروتکل ارتباطی این ماژول I2C است.
هدف آزمایش
در این مطلب قصد داریم با میکروکنترلر AVR و کامپایلر Codevision ماژول لوکس متر GY-330 را راهاندازی کرده و مقادیر مربوط به شدت روشنایی محیط را با واحد لوکس (lx) بر روی یک LCD کاراکتری 2×16 نمایش دهیم. برای این کار از دیتاشیت قطعه BH1750 که سنسور اصلی ماژول GY-30 میباشد کمک گرفته و با پیکربندی واحد I2C در کدویزارد نرم افزار کدویژن، برنامه را خواهیم نوشت.
وسایل و قطعات مورد نیاز
- ماژول لوکس متر GY-30
- میکروکنترلر AVR (Mega32 یا Mega8 یا …)
- LCD کاراکتری
- دو عدد مقاومت 10k اهم
- برد برد
- سیم برد بردی
اتصال ماژول لوکس متر GY-30 به میکروکنترلر AVR
با توجه به جدول زیر پایههای ماژول را به تغذیه و میکروکنترلر AVR متصل میکنیم:
میکروکنترلر | ماژول |
GND | GND |
بدون اتصال | ADO |
PC1 | SDA |
PC0 | SCL |
5+ ولت | VCC |
* از آن جایی که میخواهیم از I2C نرم افزاری در ایجاد این پروژه استفاده کنیم، میتوانید هر پایه دیگری از میکرو را نیز به غیر از PC1 و PC0 به عنوان پایههای SDA و SCL انتخاب کنید.
* برای عملکرد بهتر I2C، بهتر است پایههای SDA و SCL میکرو را بر روی برد برد با یک مقاومت 10k اهم Pull Up کنید.
اعمال تنظیمات در محیط Codewizard در کدویژن
وارد محیط کدویژن شده و CodeWizard را اجرا کنید.
در کدویزارد و از قسمت Chip میکروی مورد نظر خود و Clock میکرو را انتخاب کنید.
به بخش Alphanumeric LCD رفته و تنظیمات مربوط به LCD را انجام دهید. در این جا ما LCD را بر روی PORTA تنظیم کردهایم.
در آخر نوبت به تنظیمات مربوط به واحد I2C در ویزارد میرسد. به بخش Bit-Banged I2C Bus Interface رفته و پورت و پایههای مربوط به I2C را تنظیم کنید.
از منوی Program برنامه را Generate و Save کنید.
شروع کدنویسی در محیط کدویژن (Codevision)
مطالعه دیتاشیت BH1750 و استخراج دستورات
برای کدنویسی ابتدا لازم است تا دیتایشت قطعه BH1750 را مطالعه کرده و تنظیمات مربوط به ماژول و آدرسهای مربوطه را از داخل آن استخراج کنیم.
جدول زیر کدهای مربوط به دستورات مختلفی را که میتوانیم به ماژول ارسال کنیم را نشان میدهد:
یکی از این دستورات، حالت Continuously H-Resolution میباشد که ماژول لوکس متر GY-30 را بر روی محاسبه شدت روشنایی محیط با دقت 1 لوکس تنظیم میکند. در این حالت مدت زمانی که طول میکشد تا اندازهگیری انجام گیرد 120 میلی ثانیه میباشد.
در داخل دیتاشیت نحوه ارسال این دستور و خواندن دیتا از سنسور نشان داده شده است:
با توجه به مثال داخل دیتاشیت، آدرس نوشتن در ماژول لوکس متر 01000110 (0x46) و آدرس خواندن از آن، 01000111 (0x47) میباشد. همچنین کدِ دستور حالتِ Continuously H-Resolution مقدار 00010000 (0x10) است.
خواندن مقادیر از ماژول GY-30
روند کلی خواندن مقادیر مربوط به شدت روشنایی با ماژول GY-30 به شرح زیر میباشد:
ابتدا دستور Start را از طریق I2C ارسال میکنیم. سپس آدرس نوشتن در ماژول که 0x46 میباشد را Write کرده و دستور مدنظر، که در اینجا حالت Continuously H-Resolution میباشد را با Write کردنِ 0x10 به ماژول ارسال میکنیم.
بعد از ارسال دستورِ خواندن، طبق دیتاشیت نیاز است تا 180 میلی ثانیه صبر کنیم تا اندازهگیری شدت نور توسط ماژول انجام شده و دیتا آماده خواندن شود.
برای خواندن مقدار روشنایی، آدرس خواندن از ماژول را که 0x47 میباشد در آن Write میکنیم. ابتدا بخش پر ارزش دیتا توسط ماژول به میکرو با ACK یک ارسال میشود و در آخر بخش کم ارزش دیتا با ACK صفر دریافت میگردد.
شروع کدنویسی
مانند تصویر زیر، در برنامه آدرسهای نوشتن و خواندن را Define کرده و کتابخانههای delay.h و stdio.h را به برنامه اضافه میکنیم.
#include <delay.h> #include <stdio.h> #define ADDW 0x46 #define ADDR 0x47
متغیرهای s از نوع char و luxmeter از نوع float را جهت چاپ مقدار روشنایی در برنامه تعریف میکنیم.
همچنین یک تابع به نام readLux جهت خواندن میزان روشنایی ایجاد خواهیم کرد.
بدنه کامل تابع readLux در زیر آورده شده است:
char s[30]; float luxmeter; float readLux (void) { unsigned int luxh,luxl; int mylux; float lux; i2c_start(); i2c_write(ADDW); i2c_write(0x10); delay_ms(180); i2c_stop(); i2c_start(); i2c_write(ADDR); luxh=i2c_read(1); luxl=i2c_read(0); i2c_stop(); mylux=(luxh<<8)|luxl; lux = mylux/1.2; return lux; }
تشریح تابع نوشته شده readLux
از آنجایی که دیتای دریافتی از ماژول دو بایت میباشد، بایت اول را در متغیر luxh و بایت دوم را در luxl قرار دادهایم. در نهایت luxh را 8 بار به سمت چپ شیف داده و آن را با OR ،luxl بیتی کرده و در متغیر myLux قرار دادهایم تا دیتای دریافتی درون یک متغیر، یکپارچه شده و 16 بیتی گردد.
با توجه به مثال آورده شده در دیتاشیت، لازم است برای تبدیل عدد دریافتی به واحد lux، عدد به دست آمده بر 1.2 تقسیم شود.
تا این جای کار، نوشتن تابع جهت خواندن مقدار روشنایی انجام شده است.
تکمیل حلقه while
مانند تصویر زیر، حلقه while را تکمیل میکنیم. در برنامه نوشته شده، از طریق تابع readLux مقدار روشنایی از ماژول خوانده شده و به میکرو ارسال میگردد.
سپس با دستور sprintf از کتابخانه stdio، این مقادیر را به رشته تبدیل کرده و بر روی LCD چاپ میکنیم.
while (1) { luxmeter = readLux(); sprintf(s,"Lux:%6.2f(lx)",luxmeter); lcd_gotoxy(0,0); lcd_putsf(" "); lcd_gotoxy(0,0); lcd_puts(s); delay_ms(200); }
* دقت شود، از آن جایی که از sprintf جهت تبدیل مقادیر float به رشته استفاده شده است، حتما از قسمت Configure project در کدویژن، قابلیت float برای sprintf فعال گردد.
بعد از باز کردن بخش Configure Project، به سربرگ C Compiler رفته و sprint Features را بر روی float, width , precision قرار داده و بر روی OK کلیک کنید.
برنامه را کامپایل کرده و بر روی میکرو پروگرام و اجرا میکنیم.
همچنین عزیزان میتوانند سورس کامل نوشته شده برای این مطلب و دیتاشیت قطعه BH1750 را از این لینک دانلود نمایند.
نحوه عملکرد
نحوه عملکرد این آموزش را در ویدیو زیر مشاهده مینمایید.
نتیجه گیری
ماژول لوکس متر GY-30 مجهز به سنسور BH1750 بوده که حساس به شدت نور میباشد. این ماژول دارای دقت و رزولوشن بالایی است و دادههای خروجی آن بر حسب واحد لوکس (lx) میباشد. با استفاده از میکروکنترلر AVR و کامپایلر کدویژن Codevision و با مطالعه دیتاشیت BH1750، این سنسور را راهاندازی کرده و مقدار روشنایی محیط را بر حسب واحد لوکس بر روی LCD کاراکتری نمایش دادیم.
امیدوارم از این آموزش کمال بهره را برده باشید. در صورت داشتن هرگونه نظر یا سوال درباره این آموزش اون رو در انتهای همین صفحه در قسمت دیدگاه ها قرار بدید. در کوتاه ترین زمان ممکن به اون ها پاسخ خواهم داد. اگر این مطلب براتون مفید بود، اون رو حتما به اشتراک بگذارید. همینطور میتونید این آموزش را پس از اجرای عملی توی اینستاگرام با هشتگ microelecom# به اشتراک بگذارید و پیج مایکروالکام (microelecom@) رو هم منشن کنید.
عالی بود. ممنون از به اشتراک گذاشتن