هدف این پروژه چیست؟
هدف این پروژه، BU27006MUCZ سنسور نور محیط را با یک Arduino برای اندازهگیری و پایش شدت نور در محیطهای مختلف، واسط کردن است. این سنسور، با ارائهی قرائتهای دقیق در واحد lux، آن را برای کاربردهایی مانند کنترل خودکار روشنایی، تنظیم روشنایی صفحهنمایش و پایش محیطی مناسب میسازد. کاربران میتوانند با خواندن دادههای شدت نور بهصورت real-time، سیستمهایی طراحی کنند که در محیطهای هوشمند، با بهرهوری انرژی بالا و قابلیت استفادهی بهتر، به شرایط نوری متغیر پاسخ میدهند.
در این آموزش چه چیزهایی خواهیم آموخت؟
پیادهسازی پروژههای مبتنی بر سنسور برای کنترل خودکار روشنایی و پایش محیطی، و ارتقاء مهارت در ساخت سیستمهایی که بر اساس شدت نور واکنش نشان میدهند.
اتصال BU27006 سنسور نور محیط به Arduino و برقراری ارتباط از طریق I2C.
استفاده از یک library موجود برای سازگاری BU27006 با Arduino و کسب دانش در مورد پردازش دادهها از طریق I2C.
اندازهگیری سطح نور محیط با استفاده از سنسور به واحد lux و تفسیر دادهها برای کاربردهای عملی.
برای شروع این پروژه به چه چیزهایی نیاز داریم؟
برای اجرای این پروژه به سختافزار و نرمافزار نیاز داریم. عناوین این سختافزارها و نرمافزارها در جدول زیر به شما ارائه شده است و میتوانید با کلیک بر روی هر یک، آن را تهیه/دانلود کرده و برای شروع آماده شوید.
سخت افزارهای مورد نیاز | نرمافزارهای مورد نیاز |
---|---|
Arduino Programmer | Arduino IDE |
Arduino Development Board- ( Arduino UNO ) | |
ماژول تشخیص رنگ دیجیتال Gebra BU27006MUC |
GebraMS برای راحتی شما، کتابخانههای ویژهای را برای اکثر پروژههای آردوینو آماده کرده است.
شما باید کتابخانه آماده شده توسط GebraMS را دانلود کرده و آن را به Arduino IDE خود اضافه کنید.
ابتدا، همانطور که در تصویر زیر دیده میشود، ماژول Gebra BU27006MUCZ را به Arduino UNO به این صورت متصل میکنیم:
سورس کد
کتابخانه پروژه (Library)
جبرابیت علاوه بر طراحی ماژولار انواع حسگرها و قطعات مجتمع، برای سهولت در نصب و توسعه نرمافزار توسط کاربران، مجموعهای از کتابخانههای ساختاریافته و مستقل از سختافزار را به زبان C ارائه میدهد. در این راستا، کاربران میتوانند کتابخانهی مربوط به ماژول مورد نظر خود را در قالب فایلهای “.h” و “.c” دانلود کنند.
با افزودن کتابخانهی ارائهشده توسط جبرابیت به پروژه (راهنمای افزودن فایل به پروژه)، میتوانیم بهراحتی کد خود را توسعه دهیم. فایلهای مربوطه را میتوانید در انتهای پروژه یا در بخش صفحات مرتبط در سمت راست مشاهده کنید.
تمام توابع تعریفشده در کتابخانه با جزئیات کامل توضیح داده شدهاند و کلیه پارامترهای ورودی و مقادیر بازگشتی هر تابع بهصورت مختصر شرح داده شده است. از آنجا که این کتابخانهها مستقل از سختافزار هستند، کاربر میتواند آنها را بهسادگی به کامپایلر دلخواه خود اضافه کرده و با میکروکنترلر یا برد توسعه مورد نظر خود استفاده کند.
USER REGISTER MAP
نقشه رجیستر یا دستورات سنسور در این بخش تعریف شدهاند:
/************************************************
* USER REGISTER MAP *
***********************************************/
#define BU27006MUCZ_SYSTEM_CONTROL 0x40
#define BU27006MUCZ_MODE_CONTROL1 0x41
#define BU27006MUCZ_MODE_CONTROL2 0x42
#define BU27006MUCZ_MODE_CONTROL3 0x43
#define BU27006MUCZ_RED_DATA 0x50 // 2 byte
#define BU27006MUCZ_GREEN_DATA 0x52 // 2 byte
#define BU27006MUCZ_BLUE_DATA 0x54 // 2 byte
#define BU27006MUCZ_IR_DATA 0x56 // 2 byte
#define BU27006MUCZ_FLICKER_DATA 0x58 // 2 byte
#define BU27006MUCZ_FLICKER_COUNTER 0x5A
#define BU27006MUCZ_FIFO_LEVEL 0x5B
#define BU27006MUCZ_FIFO_DATA 0x5C // 2 byte
#define BU27006MUCZ_MANUFACTURER_ID 0x92
#define BU27006MUCZ_ADDRESS 0x38
/*----------------------------------------------*
* USER REGISTER MAP End *
*----------------------------------------------*/
BU27006MUCZ _Ability Enum
این enum برای فعالسازی و غیرفعالسازی بخشهای مختلف سنسور استفاده میشود:
typedef enum Ability
{
Disable = 0 ,
Enable
}BU27006MUCZ_Ability;
BU27006MUCZ _Reset_Status Enum
با استفاده از این enum، وضعیت ریست سنسور تعیین میشود:
typedef enum
{
FAILED = 0 ,
DONE
}BU27006MUCZ_Reset_Status;
BU27006MUCZ_ RGB_Gain Enum
مقادیر این enum برای تنظیم تقویتکننده RGB سنسور استفاده میشوند:
typedef enum RGB_Gain
{
RGB_GAIN_1X = 0,
RGB_GAIN_4X = 1,
RGB_GAIN_32X = 2,
RGB_GAIN_128X = 3,
} BU27006MUCZ_RGB_Gain;
BU27006MUCZ_FLC_Gain Enum
مقادیر این enum برای تنظیم FLC gain سنسور استفاده میشوند:
typedef enum FLC_Gain
{
FLC_GAIN_1X = 0,
FLC_GAIN_2X = 1,
FLC_GAIN_4X = 2,
FLC_GAIN_8X = 3,
FLC_GAIN_16X = 4,
FLC_GAIN_32X = 5
} BU27006MUCZ_FLC_Gain;
BU27006MUCZ_Interrupt_Channel Enum
برای تنظیم منبع وقفه در سنسور، از مقادیر این enum استفاده میشود:
typedef enum Interrupt_Channel
{
CLEAR_CHANNEL = 0 ,
ALS_CHANNEL
}BU27006MUCZ_Interrupt_Channel;
BU27006MUCZ_Interrupt_Mode Enum
با استفاده از این enum، نوع وقفه سنسور انتخاب میشود:
typedef enum Interrupt_Mode
{
INTERRUPT_DISABLE ,
RGB_IR_COMPELETION ,
FLICKER_COMPELETION,
FIFO_64_DATA_READY
} BU27006MUCZ_Interrupt_Mode;
BU27006MUCZ_RGB_Measurement_Mode Enum
برای مشخص کردن حالت اندازهگیری RGB سنسور، از مقادیر این enum استفاده میشود:
typedef enum RGB_Measurement_Mode
{
_55_mS_MODE = 1,
_100_mS_MODE = 2
} BU27006MUCZ_RGB_Measurement_Mode;
BU27006MUCZ_FLC_Measurement_Mode Enum
مقادیر این enum برای مشخص کردن حالت اندازهگیری FLC سنسور استفاده میشوند:
typedef enum FLC_Measurement_Mode
{
_1_KHZ_MODE,
_2_KHZ_MODE
} BU27006MUCZ_FLC_Measurement_Mode;
BU27006MUCZ_Data_Status Enum
مقادیر این enum تعیین میکنند که دادههای خوانده شده بهروزرسانی شوند یا خیر:
typedef enum Data_Status
{
NOT_UPDATED = 0 ,
UPDATED
}BU27006MUCZ_Data_Status;
BU27006MUCZ_Interrupt_Status Enum
مقادیر این Enum برای اطلاع از اینکه وقفه در سنسور انجام شده است یا خیر استفاده میشوند.
typedef enum Interrupt_Status
{
INTERRUPT_NOT_FULFILLED = 0 ,
INTERRUPT_FULFILLED
}BU27006MUCZ_Interrupt_Status;
BU27006MUCZ struct
تمام خصوصیات سنسور، ضرایب کالیبراسیون و دادههای سنسور در این «struct» تعریف شدهاند و همه اطلاعات و تنظیماتی که روی سنسور اعمال میشوند در این «structure» ذخیره میشوند و میتوانید تغییرات هر بخش از سنسور را در محیط «Debug Session» مشاهده کنید.
typedef struct BU27006MUCZ
{
uint8_t Register_Cache;
uint8_t PART_ID;
uint8_t MANUFACTURER_ID;
BU27006MUCZ_Reset_Status RESET;
BU27006MUCZ_Ability RGB_IR;
BU27006MUCZ_Ability FLC;
BU27006MUCZ_RGB_Gain RGB_GAIN;
BU27006MUCZ_RGB_Measurement_Mode RGB_MEASUREMENT_MODE;
BU27006MUCZ_FLC_Gain FLC_GAIN;
BU27006MUCZ_FLC_Measurement_Mode FLC_MEASUREMENT_MODE;
float ALS_RESOLUTION_TIME;
BU27006MUCZ_Data_Status RGB_DATA;
BU27006MUCZ_Data_Status FLC_DATA;
BU27006MUCZ_Interrupt_Mode INTERRUPT_MODE;
BU27006MUCZ_Interrupt_Channel INTERRUPT_CHANNEL;
uint8_t FLICKER_COUNTER;
uint8_t FIFO_LEVEL;
BU27006MUCZ_Interrupt_Status INTERRRUPT_STATUS;
uint32_t INTERRUPT_UPPER_THRESHOLD;
uint32_t INTERRUPT_LOWER_THRESHOLD;
uint8_t REGISTER_DATA[REGISTER_DATA_BUFFER_SIZE];
uint16_t RED_DATA;
uint16_t GREEN_DATA;
uint16_t BLUE_DATA;
uint16_t IR_DATA;
uint16_t FLICKER_DATA;
uint16_t FIFO_DATA[FIFO_DATA_BUFFER_SIZE];
float RED_LUX;
float GREEN_LUX;
float BLUE_LUX;
}GebraBit_BU27006MUCZ;
Declaration of functions
در انتهای این فایل، تمام توابع مربوط به خواندن و نوشتن در رجیسترهای BU27006MUCZ، پیکربندی سنسور و دریافت دادهها از سنسور اعلام شدهاند:
extern void GB_BU27006MUCZ_Read_Reg_Data(uint8_t regAddr, uint8_t *data) ;
extern void GB_BU27006MUCZ_Burst_Read(uint8_t regAddr, uint8_t *data, uint16_t byteQuantity);
extern void GB_BU27006MUCZ_Read_Reg_Bits (uint8_t regAddr, uint8_t start_bit, uint8_t len, uint8_t* data);
extern void GB_BU27006MUCZ_Write_Command( uint8_t cmd);
extern void GB_BU27006MUCZ_Write_Reg_Data(uint8_t regAddr, uint8_t data) ;
extern void GB_BU27006MUCZ_Burst_Write(uint8_t regAddr, uint8_t *data, uint16_t byteQuantity) ;
extern void GB_BU27006MUCZ_Write_Reg_Bits(uint8_t regAddr, uint8_t start_bit, uint8_t len, uint8_t data);
/********************************************************
* Declare BU27006MUCZ Configuration Functions *
********************************************************/
extern void GB_BU27006MUCZ_Soft_Reset ( GebraBit_BU27006MUCZ * BU27006MUCZ ) ;
extern void GB_BU27006MUCZ_RGB_Gain ( GebraBit_BU27006MUCZ * BU27006MUCZ , BU27006MUCZ_RGB_Gain gain ) ;
extern void GB_BU27006MUCZ_RGB_Measurement_Mode ( GebraBit_BU27006MUCZ * BU27006MUCZ , BU27006MUCZ_RGB_Measurement_Mode mode ) ;
extern void GB_BU27006MUCZ_FLC_Measurement_Mode ( GebraBit_BU27006MUCZ * BU27006MUCZ , BU27006MUCZ_FLC_Measurement_Mode mode ) ;
extern void GB_BU27006MUCZ_FLC_Gain ( GebraBit_BU27006MUCZ * BU27006MUCZ , BU27006MUCZ_FLC_Gain gain ) ;
extern void GB_BU27006MUCZ_RGB_IR ( GebraBit_BU27006MUCZ * BU27006MUCZ , BU27006MUCZ_Ability rgb ) ;
extern void GB_BU27006MUCZ_FLC ( GebraBit_BU27006MUCZ * BU27006MUCZ , BU27006MUCZ_Ability flc );
extern void GB_BU27006MUCZ_Interrupt(GebraBit_BU27006MUCZ * BU27006MUCZ , BU27006MUCZ_Interrupt_Mode mode) ;
extern void GB_BU27006MUCZ_Check_Data_Updated ( GebraBit_BU27006MUCZ * BU27006MUCZ ) ;
extern void GB_BU27006MUCZ_Part_ID ( GebraBit_BU27006MUCZ * BU27006MUCZ ) ;
extern void GB_BU27006MUCZ_Manufacture_ID ( GebraBit_BU27006MUCZ * BU27006MUCZ ) ;
extern void GB_BU27006MUCZ_Flicker_Counter ( GebraBit_BU27006MUCZ * BU27006MUCZ ) ;
extern void GB_BU27006MUCZ_FIFO_Level ( GebraBit_BU27006MUCZ * BU27006MUCZ ) ;
extern void GB_BU27006MUCZ_Read_FIFO_Flicker_Data ( GebraBit_BU27006MUCZ * BU27006MUCZ );
extern void GB_BU27006MUCZ_initialize( GebraBit_BU27006MUCZ * BU27006MUCZ ) ;
extern void GB_BU27006MUCZ_Configuration(GebraBit_BU27006MUCZ * BU27006MUCZ) ;
extern void GB_BU27006MUCZ_Read_RGB_IR_FLICKER(GebraBit_BU27006MUCZ * BU27006MUCZ);
extern void GB_BU27006MUCZ_Color_Luminosity(GebraBit_BU27006MUCZ * BU27006MUCZ);
extern void GB_BU27006MUCZ_Get_Data(GebraBit_BU27006MUCZ * BU27006MUCZ);
فایل منبع Gebra_BU27006MUCZ.c
این فایل که به زبان C نوشته شده است، تمامی توابع با جزئیات کامل به صورت کامنت شدهاند و پارامترهای ورودی و مقادیر بازگشتی توابع به وضوح توضیح داده شدهاند. بنابراین، فقط به همین توضیحات اکتفا میکنیم و کاربران را برای اطلاعات بیشتر مستقیماً به این فایل ارجاع میدهیم.
برنامه نمونه در Arduino
پس از اتصال ماژول به Arduino و افزودن کتابخانه به IDE، به مسیر زیر بروید:
File > Examples > Gebra_BU27006MUCZ > RGB
توضیح فایل نمونه
enumها و توابع مورد نیاز ماژول Gebra BU27006MUCZ به ساختارها اضافه شدهاند. در بخش بعدی، یک متغیر به نام BU27006MUCZ از نوع ساختار Gebra_BU27006MUCZ (که در هدر Gebra_BU27006MUCZ تعریف شده و در بخش توضیحات کتابخانه شرح داده شده است) برای پیکربندی ماژول Gebra BU27006MUCZ تعریف شده است:
GebraBit_BU27006MUCZ BU27006MUCZ;
در بخش بعدی کد نوشته شده، با استفاده از توابعGB_BU27006MUCZ_initialize(&BU27006MUCZ_Module)
وGB_BU27006MUCZ_Configuration(&BU27006MUCZ_Module)
ماژول Gebra BU27006MUCZ را تنظیم میکنیم و در نهایت در بخش حلقه while
برنامه، دادهها از سنسور خوانده شده و مقادیر RED، BLUE، GREEN، IR و Flicker بهصورت پیوسته دریافت میشوند:
void setup() {
Wire.begin(); // Initialize the I2C bus
Serial.begin(9600); // Initialize serial communication for debugging
GB_BU27006MUCZ_initialize(&BU27006MUCZ); // Initialize the BU27006MUCZ sensor
GB_BU27006MUCZ_Configuration(&BU27006MUCZ); // Configure the BU27006MUCZ sensor
}
void loop() {
GB_BU27006MUCZ_Get_Data(&BU27006MUCZ); // Read data from the sensor
Serial.print("RED: ");
Serial.print(BU27006MUCZ.RED_LUX);
Serial.println(" lx");
Serial.print("GREEN: ");
Serial.print(BU27006MUCZ.GREEN_LUX);
Serial.println(" lx");
Serial.print("BLUE: ");
Serial.print(BU27006MUCZ.BLUE_LUX);
Serial.println(" lx");
delay(2000); // Delay between readings
}
The Sample file code text:
#include "GebraBit_BU27006MUCZ.h"
GebraBit_BU27006MUCZ BU27006MUCZ;
void setup() {
Wire.begin(); // Initialize the I2C bus
Serial.begin(9600); // Initialize serial communication for debugging
GB_BU27006MUCZ_initialize(&BU27006MUCZ); // Initialize the BU27006MUCZ sensor
GB_BU27006MUCZ_Configuration(&BU27006MUCZ); // Configure the BU27006MUCZ sensor
}
void loop() {
GB_BU27006MUCZ_Get_Data(&BU27006MUCZ); // Read data from the sensor
Serial.print("RED: ");
Serial.print(BU27006MUCZ.RED_LUX);
Serial.println(" lx");
Serial.print("GREEN: ");
Serial.print(BU27006MUCZ.GREEN_LUX);
Serial.println(" lx");
Serial.print("BLUE: ");
Serial.print(BU27006MUCZ.BLUE_LUX);
Serial.println(" lx");
delay(2000); // Delay between readings
}
Arduino خود را به کامپیوتر وصل کنید و برد Arduino خود را انتخاب کنید.
سپس کد نمونه را تأیید (Verify) و آپلود (Upload) کنید.
بعد از آپلود کردن کد، سریال مانیتور را باز کنید و میتوانید مقادیر سنسور را مشاهده کنید.