هدف ما از انجام این پروژه چیست؟
هدف این پروژه، اتصال و استفاده از سنسور محیطی BME280 به توسط آردوینو می باشد که میتوان از آن برای اندازهگیری و پایش دما، رطوبت و فشار هوا در محیطهای مختلف استفاده کرد. این سنسور قادر است شرایط محیطی را با دقت بالا اندازهگیری کرده و دادههای کاربردی ارائه دهد، که آن را برای کاربردهایی مانند پایش آبوهوا، سیستمهای هوشمند کنترل محیطی و پروژههای تحقیقاتی مناسب میسازد. کاربران میتوانند با خواندن مقادیر این سنسور، سیستمهایی توسعه دهند که به تغییرات شرایط محیطی واکنش نشان دهند و در نتیجه عملکرد و کارایی سیستم را بهبود بخشند.
در این آموزش چه چیزهایی یاد میگیریم؟
- چگونه سنسور BME280 را به آردوینو وصل کنید و ارتباط SPI را راهاندازی کنید.
کتابخانهای را برای استفاده با آردوینو تغییر بدهید و بیشتر با نحوه کار دادههای SPI آشنا بشوید.
چگونه دما، رطوبت و فشار هوا را بخوانید و از این دادهها برای کاربردهای واقعی استفاده کنید.
پروژههایی مثل نظارت بر شرایط محیطی، پیشبینی آبوهوا و سیستمهای هوشمند محیطی را با این سنسور اجرا کنید و مهارتهای عملی برای ساخت سیستمهای واکنشگرا بر اساس دادههای محیطی یاد بگیرید.
این آموزش به شما کمک میکند سنسور را به درستی راهاندازی کنید و دادهها را به صورت لحظهای با آردوینو بخوانید.
برای انجام این پروژه به چه چیزهایی نیاز داریم؟
همانطور که احتمالا میدانید برای انجام این پروژه به سخت افزارها و نرم افزارهایی نیاز داریم. عناوین این سخت افزارها و نرم افزارها در جدول زیر در اختیارتان قرار داده شده که میتوانید با کلیک روی هرکدام از آنها، آنها را تهیه/دانلود کنید و برای شروع آماده شوید.
سخت افزارهای مورد نیاز
|
نرم افزارهای مورد نیاز
|
---|---|
Arduino UNO
|
ابتدا مانند تصویر زیر ماژول GebraBit BME280 را به صورت زیر به آردوینو متصل می کنیم:
سپس کتابخانه GebraBit BME280 را دانلود و به نرم افزار آردوینو اضافه کنید.
کتابخانه های مورد نیاز
|
---|
اگر نمیدانید چطور کتابخانههای GebraBit را به آردوینو اضافه کنید، به لینک آموزشی زیر مراجعه کنید.
نحوه افزودن کتابخانه های GebraBit به آردوینو
کتابخانه و درایور BME280
GebraBit علاوه بر طراحی ماژولار سنسورها و آی سی های مختلف ، پیشرو در ارائه انواع کتابخانه های ساختاریافته و مستقل از سخت افزار به زبان C، جهت سهولت کاربران در راه اندازی و توسعه نرم افزاری آنها نیز بوده است.
بدین منظور پس از تهیه هر یک از ماژول های GebraBit ، کاربر می تواند با مراجعه به بخش آموزش ماژول مربوطه، کتابخانه مختص به آن ماژول که حاوی فایل .h و .c (Header and Source) و یک برنامه نمونه آموزشی تحت سخت افزار های GebraBit STM32F303, GebraBit ATMEGA32A یا Arduino می باشد را دانلود کند.
تمامی توابع و Structure های تعریف شده در کتابخانه ، با جزئیات کامل، کامنت گذاری شده و تمامی پارامتر های دریافتی در آرگومان توابع و مقادیر بازگشتی از آنها ، به اختصار توضیح داده شده است.با توجه به مستقل از سخت افزار بودن کتابخانه ها،کاربر به راحتی می تواند آن را در هر یک از کامپایلر های دلخواه اضافه کرده و با میکروکنترلر و برد توسعه مورد علاقه خود، آن را توسعه دهد.
فایل هدر GebraBit_BME280.h
در این فایل بر اساس دیتاشیت سنسور یا ای سی ، تمامی آدرس رجیسترها، مقادیر هریک از رجیسترها به صورت Enumeration تعریف شده است.همچنین بدنه سنسور BME280 و کانفیگ های مربوط به هریک از بلوک های داخلی سنسور BME280 به صورت STRUCT با نام GebraBit_BME280 نیز تعریف شده است.که نهایتا در محیط Debug Session تمامی کانفیگ های مربوط به هر بلوک به صورت Real Time قابل مشاهده است.
USER REGISTER MAP
رجیستر ها و کامند های مورد نیاز برای راه اندازی سنسور :
#define BME280_ID (0xD0)
#define BME280_RESET (0xE0)
#define BME280_TEMP_PRESS_CALIB00_CALIB25 (0x88)//0x88 TO 0xA1
#define BME280_HUMIDITY_CALIB26_CALIB41 (0xE1)//0xE1 TO 0xE7
#define BME280_CTRL_MEAS (0xF4)
#define BME280_CTRL_HUM (0xF2)
#define BME280_CONFIG (0xF5)
#define BME280_DATA_ADDR (0xF7)//PRESS_MSB
#define BME280_STATUS (0xF3)
enum BME280_Ability
توانایی فعال یا غیر فعال کردن بخش های مختلف سنسور در این enum تعریف شده است :
1. typedef enum Ability
2. {
3. Disable = 0 ,
4. Enable
5. }BME280_Ability;
enum BME280_Power_Mode
برای انتخاب حالت کاری تغذیه سنسور از مقادیر این enum استفاده می شود:
1. typedef enum Power_Mode
2. {
3. SLEEP_MODE = 0,
4. FORCED_MODE = 1,
5. NORMAL_MODE = 3
6. } BME280_Power_Mode;
enum BME280_Sensor_Oversampling
برای انتخاب Oversampling سنسور از مقادیر این enum استفاده می شود:
1. typedef enum Pressure_Oversampling
2. {
3. X1_OVERSAMPLING = 1 ,
4. X2_OVERSAMPLING = 2 ,
5. X4_OVERSAMPLING = 3 ,
6. X8_OVERSAMPLING = 4 ,
7. X16_OVERSAMPLING = 5
8. } BME280_Sensor_Oversampling;
enum BME280_Inactive_Duration
برای انتخاب زمان StandBy سنسور از مقادیر این enum استفاده می شود:
1. typedef enum Inactive_Duration
2. {
3. INACTIVE_DURATION_5_mS = 0 ,
4. INACTIVE_DURATION_62P5_mS = 1 ,
5. INACTIVE_DURATION_125_mS = 2 ,
6. INACTIVE_DURATION_250_mS = 3 ,
7. INACTIVE_DURATION_500_mS = 4 ,
8. INACTIVE_DURATION_1000_mS = 5 ,
9. INACTIVE_DURATION_10_mS = 6 ,
10. INACTIVE_DURATION_20_mS = 7
11. } BME280_Inactive_Duration;
enum BME280_IIR_Filter_Coefficient
برای انتخاب مقادیر مناسب از ضرایب کالیبراسیون سنسور از مقادیر این enum استفاده می شود:
1. typedef enum IIR_Filter_Coefficient
2. {
3. FILTER_OFF = 0 ,
4. FILTER_COEFFICIENT_2 = 1 ,
5. FILTER_COEFFICIENT_4 = 2 ,
6. FILTER_COEFFICIENT_8 = 3 ,
7. FILTER_COEFFICIENT_16 = 4
8. } BME280_IIR_Filter_Coefficient;
enum BME280_Preparation
مقادیر این enum آماده بودن یا نبودن داده را مشخص می کند :
1. typedef enum Preparation
2. {
3. IS_Ready = 0 ,
4. IS_NOT_Ready
5. }BME280_Preparation;
enum BME280_Reset_Status
مقادیر این enum ریست شدن یا نشدن سنسور را مشخص می کند :
1. typedef enum
2. {
3. DONE = 0 ,
4. FAILED = 1
5. }BME280_Reset_Status;
Struct BME280
تمام ویژگی های سنسور، ضرایب کالیبراسیون و داده های سنسور در اینStruct تعریف شده است و تمامی اطلاعات و کانفیگ اجرا شده بر روی سنسور در این Structure ذخیره شده و می توان تغییرات در هر بخش از سنسور را در محیط Debug Session مشاهده نمود.
1. typedef struct BME280
2. {
3. uint8_t REGISTER_CACHE;
4. BME280_Reset_Status RESET;
5. uint8_t DEVICE_ID;
6. BME280_Preparation CONVERSION_RESULT;
7. BME280_Preparation NVM_DATA;
8. BME280_Power_Mode POWER_MODE;
9. BME280_Ability TEMPERATURE;
10. BME280_Ability PRESSURE;
11. BME280_Ability HUMIDITY;
12. BME280_Sensor_Oversampling TEMPERATURE_OVERSAMPLING;
13. BME280_Sensor_Oversampling PRESSURE_OVERSAMPLING;
14. BME280_Sensor_Oversampling HUMIDITY_OVERSAMPLING;
15. BME280_IIR_Filter_Coefficient IIR_FILTER_TIME_CONATANT;
16. BME280_Inactive_Duration INACTIVE_DURATION;
17. uint8_t PRESS_TEMP_CALIBRATION_DATA[PRESS_TEMP_CALIBRATION_DATA_BUFFER_SIZE];
18. uint8_t HUMIDITY_CALIBRATION_DATA[HUMIDITY_CALIBRATION_DATA_BUFFER_SIZE];
19. int32_t dig_t1;
20. int32_t dig_t2;
21. int32_t dig_t3;
22. uint16_t dig_p1;
23. int16_t dig_p2;
24. int16_t dig_p3;
25. int16_t dig_p4;
26. int16_t dig_p5;
27. int16_t dig_p6;
28. int16_t dig_p7;
29. int16_t dig_p8;
30. int16_t dig_p9;
31. int32_t dig_h1;
32. int32_t dig_h2;
33. int32_t dig_h3;
34. int32_t dig_h4;
35. int32_t dig_h5;
36. int32_t dig_h6;
37. int32_t FINE_TEMP_RESOLUTIN;
38. uint8_t REGISTER_RAW_DATA_BUFFER[REGISTER_RAW_DATA_BYTE_QTY];
39. uint32_t REGISTER_RAW_PRESSURE;
40. uint32_t REGISTER_RAW_TEMPERATURE;
41. uint32_t REGISTER_RAW_HUMIDITY;
42. double COMPENSATED_TEMPERATURE;
43. double COMPENSATED_PRESSURE;
44. double ALTITUDE;
45. double COMPENSATED_HUMIDITY;
46. }GebraBit_BME280;
47.
اعلان توابع
در پایان این فایل تمامی توابع جهت خواندن و نوشتن در رجیستر های BME280 ، کانفیک سنسور و دریافت داده از سنسور اعلان شده است:
1. /********************************************************
2. *Declare Read&Write BME280 Register Values Functions *
3. ********************************************************/
4. extern uint8_t GB_BME280_Read_Reg_Data ( uint8_t regAddr,uint8_t* data);
5. extern uint8_t GB_BME280_Read_Reg_Bits (uint8_t regAddr,uint8_t start_bit, uint8_t len, uint8_t* data);
6. extern uint8_t GB_BME280_Burst_Read(uint8_t regAddr,uint8_t *data, uint16_t byteQuantity);
7. extern uint8_t GB_BME280_Write_Reg_Data(uint8_t regAddr, uint8_t data);
8. extern uint8_t GB_BME280_Write_Reg_Bits(uint8_t regAddr, uint8_t start_bit, uint8_t len, uint8_t data);
9. extern uint8_t GB_BME280_Burst_Write ( uint8_t regAddr,uint8_t *data, uint16_t byteQuantity);
10. /********************************************************
11. * Declare BME280 Configuration Functions *
12. ********************************************************/
13. extern void GB_BME280_Soft_Reset ( GebraBit_BME280 * BME280 );
14. extern void GB_BME280_Get_Device_ID(GebraBit_BME280 * BME280);
15. extern void GB_BME280_Check_NVM_Data(GebraBit_BME280 * BME280 ) ;
16. extern void GB_BME280_Check_Conversion_Transferred_Register(GebraBit_BME280 * BME280 );
17. extern void GB_BME280_Turn_Humidity_OFF(GebraBit_BME280* BME280);
18. extern void GB_BME280_Humidity_OverSampling(GebraBit_BME280* BME280 ,BME280_Sensor_Oversampling hum_over);
19. extern void GB_BME280_Turn_Temperature_OFF(GebraBit_BME280* BME280);
20. extern void GB_BME280_Temperature_OverSampling(GebraBit_BME280* BME280 ,BME280_Sensor_Oversampling temp_over);
21. extern void GB_BME280_Turn_Pressure_OFF(GebraBit_BME280* BME280);
22. extern void GB_BME280_Pressure_OverSampling(GebraBit_BME280* BME280 ,BME280_Sensor_Oversampling press_over);
23. extern void GB_BME280_Power_Mode(GebraBit_BME280* BME280 ,BME280_Power_Mode pmode);
24. extern void GB_BME280_Inactive_Duration(GebraBit_BME280 * BME280 , BME280_Inactive_Duration dur ) ;
25. extern void GB_BME280_IIR_Filter_Coefficient (GebraBit_BME280 * BME280 , BME280_IIR_Filter_Coefficient filter);
26. extern void GB_BME280_Power_Mode(GebraBit_BME280* BME280 ,BME280_Power_Mode pmode);
27. extern void GB_BME280_Calculate_Calibration_Coefficients(GebraBit_BME280 * BME280) ;
28. extern void GB_BME280_Twos_Complement_Converter(int32_t *value, uint8_t length) ;
29. extern void GB_BME280_Compensate_Temperature(GebraBit_BME280 * BME280) ;
30. extern void GB_BME280_Compensate_Pressure(GebraBit_BME280 * BME280) ;
31. extern void GB_BME280_Compensate_Humidity(GebraBit_BME280 * BME280);
32.
33. /********************************************************
34. * Declare BME280 DATA Functions *
35. ********************************************************/
36. extern void GB_BME280_Get_Register_Raw_Pressure_Temperature_Humidity(GebraBit_BME280 * BME280 );
37. extern void GB_BME280_Altitude(GebraBit_BME280 * BME280);
38. extern void GB_BME280_Get_Data(GebraBit_BME280 * BME280 );
39. /********************************************************
40. * Declare BME280 HIGH LEVEL Functions *
41. ********************************************************/
42. extern void GB_BME280_initialize( GebraBit_BME280 * BME280 );
43. extern void GB_BME280_Configuration(GebraBit_BME280 * BME280);
44.
فایل سورس GebraBit_BME280.cpp
در این فایل که به زبان ++C نوشته شده ، تمامی توابع با جزئیات کامل، کامنت گذاری شده و تمامی پارامتر های دریافتی در آرگومان توابع و مقادیر بازگشتی از آنها ، بطور واضح توضیح داده شده است.از این رو در این قسمت به همین توضیحات اکتفا کرده و کاربران را برای اطلاعات بیشتر به بررسی مستقیم از این فایل دعوت می کنیم.
برنامه نمونه در آردوینو
بعد از اتصال ماژول به آردوینو و اضافه کردن کتابخانه سنسور به نرم افزار آردوینو به مسیر زیر بروید و کد نمونه را باز کنید. File > Examples > GebraBit_BME280 > temp-hum-pre
شرح فایل نمونه
اگر به ابتدای فایل main.c دقت کنید،متوجه می شوید که هدر GebraBit_BME280.h برای دسترسی به ساختار ها ، Enum ها و توابع مورد نیاز ماژول GebraBit BME280 ، اضافه شده است.در قسمت بعدی متغیری به نام BME280_Module از نوع ساختار GebraBit_BME280 (این ساختار در هدر GebraBit_BME280 بوده و در بخش توضیحات کتابخانه GebraBit_BME280توضیح داده شد) که برای پیکربندی ماژول GebraBit BME280 می باشد،تعریف شده است:
GebraBit_BME280 BME280;
در بخش بعدی کد نوشته شده، با استفاده از تابع GB_BME280_initialize(&BME280_Module) ، و GB_BME280_Configuration(&BME280_MODULE) ماژول GebraBit BME280 را مقدار دهی و پیکره بندی می کنیم:
void setup() {
Serial.begin(9600);
SPI.begin();
pinMode(SPI_CS_Pin, OUTPUT);
digitalWrite(SPI_CS_Pin, HIGH);
GB_BME280_initialize(&BME280);
// Check if the device ID matches the expected value
GB_BME280_Get_Device_ID(&BME280);
if (BME280.DEVICE_ID != 0x60) {
Serial.println("Failed to initialize BME280 sensor!");
while (1);
} else {
Serial.println("BME280 sensor initialized successfully.");
}
GB_BME280_Configuration(&BME280);
}
void loop() {
GB_BME280_Get_Data(&BME280);
Serial.print("Temperature: ");
Serial.print(BME280.COMPENSATED_TEMPERATURE);
Serial.println(" °C");
Serial.print("Pressure: ");
Serial.print(BME280.COMPENSATED_PRESSURE);
Serial.println(" hPa");
Serial.print("Humidity: ");
Serial.print(BME280.COMPENSATED_HUMIDITY);
Serial.println(" %");
Serial.print("Altitude: ");
Serial.print(BME280.ALTITUDE);
Serial.println(" m");
delay(1000);
}
متن کد فایل آردوینو:
#include "GebraBit_BME280.h"
#define SPI_CS_Pin 10 // Change this if your CS pin is different
GebraBit_BME280 BME280;
void setup() {
Serial.begin(9600);
SPI.begin();
pinMode(SPI_CS_Pin, OUTPUT);
digitalWrite(SPI_CS_Pin, HIGH);
GB_BME280_initialize(&BME280);
// Check if the device ID matches the expected value
GB_BME280_Get_Device_ID(&BME280);
if (BME280.DEVICE_ID != 0x60) {
Serial.println("Failed to initialize BME280 sensor!");
while (1);
} else {
Serial.println("BME280 sensor initialized successfully.");
}
GB_BME280_Configuration(&BME280);
}
void loop() {
GB_BME280_Get_Data(&BME280);
Serial.print("Temperature: ");
Serial.print(BME280.COMPENSATED_TEMPERATURE);
Serial.println(" °C");
Serial.print("Pressure: ");
Serial.print(BME280.COMPENSATED_PRESSURE);
Serial.println(" hPa");
Serial.print("Humidity: ");
Serial.print(BME280.COMPENSATED_HUMIDITY);
Serial.println(" %");
Serial.print("Altitude: ");
Serial.print(BME280.ALTITUDE);
Serial.println(" m");
delay(1000);
}
آردوینو خود را به کامپیوتر متصل کنید و مدل و پورت آردوینو خود را انتخاب کنید.
سپس نمونه کد را ابتدا Verify و سپس Upload کنید
بعد از Upload کردن کد Serial Monitor را باز کرده و می توانید خروجی های سنسور را مشاهده کنید
در ادامه می توانید کتابخانه GebraBit_BME280 , شماتیک و دیتاشیت ماژول را دانلود نمایید.
ویدیو خروجی برنامه:
ویدیو کارکرد ماژول به زودی آپلود می شود.