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