BH1750 یک نوع سنسور سنجش شدت نور 16 بیتی است. در این مقالۀ آموزشی، بهتون نشون میدیم که چجوری میشه از این سنسور در بورد Arduino استفاده کرد. این سنسور با استفاده از پروتکل ارتباطی 12C با میکروکنترلر ارتباط برقرار میکنه. در این مقاله، نحوۀ سیمکشی سنسور به بورد Arduino، نصب کتابخانههای مورد نیاز و استفاده از یک sketch ساده برای نمایش مقادیر سنسور در سریال مانیتور رو یاد با هم مرور میکنیم.
معرفی سنسور سنجش شدت نور 16 بیتی BH1750
BH1750 یک نوع سنسور سنجش شدت نور 16 بیتی است که با استفاده از پروتکل ارتباطی 12C ارتباط برقرار میکنه. این سنسور میزان شدت نور رو بر حسب lux (یکی از واحدهای اندازهگیری روشناییِ SI ) خروجی میده. حداقل و حداکثر شدت نوری که این سنسور میتونه اندازهگیری کنه به ترتیب 1 و 65535 lux است.
این سنسور ممکنه در بوردهایی با اشکال مختلف عرضه بشه (تصویر زیر). هر دو تصویر زیر سنسور BH1750 رو نشون میدن.
مشخصات فنی BH1750
در ادامه، فهرستی از مشخصات فنی سنسور BH1750 تهیه کردیم. برای کسب اطلاعات بیشتر دیتاشیت سنسور Bh1750 رو بررسی کنین.
-
رابط 12C bus
-
کیفیت طیفی اون تقریبا با چشم انسان برابری میکنه
-
مبدل شدت روشنایی به دیجیتال
-
رنج اندازهگیری اون 1 تا 65535 lux است
-
جریان پایین به کمک تابع PowerDown
-
تابع حذف نویز نوری 50Hz/60Hz
-
میشه دو تا 12C slave-address مختلف انتخاب کرد
-
واریانس کم در اندازهگیری (+/-20%)
-
تأثیر مادون قرمز خیلی کمه
-
پشتیبانی از حالت اندازهگیری پیوسته
-
پشتیبانی از حالت اندازهگیری یکباره
حالتهای اندازهگیری
این سنسور از دو حالت مختلف اندازهگیری پشتیبانی میکنه: حالت پیوسته و یکباره. هر کدوم از این حالتها از سه حالت رزلوشن مختلف پشتیبانی میکنن.
حالت پیوسته : سنسور به طور مداوم مقادیر نور محیط رو اندازهگیری میکنه.
حالت یکباره : سنسور فقط یکبار مقدار نور محیط اندازهگیری میکنه و بعد خاموش میشه.
برخی از مهمترین کاربرد های سنسور BH1750
BH1750 یک نوع سنسور سنجش شدت نور است و به همین دلیل میشه در پروژههای زیادی ازش استفاده کرد. برای مثال:
-
برای تشخیص روز و شب
-
برای خاموش/ روشن کردن یا تنظیم نور LED بر طبق نور محیط
-
برای تنظیم میزان روشنایی LCD و صفحههای نمایش
-
برای تشخیص روشن بودن LED
-
و …
کارکرد پینهای BH1750 بشناسید
پینهای BH1750 به شرح زیر است:
از پین ADD برای انتخاب آدرس سنسور I2C استفاده میشه. اگر ولتاژ این پین کمتر از 0.7VCC باشه (پین شناور میمونه یا به GND وصل میشه) آدرس I2C برابر با 0x23 خواهد بود. اما اگر ولتاژ بالاتر از 0.7xVCC باشه (پین به VCC وصل میشه) آدرس 0x5C خواهد بود. به طور خلاصه:
-
پین ADD اگر شناور باشه یا به GND وصل باشه، آدرس برابر با 0x23 است.
-
پین ADD اگر به VCC وصل باشه، آدرس برابر با 0x5C خواهد بود.
فایل ورد برای این متن بالا چک بشه تا تغییرات رنگی اعمال بشه .
رابط I2C سنسور BH1750
سنسور BH1750 از رابط I2C پشتیبانی میکنه. شما میتونین سنسور BH1750 رو با استفاده از پینهای پیشفرض I2C به بورد Arduino وصل کنین ( این پینها برای Arduino UNO هستن، اگر از مدل دیگهای استفاده میکنین، یه نگاهی به پینهای I2C بندازین)
حالا که با سنسور BH1750 آشنا شدین میتونیم ازش استفاده کنین. در این بخش، قصد داریم یک پروژه ساده بسازیم که نور محیط رو بخونه و اون رو در سریال مانیتور Arduino IDE نشون بده.
قطعات مورد نیاز
لیست قطعات مورد نیاز
-
سنسور BH1750
-
Arduino UNO (کلیک کنید)
-
برد بورد (اختیاری)
-
سیمهای جامپر (اختیاری)
طرح کلی اتصال BH1750 به Arduino
سنسور Bh1750 رو به پینهای Arduino I2C سیمکشی کنین. برای انجام این کار میتونین طبق طرح زیر عمل کنین.
از جدول زیر هم میتونین کمک بگیرین.
وصل نکردن پین ADD به این معنیه که آدرس 0x23 رو انتخاب کردیم. برای انتخاب آدرس 0x5C باید اون رو به 3.3V وصل کنین.
نصب کتابخانۀ BH1750
چندین کتابخانه برای خواندن اطلاعات از سنسور BH1750 وجود داره. ما از کتابخانۀ BH1750 استفاده میکنیم که کریستوفر لاز تهیه کرده. این کتابخانه با ESP3 ،ESP8266 و Arduino سازگاره. Arduino IDE رو باز کنین و به Sketch > Include Library > Manage Libraries برید. Library Manager باید باز بشه. سپس در نوار جستوجو BH1750 رو سرچ کنین و کتابخانۀ BH1750 از Christopher Laws رو نصب کنین.
BH1750 کد مربوط به خواندن اطلاعات سنسور
کد زیر رو در Arduino IDE کپی کنین. این کد اطلاعات مربوط به نور محیط رو بر حسب lux جمعآوری میکنه و مقادیرش رو در سریال مانیتور نشون میده. این یک نمونه کد از کتابخانۀ BH1750test است (برای دسترسی به این مقاله به File > Examples > BH1750 > BH1750test برید).
Example of BH1750 library usage. This example initialises the BH1750 object using the default high resolution continuous mode and then makes a light level reading every second. */ #include <Wire.h> #include <BH1750.h> BH1750 lightMeter; void setup(){ Serial.begin(9600); // Initialize the I2C bus (BH1750 library doesn't do this automatically) Wire.begin(); // On esp8266 you can select SCL and SDA pins using Wire.begin(D4, D3); // For Wemos / Lolin D1 Mini Pro and the Ambient Light shield use Wire.begin(D2, D1); lightMeter.begin(); Serial.println(F("BH1750 Test begin")); } void loop() { float lux = lightMeter.readLightLevel(); Serial.print("Light: "); Serial.print(lux); Serial.println(" lx"); delay(1000); }
کارکرد کد
کارمون رو با اضافه کردن کتابخونهها شروع میکنیم. کتابخانۀ Wire.h برای استفاده از پروتکل ارتباطی I2C و کتابخانه BH1750.h برای خواندن اطلاعات سنسور.
#include <Wire.h> #include <BH1750.h>
حالا یک شی BH1750 به نام lightMeter ایجاد میکنیم.
BH1750 lightMeter;
در ()setup، سریال مانیتور رو در baud rate 9600 مقداردهی میکنیم.
Serial.begin(9600);
حالا پروتکل ارتباطی I2C رو مقداردهی میکنیم. در نتیجه ارتباط I2C روی پینهای پیشفرض I2C میکروکنترلر آغاز میشه. اگر میخواهید از پینهای مختلف I2C استفاده کنین، اونا رو مثل Wire.begin(SDA, SCL) به متد ()begin منتقل کنین.
Wire.begin();
با استفاده از متد ()begin در شی BH1750 (lightMeter) سنسور رو مقداردهی کنین.
lightMeter.begin();
در ()loop ، یک متغیر به نام lux ایجاد میکنیم که مقادیر روشنایی رو ذخیره میکنه. برای دریافت مقدار کافیه تابع ()readLightLevel در شی BH1750(lightMeter) رو فراخوان کنین.
float lux = lightMeter.readLightLevel();
در آخر باید اطلاعات رو در سریال مانیتور نشون بدیم.
Serial.print("Light: "); Serial.print(lux); Serial.println(" lx");
در حالت فعلی میتونین هر ثانیه یک reading جدید دریافت و پرینت کنین.
delay(1000);
حالا میتونین کد رو در بورد بارگذاری کنین. در مرحلۀ اول، بورد رو به کامپیوترتون وصل کنین. بعد به Tools > Board برید و بورد Arduino رو انتخاب کنین. حالا به Tools > Port برید و پورت COM که بوردتون بهش وصله رو انتخاب کنین. و در آخر کلید upload رو بزنین.
بعد از بارگذاری کد، سریال مانیتور رو با baud rate 9600 باز کنین.
پس از انجام همه این مراحل، اطلاعات مربوط به روشنایی باید در سریال مانیتور پرینت بشن.
سایر کارکردهای سودمند
کتابخونهای که به همراه سنسور BH1750 استفاده کردیم شامل نمونههای دیگهای هم هست که مشخصات و کارکردهای سودمند دیگهای داره. این نمونهها رو از این لینک میتونین چک کنین.
راهاندازی حالت اندازهگیری
کتابخونه به طور پیشفرض از حالت اندازهگیری پیوسته رزولوشن بالا استفاده میکنه، اما با انتقال حالت اندازهگیری مورد نظرتون به متد ()begin در هنگام مقداردهی سنسور میتونین اون رو تغییر بدین. برای مثال:
lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE)
برخی از حالتهای موجود عبارتند از:
- BH1750_CONTINUOUS_LOW_RES_MODE
- BH1750_CONTINUOUS_HIGH_RES_MODE(default)
- BH1750_CONTINUOUS_HIGH_RES_MODE_2
- BH1750_ONE_TIME_LOW_RES_MODE
- BH1750_ONE_TIME_HIGH_RES_MODE
- BH1750_ONE_TIME_HIGH_RES_MODE_2
جمعبندی
در این مقالۀ آموزشی، نحوۀ استفاده از سنسور BH1750 به همراه Arduino Uno رو یاد گرفتین. استفاده از این سنسور خیلی آسونه. این سنسور از پروتکل ارتباطی I2C استفاده میکنه که باعث میشه سیمکشی به راحتی انجام بشه و کتابخانه هم متدهایی داره که با استفاده از اونا به راحتی میشه اطلاعات رو دریافت کرد.