SHT35 Sensör Projesi
Bu projenin amacı nedir?
STM32F mikrodenetleyicisini kullanarak SHT35 sensörünün basit bir projesini yapacağız. projeyi daha kolay kurabilmek için Gebra SHT35 Nem ve Sıcaklık Sensör Modülü ve GebraBit STM32F303 olmak üzere iki hazır modül kullanıyoruz. Bu iki modül, işi kolaylaştırmak için GebraBit ekibi tarafından sağlanan SHT35 sensörü ve STM32F mikro denetleyicisinin gerekli minimum elemanlarını içerir.
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 SHT35 Nem ve Sıcaklık Sensör Modülü |
STM32CubeMX Ayarları
I2C ayarları
Gebra STM32F303 ile Gebra SHT35 I2C aracılığıyla iletişim kurmak için Connectivity->I2C kısmından Fast 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_SHT35.h başlık dosyası
Bu dosyada sensörün veya entegrenin veri sayfası baz alınarak tüm adres kayıtları, her kaydın değerleri “Numaralandırma” şeklinde tanımlanır. Ayrıca SHT35 sensörünün kasası ve SHT35 sensör iç bloklarının her birine ilişkin konfigürasyonlar GebraBit_SHT35 adı ile bir “STRUCT” şeklinde tanımlanmıştır. Son olarak Debug Session ortamında her blokla ilgili tüm konfigürasyonlar gerçek zamanlı olarak görülebilmektedir.
USER REGISTER MAP
The registry map or sensor commands are defined in this section:
/************************************************
* USER REGISTER MAP *
***********************************************/
#define SHT35_I2C &hi2c
#define SHT35_SOFT_RESET_TIME 5
#define SHT35_ADDRESS 0x44
#define SHT35_WRITE_ADDRESS ((SHT35_ADDRESS<<1)|0)
#define SHT35_READ_ADDRESS ((SHT35_ADDRESS<<1)|1)
#define SHT35_READOUT_PERIODIC_MEASUREMENT_RESULT 0xE000
#define SHT35_ART 0x2B32
#define SHT35_BREAK_STOP 0x3093
#define SHT35_SOFT_RESET 0x30A2
#define SHT35_HEATER_ON 0x306D
#define SHT35_HEATER_OFF 0x3066
#define SHT35_READOUT_STATUS_REGISTER 0xF32D
#define SHT35_CLEAR_STATUS_REGISTER 0x3041
/*----------------------------------------------*
* USER REGISTER MAP End *
*----------------------------------------------*/
SHT35_Ability Enum
The ability to activate or deactivate different parts of the sensor is defined in this enum:
typedef enum Ability
{
Disable = 0 ,
Enable
}SHT35_Ability;
SHT35_Single_Shot_Mode Enum
The values of this enum are used to select different sensor measurement modes in Single Shot mode:
typedef enum Single_Shot_Mode
{
SHT35_HIGH_REPEATABILITY_CLOCK_STRETCHING = 0x2C06 ,
SHT35_MEDIUM_REPEATABILITY_CLOCK_STRETCHING = 0x2C0D ,
SHT35_LOW_REPEATABILITY_CLOCK_STRETCHING = 0x2C10 ,
SHT35_HIGH_REPEATABILITY_NO_CLOCK_STRETCHING = 0x2400 ,
SHT35_MEDIUM_REPEATABILITY_NO_CLOCK_STRETCHING = 0x240B ,
SHT35_LOW_REPEATABILITY_NO_CLOCK_STRETCHING = 0x2416
}SHT35_Single_Shot_Mode;
SHT35_Periodic_Data_Acquisition_Mode Enum
The values of this enum are used to select different sensor data acquisition modes in periodic mode:
typedef enum Periodic_Data_Acquisition_Mode
{
SHT35_HIGH_REPEATABILITY_0P5_MPS_FREQUENCY = 0x2032 ,
SHT35_MEDIUM_REPEATABILITY_0P5_MPS_FREQUENCY = 0x2024 ,
SHT35_LOW_REPEATABILITY_0P5_MPS_FREQUENCY = 0x202F ,
SHT35_HIGH_REPEATABILITY_1_MPS_FREQUENCY = 0x2130 ,
SHT35_MEDIUM_REPEATABILITY_1_MPS_FREQUENCY = 0x2126 ,
SHT35_LOW_REPEATABILITY_1_MPS_FREQUENCY = 0x212D ,
SHT35_HIGH_REPEATABILITY_2_MPS_FREQUENCY = 0x2236 ,
SHT35_MEDIUM_REPEATABILITY_2_MPS_FREQUENCY = 0x2220 ,
SHT35_LOW_REPEATABILITY_2_MPS_FREQUENCY = 0x222B ,
SHT35_HIGH_REPEATABILITY_4_MPS_FREQUENCY = 0x2334 ,
SHT35_MEDIUM_REPEATABILITY_4_MPS_FREQUENCY = 0x2322 ,
SHT35_LOW_REPEATABILITY_4_MPS_FREQUENCY = 0x2329 ,
SHT35_HIGH_REPEATABILITY_10_MPS_FREQUENCY = 0x2737 ,
SHT35_MEDIUM_REPEATABILITY_10_MPS_FREQUENCY = 0x2721 ,
SHT35_LOW_REPEATABILITY_10_MPS_FREQUENCY = 0x272A
}SHT35_Periodic_Mode;
SHT35_ Command_Status Enum
To know the status of commands sent to the sensor, the values of this enum are used:
typedef enum Command_Status
{
LAST_COMMAND_PROCESSED = 0 ,
LAST_COMMAND_NOT_PROCESSED = 1
}SHT35_Command_Status;
SHT35_ Checksum_Status Enum
This enum is used to know the checksum status
typedef enum Checksum_Status
{
ECKSUM_CORRECT = 0 ,
LAST_WRITE_CHECKSUM_FAILED = 1
}SHT35_Checksum_Status;
SHT35_Measurement_Time Enum
This enum is used to choose when to convert data values
typedef enum Measurement_Time
{
HIGH_REPEATABILITY_15_mS = 15 ,
MEDIUM_REPEATABILITY_6_mS = 6 ,
LOW_REPEATABILITY_4_mS = 4 ,
}SHT35_Measurement_Time;
SHT35_ Heater Enum
Using this enum, the sensor internal heater is turned off or on:
typedef enum Heater
{
HEATER_ENABLE = SHT35_HEATER_ON ,
HEATER_DISABLE = SHT35_HEATER_OFF
}SHT35_Heater;
SHT35_Alert_Pending_Status Enum
Using this enum, the status of sensor notifications and warnings is checked:
typedef enum Alert_Pending_Status
{
NO_PENDING_ALERT = 0,
AT_LEAST_ONE_PENDING_ALERT = 1
} SHT35_Alert_Pending_Status;
SHT35_CRC_Status Enum
Using this enum, the status of the CRC check is specified
typedef enum CRC_Status
{
CRC_ERROR = 0 ,
CRC_OK
}SHT35_CRC_Status;
SHT35_Alert Enum
For sensor temperature and humidity alerts, this enum is used
typedef enum Alert
{
NO_ALERT = 0,
ALERT = 1
} SHT35_Alert;
SHT35_Reset_Status Enum
By using this enum, the sensor reset status is specified
typedef enum
{
NOT_DETECTED = 0 ,
DETECTED
}SHT35_Reset_Status;
SHT35 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 SHT35
{
uint8_t Register_Cache;
SHT35_Reset RESET;
uint16_t COMMAND;
SHT35_Single_Shot_Mode SINGLE_SHOT_MODE;
SHT35_Periodic_Mode PERIODIC_MODE;
SHT35_Measurement_Time MEASUREMENT_TIME;
HTU31D_Ability ART;
uint16_t STATUS_REGISTER;
SHT35_Alert_Pending_Status ALERT_PENDING;
SHT35_Heater ON_CHIP_HEATER;
SHT35_Alert HUMIDITY_ALERT;
SHT35_Alert TEMPERATURE_ALERT;
SHT35_Command_Status COMMAND_STATUS;
SHT35_Checksum_Status CHECKSUM;
uint8_t SHT35_CRC;
SHT35_CRC_Status CRC_CHECK;
uint8_t ADC_RAW_DATA[ADC_RAW_DATA_BUFFER_SIZE];
uint16_t RAW_TEMPERATURE;
uint16_t RAW_HUMIDITY;
float TEMPERATURE;
float HUMIDITY;
// double PARTIAL_PRESSURE;
// double DEW_POINT;
}GebraBit_SHT35;
Declaration of functions
At the end of this file, all the functions for reading and writing in SHT35 registers, sensor configuration and receiving data from the sensor are declared:
/********************************************************
* Declare Read&Write SHT35 Register Values Functions *
********************************************************/
extern void GB_SHT35_Write_Command(GebraBit_SHT35 * SHT35 , uint16_t cmd);
/********************************************************
* Declare MS5611 Configuration Functions *
********************************************************/
extern void GB_SHT35_Soft_Reset ( GebraBit_SHT35 * SHT35 ) ;
extern void GB_SHT35_CRC_Check( GebraBit_SHT35 * SHT35 , uint16_t value, uint8_t crc) ;
extern void GB_SHT35_On_Chip_Heater ( GebraBit_SHT35 * SHT35 , SHT35_Heater heater ) ;
extern void GB_SHT35_Read_Serial_Number ( GebraBit_SHT35 * SHT35 ) ;
extern void GB_SHT35_Read_Diagnostic ( GebraBit_SHT35 * SHT35 ) ;
extern void GB_SHT35_Configuration(GebraBit_SHT35 * SHT35) ;
extern void GB_SHT35_Start_Conversion ( GebraBit_SHT35 * SHT35 ) ;
extern void GB_SHT35_Read_Raw_Temperature_Humidity( GebraBit_SHT35 * SHT35 ) ;
extern void GB_SHT35_Temperature ( GebraBit_SHT35 * SHT35 ) ;
extern void GB_SHT35_Humidity ( GebraBit_SHT35 * SHT35 ) ;
extern void GB_SHT35_Dew_Point( GebraBit_SHT35 * SHT35 ) ;
extern void GB_SHT35_initialize( GebraBit_SHT35 * SHT35 ) ;
extern void GB_SHT35_Get_Data(GebraBit_SHT35 * SHT35);
“main.c” dosyasının açıklaması
GebraBit SHT35 modülü tarafından gerekli olan enum’lar ve fonksiyonlar yapılara eklendi. Bir sonraki bölümde, GebraBit_SHT35 yapı tipinin SHT35_Module adlı bir değişkeni (bu yapı GebraBit_SHT35 başlığındadır ve GebraBit_SHT35 kütüphane açıklama bölümünde açıklanmıştır) GebraBit SHT35 modülünün yapılandırması için tanımlanmıştır:
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
GebraBit_SHT35 SHT35_Module;
/* USER CODE END PTD */
kodun bir sonraki kısmında, GB_SHT35_initialize (&SHT35_Module) ve GB_SHT35_Configuration (&SHT35_Module) fonksiyonlarını kullanarak GebraBit SHT35 modülünü ayarlıyoruz ve son olarak programın while kısmında sensörden veriler okunarak nem ve sıcaklık değerleri sürekli olarak alınıyor:
/* USER CODE BEGIN 2 */
GB_SHT35_initialize(&SHT35_Module);
GB_SHT35_Configuration(&SHT35_Module);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
GB_SHT35_Get_Data(&SHT35_Module);
}
/* USER CODE END 3 */
}
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 “SHT35_Module”ü “watch” penceresine ekleyip programı çalıştırdığımızda GebraBit SHT35 modülünün nem ve sıcaklığındaki değişiklikleri görebiliriz: