在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于STM32設計的智能空調

DS小龍哥-嵌入式技術 ? 來源:DS小龍哥-嵌入式技術 ? 作者:DS小龍哥-嵌入式技 ? 2023-06-27 09:18 ? 次閱讀

一、項目背景

隨著人們生活水平的不斷提高,對居住環境的舒適度要求也越來越高。空調作為一種重要的家電設備,已經成為了現代家庭中必不可少的一部分。本文介紹了一種基于STM32智能空調設計方案,可以自動地根據環境溫度進行溫度調節。

image-20230618181209765

image-20230618181649941

二、設計思路

2.1 整體構架

智能空調系統由溫度檢測傳感器微控制器OLED顯示屏、按鍵及直流電源等組件構成。傳感器用于檢測環境溫度,通過微控制器進行處理后,將結果輸出到OLED顯示屏上展示。按鍵可根據需求調整預設閥值,切換模式等操作。

2.2 硬件設計

(1)溫度檢測傳感器

選擇DS18B20數字溫度傳感器作為本系統的溫度檢測器件。該傳感器具有精度高,響應速度快等特點,可以滿足該系統的檢測需求。

(2)微控制器

使用STM32F103系列的微控制器,在該控制器活躍的生態環境下,以及其先進的處理能力,可以對信號進行快速采集、處理和控制。

(3)OLED顯示屏

本系統使用的是一塊128 * 64 OLED顯示屏,顯示屏具有高亮度、高對比度和低功耗等優點,易于與STM32微控制器進行通信

2.3 軟件設計

在軟件設計方面,實現了溫度檢測傳感器數據的采集,使用處理算法對數據進行處理,根據預設閥值自動調節溫度,同時可以根據用戶需求,切換制冷、制熱和關閉等3種模式。最后,將結果通過OLED顯示屏進行輸出。

三、代碼設計

3.1 DS18B20溫度檢測代碼

#include "main.h"
 #include "delay.h"
 ?
 #define GPIO_PORT_TEMP     GPIOA        //溫度數據引腳所在的端口
 #define GPIO_PIN_TEMP      GPIO_Pin_0   //溫度數據引腳所在的引腳編號
 ?
 #define RCC_PORT_TEMPP     RCC_APB2Periph_GPIOA  // 溫度引腳所在端口時鐘
 ?
 void USART_SendByte( USART_TypeDef * pUSARTx, uint8_t ch );
 ?
 void delay_us(uint32_t us){     // 延時us微秒函數
     uint8_t i;
     for(i=0;i< us;i++){
         asm("nop");  
     }
 }
 ?
 float get_temp(){   // 獲取溫度函數
     uint16_t temp;
     uint8_t buf[2];
 ?
     GPIO_InitTypeDef GPIO_InitStruct;
     TIM_TimeBaseInitTypeDef TIM_InitStruct;
 ?
     RCC_APB2PeriphClockCmd(RCC_PORT_TEMPP,ENABLE);
 ?
     //DATA拉低480us復位
     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);                                   
 ?
     //讀取溫度數據
     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);
 ?
     //讀取溫度小數點數據
     if (GPIO_ReadInputDataBit(GPIO_PORT_TEMP , GPIO_PIN_TEMP ) == RESET){
         buf[0] |=0x01;
     }
     else{
         buf[0] &=0xfe;
     }
     delay_us(50);
     if (GPIO_ReadInputDataBit(GPIO_PORT_TEMP , GPIO_PIN_TEMP ) == RESET){
         buf[0] |=0x02;
     }
     else{
         buf[0] &=0xfd;
     }
     delay_us(50);
     if (GPIO_ReadInputDataBit(GPIO_PORT_TEMP , GPIO_PIN_TEMP ) == RESET){
         buf[0] |=0x04;
     }
     else{
         buf[0] &=0xfb;
     }
     delay_us(50);
     if (GPIO_ReadInputDataBit(GPIO_PORT_TEMP , GPIO_PIN_TEMP ) == RESET){
         buf[0] |=0x08;
     }
     else{
         buf[0] &=0xf7;
     }
     delay_us(50);
     if (GPIO_ReadInputDataBit(GPIO_PORT_TEMP , GPIO_PIN_TEMP ) == RESET){
         buf[0] |=0x10;
     }
     else{
         buf[0] &=0xef;
     }
     delay_us(50);
     if (GPIO_ReadInputDataBit(GPIO_PORT_TEMP , GPIO_PIN_TEMP ) == RESET){
         buf[0] |=0x20;
     }
     else{
         buf[0] &=0xdf;
     }
     delay_us(50);
     if (GPIO_ReadInputDataBit(GPIO_PORT_TEMP , GPIO_PIN_TEMP ) == RESET){
         buf[0] |=0x40;
     }
     else{
         buf[0] &=0xbf;
     }
     delay_us(50);
     if (GPIO_ReadInputDataBit(GPIO_PORT_TEMP , GPIO_PIN_TEMP ) == RESET){
         buf[0] |=0x80;
     }
     else{
         buf[0] &=0x7f;
     }
     delay_us(50);
 ?
     return (float)temp+((float)buf[0]/16.0);   // 將溫度整數位和小數位轉換為十進制
 }
 ?
 int main(void){
 ?
     char temp_buf[20];  // 接收溫度值的臨時緩沖區
 ?
     USART_InitTypeDef USART_InitStruct;
 ?
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);   
 ?
     USART_InitStruct.USART_BaudRate = 115200;
     USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
     USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
     USART_InitStruct.USART_Parity = USART_Parity_No;
     USART_InitStruct.USART_StopBits = USART_StopBits_1;
     USART_InitStruct.USART_WordLength = USART_WordLength_8b;
     USART_Init(USART1,&USART_InitStruct);
 ?
     USART_Cmd(USART1,ENABLE);
 ?
     while(1){
         float temp_get=get_temp();  // 獲取當前溫度值
         sprintf(temp_buf,"temp:%0.1f
",temp_get);  // 將溫度值格式化為字符串輸出
         for(int i=0;i< strlen(temp_buf);i++){  // 逐字符發送溫度值至串口
             USART_SendByte(USART1,temp_buf[i]); 
         }
         delay_ms(1000);  // 延時1s后再次獲取溫度值
     }
 }
 ?
 void USART_SendByte( USART_TypeDef * pUSARTx, uint8_t ch ){
     while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TXE) == RESET);     
     USART_SendData(pUSARTx,ch);
 }

3.2 OLED顯示屏代碼

#include "main.h"
 #include "delay.h"
 #include "oled.h"
 ?
 void iic_init(void);
 void GPIO_I2C_Delay(void);
 void write_com(unsigned char com);
 void write_data(unsigned char data);
 ?
 int main(void){
 ?
     unsigned char x,y;
     iic_init();  // 初始化IIC接口
     OLED_Init();  // 初始化OLED顯示屏
 ?
     while(1){
         OLED_ShowString(0,0,"1234");  // 在OLED顯示屏上顯示字符串“1234”
         delay_ms(500);  // 延時500ms
         OLED_Clear();  // 清空OLED顯示屏
     }
 }
 ?
 void iic_init(void){
     GPIO_InitTypeDef GPIO_InitStruct; 
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //GPIOB使能
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);  //I2C1使能
 ?
     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD;         //配置開漏輸出
     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOB, &GPIO_InitStruct); 
 ?
     I2C_InitTypeDef I2C_InitStruct; 
     I2C_DeInit(I2C1);
 ?
     I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;                             // I2C 模式
     I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;                     // 數傳比率 2
     I2C_InitStruct.I2C_OwnAddress1 = 0x00;                              // 地址1, 設備地址
     I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;                            // 開啟I2C應答機制
     I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //設備地址長度為 7 位
     I2C_InitStruct.I2C_ClockSpeed = 400000;                             // 時鐘速度為400kHz
     I2C_Cmd(I2C1, ENABLE);
 ?
     I2C_Init(I2C1, &I2C_InitStruct);
 }
 ?
 void GPIO_I2C_Delay(void){
     uint32_t i = 1000;
     while(i--);
 }
 ?
 void write_com(unsigned char com){
     while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));  //等待I2C總線空閑
     I2C_GenerateSTART(I2C1,ENABLE);               //發送起始信號
     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
     I2C_Send7bitAddress(I2C1,0x78,I2C_Direction_Transmitter);//選擇寫入模式,發送從機器OLED的地址0x78
     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
     I2C_SendData(I2C1,0x00);                      //發送控制字節0x00表示寫入指令
     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
     I2C_SendData(I2C1,com);                       //寫入要發送的指令
     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
     I2C_GenerateSTOP(I2C1,ENABLE);                //停止信號,傳輸結束
 }
 ?
 void write_data(unsigned char data){
     while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));  //等待I2C總線空閑
     I2C_GenerateSTART(I2C1,ENABLE);              //發送起始信號
     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
     I2C_Send7bitAddress(I2C1,0x78,I2C_Direction_Transmitter); //選擇寫入模式,發送從機器OLED的地址0x78  
     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
     I2C_SendData(I2C1,0x40);                     //發送控制字節0x40表示寫入數據
     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
     I2C_SendData(I2C1,data);                     //寫入要發送的數據
     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
     I2C_GenerateSTOP(I2C1,ENABLE);               //停止信號,傳輸結束
 }

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 微控制器
    +關注

    關注

    48

    文章

    7566

    瀏覽量

    151598
  • 傳感器
    +關注

    關注

    2551

    文章

    51207

    瀏覽量

    754529
  • STM32
    +關注

    關注

    2270

    文章

    10906

    瀏覽量

    356527
  • DS18B20
    +關注

    關注

    10

    文章

    779

    瀏覽量

    80943
  • 智能空調
    +關注

    關注

    0

    文章

    48

    瀏覽量

    6015
收藏 人收藏

    評論

    相關推薦

    空調語音控制方案WTK6900H語音識別芯片-讓空調聽得懂話,更智能

    隨著消費者對家居設備的智能化需求日益增長。空調作為家庭生活中不可或缺的電器設備,其操作便捷性和智能化程度直接影響到用戶的使用體驗。傳統的空調控制方式,如按鍵和遙控器,雖然在一定程度上滿
    的頭像 發表于 12-31 11:56 ?51次閱讀

    精密空調—如何輕松解決精密空調故障?

    精密空調作為數據中心、實驗室等關鍵場所的重要設備,精密空調穩定運行對于保障場所內的溫濕度環境至關重要。然而,由于設備長期運行、使用環境復雜等因素,精密空調難免會出現故障。下面聊一下精密空調
    的頭像 發表于 12-20 19:58 ?129次閱讀
    精密<b class='flag-5'>空調</b>—如何輕松解決精密<b class='flag-5'>空調</b>故障?

    ?智能空調控制器的應用場景與深遠意義?

    隨著科技的飛速發展,智能空調控制器正逐漸滲透到我們生活的方方面面,其應用場景日益豐富,意義深遠。無論是在學校教學樓教室、工廠宿舍,還是在銀行網點機房、公司部門辦公室、機房等場所,智能空調
    的頭像 發表于 12-13 15:24 ?328次閱讀

    精密空調—精密空調如何緊急維修?

    精密空調緊急情況: 異常噪音:精密空調運行時出現異常噪音,如摩擦聲、撞擊聲等。 溫度異常:室內溫度無法達到精密空調設定值,或溫度波動較大。 漏水現象:精密空調周圍出現漏水或滴水現
    的頭像 發表于 12-12 09:27 ?125次閱讀
    精密<b class='flag-5'>空調</b>—精密<b class='flag-5'>空調</b>如何緊急維修?

    變頻空調中的智能控制系統 如何判斷變頻空調的質量好壞

    在現代家居生活中,空調已成為不可或缺的一部分。隨著科技的發展,變頻空調因其節能和舒適的特性而越來越受到消費者的青睞。 一、變頻空調智能控制系統的基本原理 變頻
    的頭像 發表于 12-03 09:38 ?175次閱讀

    精密空調—機房精密空調結冰?這樣處理就對了

    機房精密空調結冰表現: 機房精密空調如果在運行過程中結冰直接會影響精密空調制冷效果和運行效率,甚至可能引發精密空調故障。精密空調結冰通常表
    的頭像 發表于 11-13 20:10 ?166次閱讀
    精密<b class='flag-5'>空調</b>—機房精密<b class='flag-5'>空調</b>結冰?這樣處理就對了

    精密空調選購秘籍:風冷精密空調還是水冷精密空調

    風冷精密空調與水冷精密空調是兩種常見的精密空調系統,它們在制冷原理和工作方式上有所不同。下面聊一下風冷精密空調與水冷精密空調的區別及工作原理
    的頭像 發表于 10-16 18:04 ?263次閱讀
    精密<b class='flag-5'>空調</b>選購秘籍:風冷精密<b class='flag-5'>空調</b>還是水冷精密<b class='flag-5'>空調</b>?

    機房精密空調智能大腦了解嗎?

    機房精密空調主控操作系統是用于控制和管理機房精密空調的重要系統。精密空調主控操作系統可以通過監控空調的運行狀態、調節溫度、濕度等參數,確保機房環境的穩定性和安全性。
    的頭像 發表于 10-12 18:18 ?175次閱讀
    機房精密<b class='flag-5'>空調</b>的<b class='flag-5'>智能</b>大腦了解嗎?

    精密空調冷凝風機的精準控制是怎么實現的?

    精密空調專用冷凝風機控制器系統采用先進的控制技術和智能化設計,實現對精密空調冷凝風機的精確控制,確保精密空調的穩定運行。
    的頭像 發表于 10-10 16:06 ?222次閱讀
    精密<b class='flag-5'>空調</b>冷凝風機的精準控制是怎么實現的?

    家居空調智能控制系統應用

    科技的日新月異,推動家居生活正逐步向智能化、便捷化邁進,空調智能控制系統作為智能家居的重要組成部分,正悄然改變著我們的生活方式,讓居家環境變得更加舒適、便捷與節能。 家居
    的頭像 發表于 09-12 17:39 ?357次閱讀

    智能空調監控系統功能介紹

    隨著科技的不斷發展,智能空調監控系統已經成為現代家居生活重要的組成部分,通過監控系統,用戶可以在任何時間、任何地點對空調進行操作,極大的提升了用戶的功能體驗。 一、概述 智能
    的頭像 發表于 08-19 14:42 ?367次閱讀

    智能聲控空調:置入NRK3301離線語音識別芯片 智能化家居新升級

    一、空調語音識別芯片開發背景在快節奏的生活中,人們越來越傾向于通過簡單的語音指令來控制家電設備,以節省時間和精力。空調作為調節室內溫度的重要工具,其智能化程度直接影響到用戶的居住體驗。因此,開發具有
    的頭像 發表于 07-24 08:07 ?354次閱讀
    <b class='flag-5'>智能</b>聲控<b class='flag-5'>空調</b>:置入NRK3301離線語音識別芯片 <b class='flag-5'>智能</b>化家居新升級

    中央空調智能調控系統功能特點與優勢

    為了進一步保障中央空調現場安全性,解決現場監測的局限性,中央空調智能調控系統正逐漸成為現代建筑不可或缺的一部分,遠程批量化調控室內環境,為用戶帶來了更加舒適、節能和環保的室內環境,打造智能
    的頭像 發表于 05-23 16:17 ?862次閱讀

    如何實現對空調狀態監測的監控

    隨著科技的飛速發展和人們生活水平的持續提高,空調已經成為現代家庭和辦公環境中不可或缺的一部分。然而,傳統的空調使用方式往往存在能效低下、操作不便等問題。為了解決這些問題,智能空調控制器
    的頭像 發表于 04-15 17:15 ?640次閱讀

    精密空調-如何快速定位精密空調故障?

    對精密空調用戶而言,精密空調設備出現故障是無法避免的。一旦精密空調設備出現故障,首先要做的就是要準確定位故障。一旦精密空調出現故障,絕大部分用戶首先做的事情就是聯系精密
    的頭像 發表于 01-26 09:56 ?470次閱讀
    精密<b class='flag-5'>空調</b>-如何快速定位精密<b class='flag-5'>空調</b>故障?
    主站蜘蛛池模板: 性夜影院爽黄e爽在线观看| xxxx69日本| 天堂网在线www资源网| 人人澡 人人澡 人人看| 免费午夜在线视频| se色成人亚洲综合| 中文字幕亚洲一区| 午夜爽视频| 亚洲欧美日韩动漫 | 夜夜爽天天操| 天天做天天做天天综合网| 免费午夜视频在线观看| 亚洲涩色| 高清一区二区三区视频| 色综久久| 国内黄色一级片| 天天综合天天综合| aa2424在线视频看片| 午夜免费网址| 网站在线你懂的| 你懂得在线播放| 又黄又湿又爽吸乳视频| 看片在线观看免费| 中文字幕区| 怡红院日本一道日本久久| 日本免费黄色片| 丁香六月婷婷精品免费观看| 思思99re66在线精品免费观看| 69国产成人精品午夜福中文| 欧洲亚洲一区| 四虎www成人影院观看| 精品一区二区三区免费爱 | 四虎黄色网址| 黄色的视频在线免费观看| 午夜影剧院| 五月丁香六月综合缴清无码| 成人综合婷婷国产精品久久免费| 日韩一级特黄毛片在线看| 成人欧美一区二区三区小说| 免费国产午夜高清在线视频| 爽好舒服快小柔小说|