一、項(xiàng)目功能介紹
當(dāng)前介紹基于STM32F103ZCT6芯片設(shè)計(jì)的環(huán)境溫度與濕度檢測(cè)系統(tǒng)設(shè)計(jì)過程。當(dāng)前系統(tǒng)通過SHT30溫濕度傳感器采集環(huán)境溫度和濕度數(shù)據(jù),并通過模擬IIC時(shí)序協(xié)議將數(shù)據(jù)傳輸?shù)絊TM32芯片上。然后,STM32芯片通過處理這些數(shù)據(jù)并將它們顯示在0.91寸OLED顯示屏上,以便用戶能夠方便地觀察環(huán)境溫度和濕度的變化情況。
系統(tǒng)的主控芯片采用了STM32F103ZCT6,這是一款高性能的32位ARM Cortex-M3微控制器,具有豐富的外設(shè)和存儲(chǔ)器資源,可滿足各種應(yīng)用的需求。溫濕度檢測(cè)傳感器采用了SHT30,這是一款高精度的數(shù)字式溫濕度傳感器,具有快速響應(yīng)、低功耗、高可靠性等特點(diǎn)。
為了實(shí)現(xiàn)數(shù)據(jù)的顯示,系統(tǒng)采用了0.91寸OLED顯示屏,驅(qū)動(dòng)芯片是SSD1306,接口是IIC協(xié)議。OLED顯示屏也是通過模擬IIC時(shí)序進(jìn)行驅(qū)動(dòng),這種方式具有簡(jiǎn)單、可靠、低功耗等優(yōu)點(diǎn)。
(1)開發(fā)板連接SHT30實(shí)物圖

(2)OLED顯示屏




(3)測(cè)量的溫度濕度串口打印

二、設(shè)計(jì)思路
2.1 系統(tǒng)硬件設(shè)計(jì)
主控芯片采用STM32F103ZCT6,該芯片具有72MHz主頻,具有豐富的外設(shè)資源,包括多個(gè)定時(shí)器、多個(gè)串口、多個(gè)I2C接口等。溫濕度傳感器采用IIC接口的SHT30,該傳感器具有高精度、低功耗、數(shù)字輸出等特點(diǎn),可提供溫度和濕度數(shù)據(jù)。OLED顯示屏采用0.91寸OLED顯示屏,驅(qū)動(dòng)芯片是SSD1306,接口也是是IIC協(xié)議。
2.2 系統(tǒng)軟件設(shè)計(jì)
系統(tǒng)軟件設(shè)計(jì)采用STM32CubeMX和Keil MDK-ARM工具進(jìn)行開發(fā)。
實(shí)現(xiàn)步驟:
(1)使用STM32CubeMX進(jìn)行芯片引腳配置和初始化代碼生成。
(2)編寫SHT30溫濕度傳感器的IIC通信驅(qū)動(dòng)程序。
(3)編寫SSD1306 OLED顯示屏的IIC通信驅(qū)動(dòng)程序。
(4)編寫溫濕度檢測(cè)程序,通過SHT30傳感器讀取溫度和濕度數(shù)據(jù),并將數(shù)據(jù)顯示在OLED顯示屏上。
(5)編寫主程序,將以上各個(gè)程序整合在一起,并進(jìn)行系統(tǒng)初始化和數(shù)據(jù)處理。
2.3 系統(tǒng)實(shí)現(xiàn)
(1)系統(tǒng)硬件實(shí)現(xiàn)
系統(tǒng)硬件實(shí)現(xiàn)包括主控板、SHT30傳感器模塊和OLED顯示屏模塊。主控板上連接了STM32F103ZCT6主控芯片和IIC總線電路,SHT30傳感器模塊和OLED顯示屏模塊通過IIC總線連接到主控板上。
(2)系統(tǒng)軟件實(shí)現(xiàn)
系統(tǒng)軟件實(shí)現(xiàn)主要包括SHT30傳感器的IIC通信驅(qū)動(dòng)程序、SSD1306 OLED顯示屏的IIC通信驅(qū)動(dòng)程序、溫濕度檢測(cè)程序和主程序。其中,SHT30傳感器的IIC通信驅(qū)動(dòng)程序和SSD1306 OLED顯示屏的IIC通信驅(qū)動(dòng)程序都是基于STM32的硬件IIC接口實(shí)現(xiàn)的,溫濕度檢測(cè)程序通過SHT30傳感器讀取溫度和濕度數(shù)據(jù),并將數(shù)據(jù)顯示在OLED顯示屏上。主程序?qū)⒁陨细鱾€(gè)程序整合在一起,并進(jìn)行系統(tǒng)初始化和數(shù)據(jù)處理。
三、代碼實(shí)現(xiàn)
3.1 主程序代碼
以下是基于STM32設(shè)計(jì)的環(huán)境溫度與濕度檢測(cè)系統(tǒng)的主函數(shù)main.c的代碼實(shí)現(xiàn):
#include "stm32f10x.h"
#include "systick.h"
#include "sht30.h"
#include "i2c.h"
#include "oled.h"
?
#define OLED_ADDR 0x78
#define SHT30_ADDR 0x44
?
uint8_t oled_buf[128][8];
?
void show_temp_humi(float temp, float humi) {
char str[20];
int temp_int = (int)(temp * 10);
int humi_int = (int)(humi * 10);
sprintf(str, "Temp: %d.%d C", temp_int / 10, temp_int % 10);
oled_show_chinese16x16(0, 0, oled_buf, "溫度");
oled_show_chinese16x16(32, 0, oled_buf, ":");
oled_show_string16x16(48, 0, oled_buf, str);
sprintf(str, "Humi: %d.%d %%", humi_int / 10, humi_int % 10);
oled_show_chinese16x16(0, 2, oled_buf, "濕度");
oled_show_chinese16x16(32, 2, oled_buf, ":");
oled_show_string16x16(48, 2, oled_buf, str);
oled_refresh(0, 7, oled_buf);
}
?
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
?
i2c_init();
systick_init(72);
sht30_init(SHT30_ADDR);
?
oled_init();
?
while(1)
{
float temp, humi;
sht30_read_temp_humi(&temp, &humi);
show_temp_humi(temp, humi);
delay_ms(1000);
}
}
基于STM32+SHT30設(shè)計(jì)的環(huán)境溫度與濕度檢測(cè)系統(tǒng)(IIC模擬時(shí)序)