Arduino ile BME280 Sensör Projesi

Bu projenin amacı nedir?

Bu projenin amacı, çeşitli ortamlarda sıcaklığı, nemi ve atmosfer basıncını ölçmek ve izlemek için BME280 çevre sensörünü bir Arduino ile arayüzlemektir. Bu çok yönlü sensör, bu parametreler için doğru okumalar sağlar ve bu da onu hava istasyonları, HVAC kontrolü ve iç hava kalitesi izleme gibi uygulamalar için ideal hale getirir. Çevresel verileri gerçek zamanlı olarak yakalayarak, kullanıcılar değişen koşullara yanıt veren, akıllı ev ve endüstriyel uygulamalarda enerji verimliliğini ve konforu artıran sistemler geliştirebilir.

Bu eğitimde neler öğreneceğiz?

  • Güvenilir ve hızlı çevresel veri aktarımı için BME280 sensörünü SPI iletişimini kullanarak Arduino’ya bağlayın .
  • Mevcut bir SPI uyumlu kütüphaneyi Arduino’ya uyarlayarak SPI veri işleme konusundaki anlayışınızı derinleştirin.
  • Sensörden sıcaklık, nem ve basınç değerlerini okuyun ve verileri gerçek dünya uygulamaları için analiz edin.
  • Hava istasyonları ve hava kalitesi sistemleri gibi çevresel izleme projeleri oluşturun ve duyarlı, veri odaklı sistemler için beceriler kazanın.

Bu uygulamalı kılavuz, Arduino ile sensör entegrasyonu ve gerçek zamanlı veri izleme konusunda bilgi sağlar.

Bu projeye başlamak için neye ihtiyacımız var?

bu projeyi gerçekleştirmek için bazı donanım ve yazılımlara ihtiyacımız var. Bu donanım ve yazılımların başlıkları aşağıdaki tabloda sizlere sunulmuştur ve her birinin üzerine tıklayarak hazırlayabilir/indirebilir ve başlamaya hazırlanabilirsiniz.

GEREKLİ DONANIMGEREKLİ YAZILIM
Arduino ProgrammerArduino IDE – (Nasıl kurulur ?)
Arduino Development Board- ( Arduino UNO )
Gebra BME280 Sıcaklık, Nem ve Barometrik Basınç modülü

GebraMS sizin kolaylığınız için çoğu arduino projesi için özel kütüphaneler hazırlamış
GebraMS’in hazırladığı kütüphanesini indirip Arduino IDE’nize eklemeniz gerekecek. (Gebra kütüphaneleri Arduino’ya nasıl eklenir)

Öncelikle aşağıdaki görselde görüldüğü gibi Gebra BME280 modülümüzü Arduino UNO’ya şu şekilde bağlıyoruz:

Source Code

Projenin kütüphanesi (Library)

GebraMS, çeşitli sensör ve entegrelerin modüler tasarımına ek olarak, kullanıcıların yazılım kurma ve geliştirme işlemlerini kolaylaştırmak için C dilinde çeşitli yapılandırılmış ve donanımdan bağımsız kütüphaneler (Library) sağlamaya çalışır. Bu amaçla, kullanıcılar, istedikleri modülün kütüphanesini “.h” ve “.c” dosyasını (Başlık ve Kaynak) olarak indirebilirler.

GebraMS tarafından sağlanan projenin kütüphanesini projenize ekleyerek ( projeye dosya nasıl eklenir ) kodumuzu kolayca geliştirebiliriz. ilgili dosyaları projenin sonunda veya sağ tarafta ilgili sayfalar kısmında bulabilirsiniz

Kütüphanede tanımlanan tüm fonksiyonlar tüm detaylarıyla yorumlanmakta ve fonksiyonların argümanlarında alınan tüm parametreler ve dönüş değerleri kısaca açıklanmaktadır. Kütüphaneler donanımdan bağımsız olduğundan kullanıcı istediği compiler’e kolaylıkla kütüphaneyi ekleyebilir ve istediği mikroişlemci ve geliştirme kartı ile geliştirebilir.

USER REGISTER MAP

The registry map or sensor commands are defined in this section:

C
#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)

BME280_Ability Enum​

The ability to activate or deactivate different parts of the sensor is defined in this enum:

C
 typedef enum Ability
 {
 Disable = 0 ,
 Enable
 }BME280_Ability;

BME280_Power_Mode Enum

The values of this enum are used to select the sensor Power Mode:

C
 typedef enum Power_Mode
 {
 SLEEP_MODE      = 0,
 FORCED_MODE     = 1,
 NORMAL_MODE     = 3
 } BME280_Power_Mode;

BME280_Sensor_Oversampling Enum

The values of this enum are used to select the sensor oversampling:

C
 typedef enum Pressure_Oversampling
 {
 	 X1_OVERSAMPLING    = 1 ,
 	 X2_OVERSAMPLING    = 2 ,
 	 X4_OVERSAMPLING    = 3 ,
 	 X8_OVERSAMPLING    = 4 ,
 	 X16_OVERSAMPLING   = 5
 } BME280_Sensor_Oversampling;

BME280_Inactive_Duration Enum

The values of this enum are used to select the sensor stand-by time:

C
 typedef enum Inactive_Duration
  {
  	 INACTIVE_DURATION_5_mS           = 0 ,
  	 INACTIVE_DURATION_62P5_mS        = 1 ,
  	 INACTIVE_DURATION_125_mS         = 2 ,
  	 INACTIVE_DURATION_250_mS         = 3 ,
  	 INACTIVE_DURATION_500_mS         = 4 ,
  	 INACTIVE_DURATION_1000_mS        = 5 ,
  	 INACTIVE_DURATION_10_mS          = 6 ,
 	 INACTIVE_DURATION_20_mS          = 7
 } BME280_Inactive_Duration;

BME280_IIR_Filter_Coefficient Enum

The values of this enum are used to select the appropriate values of sensor calibration coefficients:

C
 typedef enum IIR_Filter_Coefficient
 {
 	 FILTER_OFF               = 0 ,
 	 FILTER_COEFFICIENT_2     = 1 ,
 	 FILTER_COEFFICIENT_4     = 2 ,
 	 FILTER_COEFFICIENT_8     = 3 ,
 	 FILTER_COEFFICIENT_16    = 4
 } BME280_IIR_Filter_Coefficient;

BME280_Preparation Enum

The values of this enum determine whether the data is ready or not:

C
 typedef enum Preparation
 {
 	IS_Ready = 0 ,
 	IS_NOT_Ready
 }BME280_Preparation;

BME280_Reset_Status Enum

The values of this enum determine whether the sensor is reset or not:

C
 typedef enum
 {
 	DONE      = 0 ,
 	FAILED    = 1
 }BME280_Reset_Status;

BME280 struct

All sensor properties, calibration coefficients and sensor data are defined in this “struct” and All the information and configuration implemented on the sensor are stored in this “structure” and you can see the changes in each part of the sensor in the “Debug Session” environment.

C
 typedef struct BME280
  {
      uint8_t                       	   REGISTER_CACHE;
      BME280_Reset_Status                RESET;
      uint8_t                       	   DEVICE_ID;
      BME280_Preparation		           CONVERSION_RESULT;
      BME280_Preparation		           NVM_DATA;
      BME280_Power_Mode                  POWER_MODE;
      BME280_Ability                     TEMPERATURE;
     BME280_Ability                     PRESSURE;
     BME280_Ability                     HUMIDITY;
     BME280_Sensor_Oversampling         TEMPERATURE_OVERSAMPLING;
     BME280_Sensor_Oversampling         PRESSURE_OVERSAMPLING;
     BME280_Sensor_Oversampling         HUMIDITY_OVERSAMPLING;
     BME280_IIR_Filter_Coefficient      IIR_FILTER_TIME_CONATANT;
     BME280_Inactive_Duration           INACTIVE_DURATION;
     uint8_t 						   PRESS_TEMP_CALIBRATION_DATA[PRESS_TEMP_CALIBRATION_DATA_BUFFER_SIZE];
     uint8_t 						   HUMIDITY_CALIBRATION_DATA[HUMIDITY_CALIBRATION_DATA_BUFFER_SIZE];
     int32_t 						   dig_t1;
     int32_t 						   dig_t2;
     int32_t 						   dig_t3;
     uint16_t 						   dig_p1;
     int16_t 						   dig_p2;
     int16_t 						   dig_p3;
     int16_t 						   dig_p4;
     int16_t							   dig_p5;
     int16_t 						   dig_p6;
     int16_t 						   dig_p7;
     int16_t 						   dig_p8;
     int16_t 						   dig_p9;
     int32_t 						   dig_h1;
     int32_t 						   dig_h2;
     int32_t 						   dig_h3;
     int32_t 						   dig_h4;
     int32_t 						   dig_h5;
     int32_t 						   dig_h6;
     int32_t 						   FINE_TEMP_RESOLUTIN;
     uint8_t 						   REGISTER_RAW_DATA_BUFFER[REGISTER_RAW_DATA_BYTE_QTY];
     uint32_t 						   REGISTER_RAW_PRESSURE;
     uint32_t 						   REGISTER_RAW_TEMPERATURE;
     uint32_t 						   REGISTER_RAW_HUMIDITY;
     double 							   COMPENSATED_TEMPERATURE;
     double 							   COMPENSATED_PRESSURE;
     double 							   ALTITUDE;
     double 					           COMPENSATED_HUMIDITY;
 }GebraBit_BME280;

Declaration of functions

At the end of this file, all the functions for reading and writing in BME280 registers, sensor configuration and receiving data from the sensor are declared:

C
 /********************************************************
   *Declare Read&Write BME280 Register Values Functions *
   ********************************************************/
  extern	uint8_t	GB_BME280_Read_Reg_Data ( uint8_t regAddr,uint8_t* data);
  extern	uint8_t GB_BME280_Read_Reg_Bits (uint8_t regAddr,uint8_t start_bit, uint8_t len, uint8_t* data);
  extern	uint8_t GB_BME280_Burst_Read(uint8_t regAddr,uint8_t *data, uint16_t byteQuantity);
  extern	uint8_t GB_BME280_Write_Reg_Data(uint8_t regAddr, uint8_t data);
  extern	uint8_t	GB_BME280_Write_Reg_Bits(uint8_t regAddr, uint8_t start_bit, uint8_t len, uint8_t data);
  extern	uint8_t GB_BME280_Burst_Write		( uint8_t regAddr,uint8_t *data, 	uint16_t byteQuantity);
 /********************************************************
  *       Declare BME280 Configuration Functions       *
  ********************************************************/
 extern void GB_BME280_Soft_Reset ( GebraBit_BME280 * BME280 );
 extern void	GB_BME280_Get_Device_ID(GebraBit_BME280 * BME280);
 extern void GB_BME280_Check_NVM_Data(GebraBit_BME280 * BME280 ) ;
 extern void GB_BME280_Check_Conversion_Transferred_Register(GebraBit_BME280 * BME280 );
 extern void GB_BME280_Turn_Humidity_OFF(GebraBit_BME280* BME280);
 extern void GB_BME280_Humidity_OverSampling(GebraBit_BME280* BME280 ,BME280_Sensor_Oversampling hum_over);
 extern void GB_BME280_Turn_Temperature_OFF(GebraBit_BME280* BME280);
 extern void GB_BME280_Temperature_OverSampling(GebraBit_BME280* BME280 ,BME280_Sensor_Oversampling temp_over);
 extern void GB_BME280_Turn_Pressure_OFF(GebraBit_BME280* BME280);
 extern void GB_BME280_Pressure_OverSampling(GebraBit_BME280* BME280 ,BME280_Sensor_Oversampling press_over);
 extern void GB_BME280_Power_Mode(GebraBit_BME280* BME280 ,BME280_Power_Mode pmode);
 extern void GB_BME280_Inactive_Duration(GebraBit_BME280 * BME280 , BME280_Inactive_Duration dur ) ;
 extern void GB_BME280_IIR_Filter_Coefficient (GebraBit_BME280 * BME280 , BME280_IIR_Filter_Coefficient filter);
 extern void GB_BME280_Power_Mode(GebraBit_BME280* BME280 ,BME280_Power_Mode pmode);
 extern void GB_BME280_Calculate_Calibration_Coefficients(GebraBit_BME280 * BME280) ;
 extern void GB_BME280_Twos_Complement_Converter(int32_t *value, uint8_t length) ;
 extern void GB_BME280_Compensate_Temperature(GebraBit_BME280 * BME280) ;
 extern void GB_BME280_Compensate_Pressure(GebraBit_BME280 * BME280) ;
 extern void GB_BME280_Compensate_Humidity(GebraBit_BME280 * BME280);

 /********************************************************
  *          Declare BME280 DATA Functions               *
  ********************************************************/
 extern void GB_BME280_Get_Register_Raw_Pressure_Temperature_Humidity(GebraBit_BME280 * BME280 );
 extern void GB_BME280_Altitude(GebraBit_BME280 * BME280);
 extern void GB_BME280_Get_Data(GebraBit_BME280 * BME280 );
 /********************************************************
  *          Declare BME280 HIGH LEVEL Functions       *
  ********************************************************/
 extern void GB_BME280_initialize( GebraBit_BME280 * BME280 );
 extern void GB_BME280_Configuration(GebraBit_BME280 * BME280);

Gebra_ BME280.cpp kaynak dosyası

C++ dilinde yazılmış olan bu dosyada, tüm fonksiyonlar en ince ayrıntısına kadar yorum satırına alınmış ve fonksiyonların argümanlarında alınan tüm parametreler ve bunların döndürdüğü değerler açıkça açıklanmıştır, bu nedenle sadece açıklamalarla yetiniyoruz ve kullanıcıları daha fazla bilgi için doğrudan bu dosyayı incelemeye davet ediyoruz.

Arduino’da örnek program

Modülü Arduino’ya bağladıktan ve kütüphaneyi IDE’ye ekledikten sonra şu yola gidin: Dosya > Örnekler > Gebra_BME280 > temp-hum-pre

Örnek dosyanın açıklaması

Dosyanın başında, Gebra BME280 modülü için gerekli yapılara, enumlara ve işlevlere erişim sağlamak için Gebra_BME280.h başlığını bulacaksınız. Ayrıca, modülün çalışması için gerekli öğeler bu yapılara eklenmiştir. Daha sonra Gebra BME280 modülünü yapılandırmak için Gebra_BME280 yapı türünden BME280 adlı bir değişken (Gebra_BME280 başlığında tanımlanmış ve kütüphanenin açıklama bölümünde ayrıntılı olarak açıklanmıştır) bildirilir.

C
GebraBit_BME280 BME280;

Yazılı kodun bir sonraki kısmında, GB_BME280_initialize (&BME280) ve GB_BME280_Configuration (&BME280) fonksiyonlarını kullanarak Gebra BME280 modülünü ayarlıyoruz ve son olarak programın döngü kısmında sensörden veriler okunarak sürekli olarak BME280 değerleri alınıyor:

C
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);
}

Örnek dosya kod metni:

C
#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);
}

Arduino’nuzu bilgisayara bağlayın ve Arduino Kartınızı seçin

Ardından Örnek kodu doğrulayın ve yükleyin

Kodu yükledikten sonra seri monitörünü açın ve BME280 değerlerini görebilirsiniz.

Yorum ve puanlarınızla Gebra ekibinin kaliteyi artırmasına yardımcı olun

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Alışveriş Sepeti
Scroll to Top