一、項目功能介紹
當前介紹基于STM32F103ZCT6芯片設(shè)計的環(huán)境溫度與濕度檢測系統(tǒng)設(shè)計過程。當前系統(tǒng)通過SHT30溫濕度傳感器采集環(huán)境溫度和濕度數(shù)據(jù),并通過模擬IIC時序協(xié)議將數(shù)據(jù)傳輸?shù)絊TM32芯片上。然后,STM32芯片通過處理這些數(shù)據(jù)并將它們顯示在0.91寸OLED顯示屏上,以便用戶能夠方便地觀察環(huán)境溫度和濕度的變化情況。
系統(tǒng)的主控芯片采用了STM32F103ZCT6,這是一款高性能的32位ARM Cortex-M3微控制器,具有豐富的外設(shè)和存儲器資源,可滿足各種應(yīng)用的需求。溫濕度檢測傳感器采用了SHT30,這是一款高精度的數(shù)字式溫濕度傳感器,具有快速響應(yīng)、低功耗、高可靠性等特點。
為了實現(xiàn)數(shù)據(jù)的顯示,系統(tǒng)采用了0.91寸OLED顯示屏,驅(qū)動芯片是SSD1306,接口是IIC協(xié)議。OLED顯示屏也是通過模擬IIC時序進行驅(qū)動,這種方式具有簡單、可靠、低功耗等優(yōu)點。
(1)開發(fā)板連接SHT30實物圖
(2)OLED顯示屏
(3)測量的溫度濕度串口打印
二、設(shè)計思路
2.1 系統(tǒng)硬件設(shè)計
主控芯片采用STM32F103ZCT6,該芯片具有72MHz主頻,具有豐富的外設(shè)資源,包括多個定時器、多個串口、多個I2C接口等。溫濕度傳感器采用IIC接口的SHT30,該傳感器具有高精度、低功耗、數(shù)字輸出等特點,可提供溫度和濕度數(shù)據(jù)。OLED顯示屏采用0.91寸OLED顯示屏,驅(qū)動芯片是SSD1306,接口也是是IIC協(xié)議。
2.2 系統(tǒng)軟件設(shè)計
系統(tǒng)軟件設(shè)計采用STM32CubeMX和Keil MDK-ARM工具進行開發(fā)。
實現(xiàn)步驟:
(1)使用STM32CubeMX進行芯片引腳配置和初始化代碼生成。
(2)編寫SHT30溫濕度傳感器的IIC通信驅(qū)動程序。
(3)編寫SSD1306 OLED顯示屏的IIC通信驅(qū)動程序。
(4)編寫溫濕度檢測程序,通過SHT30傳感器讀取溫度和濕度數(shù)據(jù),并將數(shù)據(jù)顯示在OLED顯示屏上。
(5)編寫主程序,將以上各個程序整合在一起,并進行系統(tǒng)初始化和數(shù)據(jù)處理。
2.3 系統(tǒng)實現(xiàn)
(1)系統(tǒng)硬件實現(xiàn)
系統(tǒng)硬件實現(xiàn)包括主控板、SHT30傳感器模塊和OLED顯示屏模塊。主控板上連接了STM32F103ZCT6主控芯片和IIC總線電路,SHT30傳感器模塊和OLED顯示屏模塊通過IIC總線連接到主控板上。
(2)系統(tǒng)軟件實現(xiàn)
系統(tǒng)軟件實現(xiàn)主要包括SHT30傳感器的IIC通信驅(qū)動程序、SSD1306 OLED顯示屏的IIC通信驅(qū)動程序、溫濕度檢測程序和主程序。其中,SHT30傳感器的IIC通信驅(qū)動程序和SSD1306 OLED顯示屏的IIC通信驅(qū)動程序都是基于STM32的硬件IIC接口實現(xiàn)的,溫濕度檢測程序通過SHT30傳感器讀取溫度和濕度數(shù)據(jù),并將數(shù)據(jù)顯示在OLED顯示屏上。主程序?qū)⒁陨细鱾€程序整合在一起,并進行系統(tǒng)初始化和數(shù)據(jù)處理。
三、代碼實現(xiàn)
3.1 主程序代碼
以下是基于STM32設(shè)計的環(huán)境溫度與濕度檢測系統(tǒng)的主函數(shù)main.c的代碼實現(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);
}
}