Bu projenin amacı nedir?
Bu projenin amacı, çeşitli ortamlarda atmosfer basıncını ve irtifayı ölçmek ve izlemek için BMP390 barometrik basınç sensörünü bir Arduino ile arayüzlemektir. Sensör, hava tahmini, irtifa takibi ve çevresel izleme gibi uygulamalar için uygun hale getirerek doğru basınç okumaları sağlar. Kullanıcılar, atmosferik verileri gerçek zamanlı okuyarak, çevresel veri toplamada gelişmiş kullanılabilirlik ve hassasiyet için değişen irtifa ve basınç koşullarına yanıt veren sistemler geliştirebilirler.
Bu eğitimde neler öğreneceğiz?
- BMP390 sensörünü Arduino’ya bağlayın ve SPI iletişimini kurun.
- Mevcut bir kütüphaneyi Arduino ile uyumlu olacak şekilde değiştirin ve SPI veri işleme konusundaki anlayışınızı derinleştirin.
- Sensör kullanarak barometrik basınç ve yükseklik verilerini okuyun ve verileri pratik uygulamalar için yorumlayın.
- Çevresel izleme ve yükseklik takibi için sensör tabanlı projeler uygulayın , atmosferik basınç ölçümlerine dayalı duyarlı sistemler oluşturmak için pratik 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İ DONANIM | GEREKLİ YAZILIM |
---|---|
Arduino Programmer | Arduino IDE – (Nasıl kurulur ?) |
Arduino Development Board- ( Arduino UNO ) | |
Gebra BMP390 Dijital 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 BMP390 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:
/************************************************
* USER BANK 0 REGISTER MAP *
***********************************************/
#define BMP390_CHIP_ID_VALUE (0x60)
#define BMP390_CHIP_ID (0x00)
#define BMP390_REV_ID (0x01)
#define BMP390_ERR_REG (0x02)
#define BMP390_STATUS (0x03)
#define BMP390_PRESSURE_DATA_0 (0x04)
#define BMP390_PRESSURE_DATA_1 (0x05)
#define BMP390_PRESSURE_DATA_2 (0x06)
#define BMP390_TEMPERATURE_DATA_3 (0x07)
#define BMP390_TEMPERATURE_DATA_4 (0x08)
#define BMP390_TEMPERATURE_DATA_5 (0x09)
#define BMP390_SENSORTIME_0 (0x0C)
#define BMP390_SENSORTIME_1 (0x0D)
#define BMP390_SENSORTIME_2 (0x0E)
#define BMP390_EVENT (0x10)
#define BMP390_INT_STATUS (0x11)
#define BMP390_FIFO_LENGTH_0 (0x12)
#define BMP390_FIFO_LENGTH_1 (0x13)
#define BMP390_FIFO_DATA (0x14)
#define BMP390_FIFO_WTM_0 (0x15)
#define BMP390_FIFO_WTM_1 (0x16)
#define BMP390_FIFO_CONFIG_1 (0x17)
#define BMP390_FIFO_CONFIG_2 (0x18)
#define BMP390_INT_CTRL (0x19)
#define BMP390_IF_CONF (0x1A)
#define BMP390_PWR_CTRL (0x1B)
#define BMP390_OSR (0X1C)
#define BMP390_ODR (0x1D)
#define BMP390_CONFIG (0x1F)
#define BMP390_CALIB_DATA (0x31)
#define BMP390_CMD (0x7E)
/*----------------------------------------------*
* USER REGISTER MAP End *
*----------------------------------------------*/
Error_Condition Enum
Sensor errors are defined in this enum:
typedef enum Error_Condition
{
FATAL_ERR = 1 ,
CMD_ERR = 2 ,
CONF_ERR = 4
}BMP390_Error_Condition;
Sensor_Status Enum
The sensor performance status is defined in this enum:
typedef enum Sensor_Status
{
CMD_RDY = 0x10 ,
DRDY_PRESS = 0x20 ,
DRDY_TEMP = 0x40
}BMP390_Sensor_Status;
Interrupt_Status Enum
The occurred interrupt type is defined in this enum:
typedef enum Interrupt_Status
{
FIFO_WATERMARK_INTERRUPT = 0x01 ,
FIFO_FULL_INTERRUPT = 0x02 ,
DATA_READY_INTERRUPT = 0x08
}BMP390_Interrupt_Status
Data_Select Enum
Using this Enum, it is determined whether the output data is filtered or not:
typedef enum Data_Select
{
UNFILTERED_DATA = 0 ,
FILTERED_DATA
}BMP390_Data_Select;
FIFO_Mode Enum
The values of this enum are used to define the measurement rate of sensor data values
typedef enum FIFO_Mode
{
STREAM_TO_FIFO = 0 ,
STOP_ON_FULL_FIFO_SNAPSHOT = 1
}BMP390_FIFO_Mode
BMP390_Ability Enum
The ability to activate or deactivate different parts of the sensor is defined in this enum:
typedef enum Ability
{
Disable = 0 ,
Enable
}BMP390_Ability;
BMP390_Power_Mode Enum
The values of this enum are used to select the sensor Power mode:
typedef enum Power_Mode
{
SLEEP_MODE = 0,
FORCED_MODE = 1,
NORMAL_MODE = 3
} BMP390_Power_Mode;
BMP390_Sensor_Oversampling Enum
The values of this enum are used to select oversampling of the sensor:
typedef enum Pressure_Oversampling
{
X1_NO_OVERSAMPLING = 0 ,
X2_OVERSAMPLING = 1 ,
X4_OVERSAMPLING = 2 ,
X8_OVERSAMPLING = 3 ,
X16_OVERSAMPLING = 4 ,
X32_OVERSAMPLING = 5
} BMP390_Sensor_Oversampling;
BMP390_Output_Data_Rate Enum
The values of this enum are used to select the sensor output data rate:
typedef enum Output_Data_Rate
{
ODR_200_HZ_5_mS = 0 ,
ODR_100_HZ_10_mS = 1 ,
ODR_50_HZ_20_mS = 2 ,
ODR_25_HZ_40_mS = 3 ,
ODR_12P5_HZ_80_mS = 4 ,
ODR_6P25_HZ_160_mS = 5 ,
ODR_3P1_HZ_320_mS = 6 ,
ODR_1P5_HZ_640_mS = 7 ,
ODR_0P78_HZ_1280_mS = 8 ,
ODR_0P39_HZ_2560_mS = 9 ,
ODR_0P2_HZ_5120_mS = 10 ,
ODR_0P1_HZ_10240_mS = 11 ,
ODR_0P05_HZ_20480_mS = 12 ,
ODR_0P02_HZ_40960_mS = 13 ,
ODR_0P01_HZ_81920_mS = 14 ,
ODR_0P006_HZ_163840_mS = 15 ,
ODR_0P003_HZ_327680_mS = 16 ,
ODR_0P0015_HZ_655360_mS = 17
} BMP390_Output_Data_Rate;
BMP390_IIR_Filter_Coefficient Enum
The values of this enum are used to select the appropriate sensor calibration coefficients values:
typedef enum IIR_Filter_Coefficient
{
FILTER_BYPASS_MODE = 0 ,
FILTER_COEFFICIENT_1 = 1 ,
FILTER_COEFFICIENT_3 = 2 ,
FILTER_COEFFICIENT_7 = 3 ,
FILTER_COEFFICIENT_15 = 4 ,
FILTER_COEFFICIENT_31 = 5 ,
FILTER_COEFFICIENT_63 = 6 ,
FILTER_COEFFICIENT_127 = 7
} BMP390_IIR_Filter_Coefficient;
BMP390_ FIFO_Header Enum
The values of this enum are used to select the data frame type in the FIFO header:
typedef enum FIFO_Header
{
FIFO_EMPTY_FRAME = 0x80 ,
FIFO_CONFIG_CHANGE = 0x48 ,
FIFO_ERROR_FRAME = 0x44 ,
FIFO_TIME_FRAME = 0xA0 ,
FIFO_PRESS_FRAME = 0x84 ,
FIFO_TEMP_FRAME = 0x90 ,
FIFO_TEMP_PRESS_FRAME = 0x94
} BMP390_FIFO_Header;
BMP390_Preparation Enum
The values of this enum determine whether the data is ready or not:
typedef enum Preparation
{
IS_Ready = 0 ,
IS_NOT_Ready
}BMP390_Preparation;
BMP390_ Get_DATA Enum
The values of this enum are used to determine how to receive sensor data:
typedef enum Get_DATA
{
FROM_REGISTER = 0 ,
FROM_FIFO
} BMP390_Get_DATA;
BMP390_Reset_Status Enum
The values of this enum determine whether the sensor is reset or not:
typedef enum
{
DONE = 0 ,
FAILED = 1
}BMP390_Reset_Status;
BMP390_ INT_Level Enum
The values of this enum are used to determine the basic logic level of Interrupt:
typedef enum int_level
{
ACTIVE_LOW = 0 ,
ACTIVE_ HIGH
} BMP390_INT_Level;
BMP390_ Latch_Type Enum
The values of this enum are used to determine the Interrupt output latch type:
typedef enum latch_type
{
NOT_LATCH = 0 ,
LATCH
} BMP390_Latch_Type;
BMP390_ INT_Type Enum
The values of this enum are used to determine the Interrupt output type:
typedef enum int_type
{
PUSH_PULL = 0 ,
OPEN_DRAIN
}BMP390_INT_Type;
BMP390 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 any time you want.
typedef struct BMP390
{
uint8_t REGISTER_CACHE;
BMP390_Get_DATA GET_DATA;
BMP390_Reset_Status RESET;
uint8_t DEVICE_ID;
uint8_t REVISION_ID;
BMP390_Sensor_Status SENSOR_STATUS;
BMP390_Error_Condition ERROR_CONDITION;
BMP390_Power_Mode POWER_MODE;
BMP390_Ability PRESSURE;
BMP390_Sensor_Oversampling PRESSURE_OVERSAMPLING;
BMP390_Ability TEMPERATURE;
BMP390_Sensor_Oversampling TEMPRATURE_OVERSAMPLING;
BMP390_Output_Data_Rate OUTPUT_DATA_RATE;
BMP390_Data_Select OUTPUT_DATA;
BMP390_IIR_Filter_Coefficient IIR_FILTER;
BMP390_Interrupt_Status INTERRUPT_STATUS;
BMP390_Ability DATA_READY_INT;
BMP390_INT_Level INT_PIN_LEVEL;
BMP390_INT_Type INT_PIN_TYPE;
BMP390_Latch_Type INT_PIN_LATCH;
BMP390_Ability FIFO;
BMP390_FIFO_Mode FIFO_MODE;
BMP390_Ability TEMP_TO_FIFO;
BMP390_Ability PRESS_TO_FIFO;
BMP390_Ability TIME_TO_FIFO;
uint16_t FIFO_DATA_BUFFER_SIZE;
uint8_t BYTE_QTY_IN_ONE_FIFO_PACKET;
uint8_t TOTAL_FIFO_PACKET;
BMP390_Ability FIFO_WATERMARK;
uint8_t FIFO_SUBSAMPLING;
uint16_t FIFO_LENGTH ;
BMP390_Ability FIFO_FULL_INT;
uint8_t CALIBRATION_DATA[CALIBRATION_DATA_BUFFER_SIZE];
double PAR_T1;
double PAR_T2;
double PAR_T3;
double PAR_P1;
double PAR_P2;
double PAR_P3;
double PAR_P4;
double PAR_P5;
double PAR_P6;
double PAR_P7;
double PAR_P8;
double PAR_P9;
double PAR_P10;
double PAR_P11;
uint8_t REGISTER_RAW_DATA_BUFFER[REGISTER_RAW_DATA_BYTE_QTY];
int32_t REGISTER_RAW_PRESSURE;
int32_t REGISTER_RAW_TEMPERATURE;
double COMPENSATED_TEMPERATURE;
double COMPENSATED_PRESSURE;
//double ALTITUDE;
uint8_t FIFO_DATA[FIFO_BUFFER_SIZE];
BMP390_FIFO_Header FIFO_HEADER[TOTAL_PACKET];
double COMPENSATED_FIFO_TEMPERATURE[TOTAL_PACKET];
double COMPENSATED_FIFO_PRESSURE[TOTAL_PACKET];
double FIFO_ALTITUDE[TOTAL_PACKET];
}GebraBit_BMP390;
Declaration of functions
At the end of this file, all the functions for reading and writing in BMP390 registers, sensor configuration and receiving data from the sensor are declared:
/********************************************************
*Declare Read&Write BMP390 Register Values Functions *
********************************************************/
extern uint8_t GB_BMP390_Read_Reg_Data ( uint8_t regAddr,uint8_t* data);
extern uint8_t GB_BMP390_Read_Reg_Bits (uint8_t regAddr,uint8_t start_bit, uint8_t len, uint8_t* data);
extern uint8_t GB_BMP390_Burst_Read(uint8_t regAddr,uint8_t *data, uint16_t byteQuantity);
extern uint8_t GB_BMP390_Write_Reg_Data(uint8_t regAddr, uint8_t data);
extern uint8_t GB_BMP390_Write_Reg_Bits(uint8_t regAddr, uint8_t start_bit, uint8_t len, uint8_t data);
extern uint8_t GB_BMP390_Burst_Write ( uint8_t regAddr,uint8_t *data, uint16_t byteQuantity);
/********************************************************
* Declare BMP390 Configuration Functions *
********************************************************/
extern void GB_BMP390_Soft_Reset ( GebraBit_BMP390 * BMP390 );
extern void GB_BMP390_Get_Device_ID(GebraBit_BMP390 * BMP390);
extern void GB_BMP390_Get_Revision_ID(GebraBit_BMP390 * BMP390);
extern void GB_BMP390_Temperature(GebraBit_BMP390* BMP390 ,BMP390_Ability temp);
extern void GB_BMP390_Pressure(GebraBit_BMP390 * BMP390 , BMP390_Ability press);
extern void GB_BMP390_Output_Sample_Rate (GebraBit_BMP390 * BMP390 , BMP390_Output_Data_Rate rate);
extern void GB_BMP390_IIR_Filter_Coefficient (GebraBit_BMP390 * BMP390 , BMP390_IIR_Filter_Coefficient filter) ;
extern void GB_BMP390_Check_Sensor_Status(GebraBit_BMP390 * BMP390 );
extern void GB_BMP390_Check_Error_Codition(GebraBit_BMP390 * BMP390 );
extern void GB_BMP390_Check_FIFO_Full_Interrupt_(GebraBit_BMP390 * BMP390 );
extern void GB_BMP390_Check_Data_Ready_Interrupt(GebraBit_BMP390 * BMP390 );
extern void GB_BMP390_Temperature_OverSampling(GebraBit_BMP390* BMP390 ,BMP390_Sensor_Oversampling temp_over) ;
extern void GB_BMP390_Pressure_OverSampling(GebraBit_BMP390* BMP390 ,BMP390_Sensor_Oversampling press_over);
extern void GB_BMP390_Power_Mode(GebraBit_BMP390* BMP390 ,BMP390_Power_Mode pmode);
extern void GB_BMP390_Set_INT_Pin(GebraBit_BMP390 * BMP390 , BMP390_INT_Level level ,BMP390_INT_Type type , BMP390_Latch_Type latch ) ;
extern void GB_BMP390_Data_Output_Select(GebraBit_BMP390 * BMP390 , BMP390_Data_Select data_sel) ;
extern void GB_BMP390_Data_Ready_Interrupt(GebraBit_BMP390 * BMP390 , BMP390_Ability data_ready_int);
extern void GB_BMP390_FIFO(GebraBit_BMP390 * BMP390 , BMP390_Ability fifo) ;
extern void GB_BMP390_FIFO_Full_Interrupt(GebraBit_BMP390 * BMP390 , BMP390_Ability fifo_full_int) ;
extern void GB_BMP390_Write_SensorTime_FIFO(GebraBit_BMP390 * BMP390 , BMP390_Ability time_fifo );
extern void GB_BMP390_Write_Pressure_FIFO(GebraBit_BMP390 * BMP390 , BMP390_Ability press_fifo );
extern void GB_BMP390_Write_Temperature_FIFO(GebraBit_BMP390 * BMP390 , BMP390_Ability temp_fifo );
extern void GB_BMP390_FIFO_Mode(GebraBit_BMP390 * BMP390 , BMP390_FIFO_Mode fifo_mode );
extern void GB_BMP390_FIFO_DownSampling(GebraBit_BMP390 * BMP390,uint8_t dwnsmple);
extern void GB_BMP390_FIFO_WATERMARK (GebraBit_BMP390 * BMP390,BMP390_Ability watermark , uint16_t wm);
extern void GB_BMP390_GET_FIFO_Length (GebraBit_BMP390 * BMP390 ) ;
extern void GB_BMP390_FIFO_Flush(GebraBit_BMP390 * BMP390 );
extern void GB_BMP390_Read_FIFO(GebraBit_BMP390 * BMP390 , uint16_t qty);
extern void GB_BMP390_FIFO_Configuration ( GebraBit_BMP390 * BMP390 , BMP390_FIFO_Ability fifo );
/********************************************************
* Declare BMP390 DATA Functions *
********************************************************/
extern void GB_BMP390_Get_Register_Raw_Pressure_Temperature(GebraBit_BMP390 * BMP390 ) ;
extern void GB_BMP390_Calculate_Compensated_Temperature(GebraBit_BMP390 * BMP390 , int32_t raw_temp , double * valid_temp ) ;
extern void GB_BMP390_Calculate_Compensated_Pressure(GebraBit_BMP390 * BMP390 , int32_t raw_press , double valid_temp ,double * valid_press );
extern void GB_BMP390_FIFO_Data_Partition_Pressure_Temperature(GebraBit_BMP390 * BMP390);
extern void GB_BMP390_Altitude(GebraBit_BMP390 * BMP390);
extern void GB_BMP390_Get_Data(GebraBit_BMP390 * BMP390 , BMP390_Get_DATA get_data);
/********************************************************
* Declare BMP390 HIGH LEVEL Functions *
********************************************************/
extern void GB_BMP390_Set_Power_Management(GebraBit_BMP390 * BMP390 , BMP390_Power_Mode pmode) ;
extern void GB_BMP390_initialize( GebraBit_BMP390 * BMP390 );
extern void GB_BMP390_Configuration(GebraBit_BMP390 * BMP390, BMP390_FIFO_Ability fifo);
Gebra_ BMP390.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_BMP390 > Temp-Press
Örnek dosyanın açıklaması
Dosyanın başında, Gebra BMP390 modülü için gerekli yapılara, enumlara ve işlevlere erişim sağlamak için Gebra_BMP390.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_BMP390 yapı türünden BMP390 adlı bir değişken (Gebra_BMP390 başlığında tanımlanmış ve kütüphanenin açıklama bölümünde ayrıntılı olarak açıklanmıştır) Gebra BMP390 modülünü yapılandırmak için bildirilir.
GebraBit_BMP390 BMP390;
Yazılı kodun bir sonraki bölümünde, Gebra BMP390 modülünü GB_BMP390_initialize (&BMP390) ve GB_BMP390_Configuration (&BMP390, FIFO_DISABLE) fonksiyonlarını kullanarak ayarlıyoruz ve yapılandırıyoruz:
void setup() {
Serial.begin(9600);
SPI.begin();
GB_BMP390_initialize( &BMP390 );
GB_BMP390_Configuration(&BMP390, FIFO_DISABLE) ;
}
void loop() {
GB_BMP390_Get_Data(&BMP390, FROM_REGISTER);
Serial.print("Compensated Temperature: ");
Serial.print(BMP390.COMPENSATED_TEMPERATURE);
Serial.println(" °C");
Serial.print("Compensated Pressure: ");
Serial.print(BMP390.COMPENSATED_PRESSURE);
Serial.println(" mBar");
delay(1000);
}
The Sample file code text:
#include "GebraBit_BMP390.h"
GebraBit_BMP390 BMP390;
void setup() {
Serial.begin(9600);
SPI.begin();
GB_BMP390_initialize( &BMP390 );
GB_BMP390_Configuration(&BMP390, FIFO_DISABLE) ;
}
void loop() {
GB_BMP390_Get_Data(&BMP390, FROM_REGISTER);
Serial.print("Compensated Temperature: ");
Serial.print(BMP390.COMPENSATED_TEMPERATURE);
Serial.println(" °C");
Serial.print("Compensated Pressure: ");
Serial.print(BMP390.COMPENSATED_PRESSURE);
Serial.println(" mBar");
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 SerialMonitor üzerinden BMP390 verilerini görebilirsiniz.