STM32F303 ile SGP41 Hava Kalitesi Sensörü projesi

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İ DONANIMGEREKLİ YAZILIM
ST-LINK/V2 ProgrammerKeil 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:

C
/************************************************
 *              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:

C
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:

C
typedef enum Activity 
{
  NOT_DONE = 0,
  DONE     = 1
} SGP41_Activity;

SGP41_Command Enum

The values of this enum are used to execute sensor commands:

C
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:

C
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.

C
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:

C
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:

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