一、項(xiàng)目背景
隨著人們生活水平的不斷提高,對(duì)居住環(huán)境的舒適度要求也越來(lái)越高。空調(diào)作為一種重要的家電設(shè)備,已經(jīng)成為了現(xiàn)代家庭中必不可少的一部分。本文介紹了一種基于STM32的智能空調(diào)設(shè)計(jì)方案,可以自動(dòng)地根據(jù)環(huán)境溫度進(jìn)行溫度調(diào)節(jié)。
二、設(shè)計(jì)思路
2.1 整體構(gòu)架
智能空調(diào)系統(tǒng)由溫度檢測(cè)傳感器、微控制器、OLED顯示屏、按鍵及直流電源等組件構(gòu)成。傳感器用于檢測(cè)環(huán)境溫度,通過(guò)微控制器進(jìn)行處理后,將結(jié)果輸出到OLED顯示屏上展示。按鍵可根據(jù)需求調(diào)整預(yù)設(shè)閥值,切換模式等操作。
2.2 硬件設(shè)計(jì)
(1)溫度檢測(cè)傳感器
選擇DS18B20數(shù)字溫度傳感器作為本系統(tǒng)的溫度檢測(cè)器件。該傳感器具有精度高,響應(yīng)速度快等特點(diǎn),可以滿足該系統(tǒng)的檢測(cè)需求。
(2)微控制器
使用STM32F103系列的微控制器,在該控制器活躍的生態(tài)環(huán)境下,以及其先進(jìn)的處理能力,可以對(duì)信號(hào)進(jìn)行快速采集、處理和控制。
(3)OLED顯示屏
本系統(tǒng)使用的是一塊128 * 64 OLED顯示屏,顯示屏具有高亮度、高對(duì)比度和低功耗等優(yōu)點(diǎn),易于與STM32微控制器進(jìn)行通信。
2.3 軟件設(shè)計(jì)
在軟件設(shè)計(jì)方面,實(shí)現(xiàn)了溫度檢測(cè)傳感器數(shù)據(jù)的采集,使用處理算法對(duì)數(shù)據(jù)進(jìn)行處理,根據(jù)預(yù)設(shè)閥值自動(dòng)調(diào)節(jié)溫度,同時(shí)可以根據(jù)用戶需求,切換制冷、制熱和關(guān)閉等3種模式。最后,將結(jié)果通過(guò)OLED顯示屏進(jìn)行輸出。
三、代碼設(shè)計(jì)
3.1 DS18B20溫度檢測(cè)代碼
#include "main.h"
#include "delay.h"
?
#define GPIO_PORT_TEMP GPIOA //溫度數(shù)據(jù)引腳所在的端口
#define GPIO_PIN_TEMP GPIO_Pin_0 //溫度數(shù)據(jù)引腳所在的引腳編號(hào)
?
#define RCC_PORT_TEMPP RCC_APB2Periph_GPIOA // 溫度引腳所在端口時(shí)鐘號(hào)
?
void USART_SendByte( USART_TypeDef * pUSARTx, uint8_t ch );
?
void delay_us(uint32_t us){ // 延時(shí)us微秒函數(shù)
uint8_t i;
for(i=0;i< us;i++){
asm("nop");
}
}
?
float get_temp(){ // 獲取溫度函數(shù)
uint16_t temp;
uint8_t buf[2];
?
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_InitStruct;
?
RCC_APB2PeriphClockCmd(RCC_PORT_TEMPP,ENABLE);
?
//DATA拉低480us復(fù)位
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_PIN_TEMP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO_PORT_TEMP , &GPIO_InitStruct);
GPIO_ResetBits(GPIO_PORT_TEMP , GPIO_PIN_TEMP );
delay_us(500);
GPIO_SetBits(GPIO_PORT_TEMP , GPIO_PIN_TEMP );
delay_us(60);
?
//查詢DS18B20是否存在
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin = GPIO_PIN_TEMP;
GPIO_Init(GPIO_PORT_TEMP , &GPIO_InitStruct);
while (GPIO_ReadInputDataBit(GPIO_PORT_TEMP , GPIO_PIN_TEMP ) == RESET);
?
//通信開始
GPIO_ResetBits(GPIO_PORT_TEMP , GPIO_PIN_TEMP );
delay_us(480);
GPIO_SetBits(GPIO_PORT_TEMP , GPIO_PIN_TEMP );
delay_us(60);
?
//讀取溫度數(shù)據(jù)
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin = GPIO_PIN_TEMP ;
GPIO_Init(GPIO_PORT_TEMP , &GPIO_InitStruct);
delay_us(10);
if (GPIO_ReadInputDataBit(GPIO_PORT_TEMP , GPIO_PIN_TEMP ) == RESET){
temp |=0x01;
}
else{
temp &=0xfe;
}
delay_us(50);
if (GPIO_ReadInputDataBit(GPIO_PORT_TEMP , GPIO_PIN_TEMP ) == RESET){
temp |=0x02;
}
else{
temp &=0xfd;
}
delay_us(50);
if (GPIO_ReadInputDataBit(GPIO_PORT_TEMP , GPIO_PIN_TEMP ) == RESET){
temp |=0x04;
}
else{
temp &=0xfb;
}
delay_us(50);
if (GPIO_ReadInputDataBit(GPIO_PORT_TEMP , GPIO_PIN_TEMP ) == RESET){
temp |=0x08;
}
else{
temp &=0xf7;
}
delay_us(50);
if (GPIO_ReadInputDataBit(GPIO_PORT_TEMP , GPIO_PIN_TEMP ) == RESET){
temp |=0x10;
}
else{
temp &=0xef;
}
delay_us(50);
if (GPIO_ReadInputDataBit(GPIO_PORT_TEMP , GPIO_PIN_TEMP ) == RESET){
temp |=0x20;
}
else{
temp &=0xdf;
}
delay_us(50);
if (GPIO_ReadInputDataBit(GPIO_PORT_TEMP , GPIO_PIN_TEMP ) == RESET){
temp |=0x40;
}
else{
temp &=0xbf;
}
delay_us(50);
if (GPIO_ReadInputDataBit(GPIO_PORT_TEMP , GPIO_PIN_TEMP ) == RESET){
temp |=0x80;
}
else{
temp &=0x7f;
}
delay_us(50);
?
//讀取溫度小數(shù)點(diǎn)數(shù)據(jù)
if (GPIO_ReadInputDataBit(GPIO_PORT_TEMP , GPIO_PIN_TEMP ) == RESET){
buf[0