راه اندازی ماژول GY-30 و ساخت لوکس متر با AVR کدویژن

راه انداز سنسور لوکس متر GY-30 و ساخت لوکس متر با AVR و کدویژن
نوشته شده توسط

با عرض سلام خدمت همراهان سایت مایکروالکام. در مطالب قبلی نحوه راه اندازی سنسور دمای MAX30205 بررسی گردید. در این مطلب نحوه راه اندازی سنسور لوکس متر GY-30 و ساخت دستگاه لوکس متر با میکروکنترلر AVR و کامپایلر کدویژن (CodeVision) مورد بررسی قرار خواهد گرفت. پس با من تا انتهای مطلب همراه باشید. همچنین میتونید سایر مطالب من رو از این قسمت مطالعه کنید.


ماژول لوکس متر GY-30

ماژول لوکس متر GY-30 مجهز به سنسور BH1750 بوده که حساس به شدت نور می‌باشد. این ماژول دارای دقت و رزولوشن بالایی است و داده‌های خروجی آن بر حسب واحد لوکس (lx) می‌باشد. این سنسور دارای یک مبدل آنالوگ به دیجیتال 16 بیتی بوده و می‌تواند مقادیر مربوط به شدت روشنایی را به مقادیر دیجیتال، در خروجی تبدیل کند. همچنین پروتکل ارتباطی این ماژول I2C است.

 

ماژول لوکس متر GY30
ماژول لوکس متر GY30

هدف آزمایش

در این مطلب قصد داریم با میکروکنترلر AVR و کامپایلر Codevision ماژول لوکس متر GY-330 را راه‌اندازی کرده و مقادیر مربوط به شدت روشنایی محیط را با واحد لوکس (lx) بر روی یک LCD کاراکتری 2×16 نمایش دهیم. برای این کار از دیتاشیت قطعه BH1750 که سنسور اصلی ماژول GY-30  می‌باشد کمک گرفته و با پیکربندی واحد I2C در کدویزارد نرم افزار کدویژن، برنامه را خواهیم نوشت.


وسایل و قطعات مورد نیاز


اتصال ماژول لوکس متر GY-30 به میکروکنترلر AVR

با توجه به جدول زیر پایه‌های ماژول را به تغذیه و میکروکنترلر AVR متصل می‌کنیم:

 

اتصال پایه‌های ماژول لوکس متر به میکرو
اتصال پایه‌های ماژول لوکس متر به میکرو
میکروکنترلر ماژول
GND GND
بدون اتصال ADO
PC1 SDA
PC0 SCL
5+ ولت VCC

* از آن جایی که می‌خواهیم از I2C نرم افزاری در ایجاد این پروژه استفاده کنیم، می‌توانید هر پایه دیگری از میکرو را نیز به غیر از PC1 و PC0 به عنوان پایه‌های SDA و SCL انتخاب کنید.

* برای عملکرد بهتر I2C، بهتر است پایه‌های SDA و SCL میکرو را بر روی برد برد با یک مقاومت 10k اهم Pull Up کنید.

pull up کردن پایه‌های SDA و SCL میکرو
pull up کردن پایه‌های SDA و SCL میکرو

اعمال تنظیمات در محیط Codewizard در کدویژن

وارد محیط کدویژن شده و CodeWizard را اجرا کنید.

اعمال تنظیمات در Codewizard
اعمال تنظیمات در Codewizard

در کدویزارد و از قسمت Chip میکروی مورد نظر خود و Clock میکرو را انتخاب کنید.

اعمال تنظیمات در محیط Codewizard
اعمال تنظیمات در محیط Codewizard

به بخش Alphanumeric LCD رفته و تنظیمات مربوط به LCD را انجام دهید. در این جا ما LCD را بر روی PORTA تنظیم کرده‌ایم.

تنظیمات مربوط به LCD کاراکتری در Codewizard کدویژن
تنظیمات مربوط به LCD کاراکتری در Codewizard کدویژن

در آخر نوبت به تنظیمات مربوط به واحد I2C در ویزارد می‌رسد. به بخش Bit-Banged I2C Bus Interface رفته و پورت و پایه‌های مربوط به I2C را تنظیم کنید.

اعمال تنظیمات I2C در Codewizard
اعمال تنظیمات I2C در Codewizard

از منوی Program برنامه را Generate و Save کنید.

ذخیره سازی تنظیمات و تولید کد در Codewizard
ذخیره سازی تنظیمات و تولید کد در Codewizard

شروع کدنویسی در محیط کدویژن (Codevision)

مطالعه دیتاشیت BH1750 و استخراج دستورات

برای کدنویسی ابتدا لازم است تا دیتایشت قطعه BH1750 را مطالعه کرده و تنظیمات مربوط به ماژول و آدرس‌های مربوطه را از داخل آن استخراج کنیم.

جدول زیر کد‌های مربوط به دستورات مختلفی را که می‌توانیم به ماژول ارسال کنیم را نشان می‌دهد:

جدول دستورات BH1750
جدول دستورات BH1750

یکی از این دستورات، حالت Continuously H-Resolution می‌باشد که ماژول لوکس متر GY-30 را بر روی محاسبه شدت روشنایی محیط با دقت 1 لوکس تنظیم می‌کند. در این حالت مدت زمانی که طول می‌کشد تا اندازه‌گیری انجام گیرد 120 میلی ثانیه می‌باشد.

در داخل دیتاشیت نحوه ارسال این دستور و خواندن دیتا از سنسور نشان داده شده است:

مثال مربوط به نحوه خواندن مقدار شدت روشنایی از سنسور BH1750
مثال مربوط به نحوه خواندن مقدار شدت روشنایی از سنسور BH1750

با توجه به مثال داخل دیتاشیت، آدرس نوشتن در ماژول لوکس متر 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 را به برنامه اضافه می‌کنیم.

اضافه کردن کتابخانه‌ها و آدرس‌های I2C ماژول به برنامه
اضافه کردن کتابخانه‌ها و آدرس‌های I2C ماژول به برنامه
#include <delay.h>
#include <stdio.h>

#define ADDW 0x46
#define ADDR 0x47

متغیر‌های s از نوع char و luxmeter از نوع float را جهت چاپ مقدار روشنایی در برنامه تعریف می‌کنیم.

همچنین یک تابع به نام readLux جهت خواندن میزان روشنایی ایجاد خواهیم کرد.

ایجاد تابع readLux جهت خواندن شدت روشنایی از سنسور
ایجاد تابع 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 تقسیم شود.

نحوه به دست آوردن میزان روشنایی به واحد لوکس (lx)
نحوه به دست آوردن میزان روشنایی به واحد لوکس (lx)

تا این جای کار، نوشتن تابع جهت خواندن مقدار روشنایی انجام شده است.

تکمیل حلقه while

مانند تصویر زیر، حلقه while را تکمیل می‌کنیم. در برنامه نوشته شده، از طریق تابع readLux مقدار روشنایی از ماژول خوانده شده و به میکرو ارسال می‌گردد.

سپس با دستور sprintf از کتابخانه stdio، این مقادیر را به رشته تبدیل کرده و بر روی LCD چاپ می‌کنیم.

تکمیل برنامه در حلقه while
تکمیل برنامه در حلقه while
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 فعال گردد.

تنظیم قابلبت float در sprintf
تنظیم قابلبت float در sprintf

بعد از باز کردن بخش Configure Project، به سربرگ C Compiler رفته و sprint Features را بر روی float, width , precision قرار داده و بر روی OK کلیک کنید.

تنظیم قابلیت float در sprintf
تنظیم قابلیت float در sprintf

برنامه را کامپایل کرده و بر روی میکرو پروگرام و اجرا می‌کنیم.

نمایش مقدار روشنایی بر روی LCD کاراکتری با واحد لوکس
نمایش مقدار روشنایی بر روی LCD کاراکتری با واحد لوکس

همچنین عزیزان می‌توانند سورس کامل نوشته شده برای این مطلب و دیتاشیت قطعه BH1750 را از این لینک دانلود نمایند.


نحوه عملکرد

نحوه عملکرد این آموزش را در ویدیو زیر مشاهده می‌نمایید.


نتیجه گیری

ماژول لوکس متر GY-30 مجهز به سنسور BH1750 بوده که حساس به شدت نور می‌باشد. این ماژول دارای دقت و رزولوشن بالایی است و داده‌های خروجی آن بر حسب واحد لوکس (lx) می‌باشد. با استفاده از میکروکنترلر AVR و کامپایلر کدویژن Codevision و با مطالعه دیتاشیت BH1750، این سنسور را راه‌اندازی کرده و مقدار روشنایی محیط را بر حسب واحد لوکس بر روی LCD کاراکتری نمایش دادیم.

امیدوارم از این آموزش کمال بهره را برده باشید. در صورت داشتن هرگونه نظر یا سوال درباره این آموزش اون رو در انتهای همین صفحه در قسمت دیدگاه ها قرار بدید. در کوتاه ترین زمان ممکن به اون ها پاسخ خواهم داد. اگر این مطلب براتون مفید بود، اون رو حتما به اشتراک بگذارید. همینطور میتونید این آموزش را پس از اجرای عملی توی اینستاگرام با هشتگ microelecom# به اشتراک بگذارید و پیج مایکروالکام (microelecom@) رو هم منشن کنید.

یک دیدگاه برای “راه اندازی ماژول GY-30 و ساخت لوکس متر با AVR کدویژن

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

نشانی ایمیل شما منتشر نخواهد شد.