Bu projenin amacı nedir?
Bu bölümde STM32F serisi ARM mikrodenetleyiciyi kullanarak SGP41-D-R4 sensörünün kurulumunu yapacağız. Bu projemizde daha rahat ve optimum şekilde kullanabilmek için GB605EN ve Gebra STM32F303 olmak üzere iki adet hazır modül kullanıyoruz.
Bu eğitimde ne öğreneceğiz?
Bu eğitimde, SGP41-D-R4 sensörünü kurmanın ve kullanmanın yanı sıra, tüm SGP41-D-R4 sensör kayıtlarını, STM32 mikro denetleyicinin çeşitli parçalarının bu sensörü kullanarak nasıl kurulacağını öğreneceksiniz. I2C protokolü, GB605EN modülüne özel kitaplığın ve sürücü dosyasının nasıl kullanılacağı. Ayrıca Keil derleyicisinde işlevlerin nasıl bildirileceğini ve son olarak sensör verilerinin nasıl alınacağını da öğreneceksiniz.
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 |
---|---|
ST-LINK/V2 Programmer | Keil uVision Programmer – (Nasıl kurulur ?) |
STM32 Microcontroller – ( Gebra STM32f303 ) | STM32CubeMX Program – (Nasıl kurulur ?) |
Gebra SGP41-D-R4 hava kalitesi modülü |
Öncelikle aşağıdaki görüntüde görüldüğü gibi GebraBit SGP41 modülünü GebraBit STM32F303 modülüne aşağıdaki şekilde bağlıyoruz:
STM32CubeMX ayarları
Aşağıda Gebra SGP41 modülünü geliştirmek için STM32F303 mikrodenetleyicisindeki “I2C”, “RCC”, “Debug” ve “Clock” bölümlerinin her birine ilişkin ayarları inceliyoruz.
I2C ayarları
Gebra STM32F303 ile Gebra SGP41-D-R4 I2C aracılığıyla iletişim kurmak için Connectivity->I2C kısmından Standart Mod‘u seçin ve PB8 ve PB9 pinlerini SCL ve SDA olarak seçin
Not: Eğer başka bir mikroişlemci kullanıyorsanız veya i2c için başka pin kullanmak istiyorsanız istediğiniz pine tıklayıp i2c1_scl , i2c1_sda pinleri seçebilirsiniz
RCC / Clock ayarları
Gebra STM32F303‘de harici kristalin (External Crystal) bulunması nedeniyle “RCC” kısmında “Crystal/Ceramic Resonator”i seçiyoruz:
Daha sonra Clock Configuration sayfasından PLLCLK modunu seçiyoruz ve diğer gereklı ayarları yapıyoruz (daha fazla bilgi için tıklayınız)
Debug & Programming ayarları
bu modülde Debug&Programming sırasında pin sayısını azaltmak için “SWCLK” ve “SWDIO” pinleri için “SYS” bloğunda “Debug” kısmından “Serial Wire” seçeneğini seçiyoruz.
Project Manager ayarları
“Project Manager” ayarları aşağıdaki gibidir, burada “MDK-ARM” versiyon “5.32” kullandık. eğer siz kodlamak için başka bir İDE kullanıyorsanız Toolchain seçeneğinden kullandığınız İDE’yi seçmeniz gerekecek
Yukarıdaki tüm ayarları tamamladıktan sonra GENERATE CODE seçeneğine tıklı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.
GebraBit_SGP41.h header file
In this file, based on the datasheet of the sensor or IC, all address registers, the values of each register are defined in the form of “Enumeration”. Also, the casing of the SGP41 sensor and the configurations related to each of the SGP41 sensor internal blocks are defined in the form of a “STRUCT” with the name GebraBit_ SGP41 Finally, in the Debug Session environment, all the configurations related to each block can be seen in real time.
USER REGISTER MAP
The registry map or sensor commands are defined in this section:
/************************************************
* USER REGISTER MAP *
***********************************************/
#define SGP41_I2C &hi2c1
#define SGP41_ADDRESS 0x59
#define SGP41_WRITE_ADDRESS ((SGP41_ADDRESS<<1)|0)
#define SGP41_READ_ADDRESS ((SGP41_ADDRESS<<1)|1)
#define SGP41_GET_SERIAL_NUMBER 0x3682
#define SGP41_PERFORM_SELF_TEST 0x280E
#define SGP41_EXECUTE_CONDITIONING 0x2612
#define SGP41_MEASURE_RAW_SIGNAL 0x2619
#define SGP41_TURN_HEATER_OFF 0x3615
SGP41_Ability Enum
This enum is used to activate and deactivate different parts of the sensor:
typedef enum Ability
{
Disable = 0 ,
Enable
}SGP41_Ability;
SGP41_Activity Enum
By using this enum, the status of performing an action in the sensor is determined:
typedef enum Activity
{
NOT_DONE = 0,
DONE = 1
} SGP41_Activity;
SGP41_Command Enum
The values of this enum are used to execute sensor commands:
typedef enum Command
{
GET_SERIAL_NUMBER = 0x3682 ,
PERFORM_SELF_TEST = 0x280E ,
EXECUTE_CONDITIONING = 0x2612 ,
MEASURE_RAW_SIGNAL = 0x2619 ,
TURN_HEATER_OFF = 0x3615
}SGP41_Command;
SGP41_CRC_Status Enum
To know the CRC status, the values of this Enum are used:
typedef enum CRC_Status
{
CRC_ERROR = 0 ,
CRC_OK
}SGP41_CRC_Status;
SGP41 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.
typedef struct SGP41
{
uint8_t REGISTER_CACHE;
uint8_t BUFFER[DATA_BUFFER_SIZE];
SGP41_Command COMMAND;
uint8_t CMD_BUFFER[CMD_BUFFER_SIZE];
uint16_t SERIAL_NUMBER1;
uint16_t SERIAL_NUMBER2;
uint16_t SERIAL_NUMBER3;
SGP41_Activity SELF_TEST;
SGP41_Ability HUMIDITY_COMPENSATION;
SGP41_Activity HEATER_OFF;
float COMPENSATION_HUMIDITY;
float COMPENSATION_TEMPERATURE;
uint16_t DEFAULT_HUMIDITY;
uint16_t DEFAULT_TEMPERATURE;
SGP41_Activity FACTORY_RESET;
uint8_t SGP41_CRC;
SGP41_CRC_Status CRC_CHECK;
uint16_t SRAW_VOC;
uint16_t SRAW_NOX;
int32_t VOC_INDEX_VALUE;
int32_t NOX_INDEX_VALUE;
}GebraBit_SGP41;
Declaration of functions
At the end of this file, all the functions for reading and writing in SGP41 registers, sensor configuration and receiving data from the sensor are declared:
extern void GB_SGP41_Send_Command(GebraBit_SGP41 * SGP41 , uint16_t cmd) ;
extern void GB_SGP41_Write_Data(GebraBit_SGP41 * SGP41 , uint16_t cmd , uint16_t data1 , uint16_t data2 ) ;
extern void GB_SGP41_Read_Data(GebraBit_SGP41 * SGP41 , uint8_t* buffer, uint16_t size) ;
extern void GB_SGP41_Delay_uSecond(uint32_t useconds) ;
extern void GB_SGP41_CRC_Generate(GebraBit_SGP41 * SGP41 ,const uint8_t* data, uint16_t count) ;
extern void GB_SGP41_CRC_Check(GebraBit_SGP41 * SGP41 ,const uint8_t* data,uint16_t count,uint8_t checksum) ;
extern void GB_SGP41_Get_Serial_Number(GebraBit_SGP41 * SGP41 ) ;
extern void GB_SGP41_Perform_Self_Test(GebraBit_SGP41 * SGP41 ) ;
extern void GB_SGP41_Turn_Heater_Off(GebraBit_SGP41 * SGP41 ) ;
extern void GB_SGP41_Deactivate_Humidity_Compensation (GebraBit_SGP41 * SGP41) ;
extern void GB_SGP41_Set_Compensation_Humidity_Temperature_Values(GebraBit_SGP41 * SGP41 , float humidity , float temp , SGP41_Ability Compensation ) ;
extern void GB_SGP41_Execute_Conditioning(GebraBit_SGP41 * SGP41) ;
extern void GB_SGP41_Measure_Raw_Signal(GebraBit_SGP41 * SGP41) ;
extern void GB_SGP41_initialize( GebraBit_SGP41 * SGP41 ) ;
extern void GB_SGP41_Configuration(GebraBit_SGP41 * SGP41, SGP41_Ability Compensation) ;
extern void GB_SGP41_Get_Data(GebraBit_SGP41 * SGP41) ;
GebraBit_SGP41.c source file
In this file, which is written in C language, all the functions are commented in full detail, and all the parameters received in the arguments of the functions and their return values are clearly explained so we confine to these explanations and invite users to check this file directly for more information.
STLINK V2
STM32CubeMX kullanarak Keil projesini oluşturup kütüphaneyi ekledikten sonra STLINKV2 adaptörünü kullanarak STLINK V2 programlayıcıyı Gebra STM32F303‘e bağlıyoruz.
STLINK V2 programlayıcısını Gebra STM32F303’e bağladığınızda, modüle güç vermeye gerek kalmaz çünkü besleme voltajını doğrudan STLINK V2 programlayıcısından alacak.
Sonra Build (F7) a tıklayıp Build Output penceresin olası hatalar için kontrol ediyoruz.
Son olarak “Debug” moduna girip “SGP41_Module” ü “watch” penceresine ekleyip programı çalıştırdığımızda GebraBit SGP41 modülünün VOC ve NOx değerlerindeki değişiklikleri görebiliriz: