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);               //停止信号,传输结束
 }

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    49

    文章

    8833

    浏览量

    165607
  • 传感器
    +关注

    关注

    2577

    文章

    55459

    浏览量

    793770
  • STM32
    +关注

    关注

    2312

    文章

    11189

    浏览量

    374539
  • DS18B20
    +关注

    关注

    10

    文章

    782

    浏览量

    83504
  • 智能空调
    +关注

    关注

    0

    文章

    79

    浏览量

    6388
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    海信空调30周年:从“卖空调”到“经营空气价值”

    刚刚闭幕的AWE 2026展会上,家电行业智能浪潮席卷。当空调品牌都在讲智能,海信空调用2026世界杯定制新品给出不同答案——他们致力于让空调
    的头像 发表于 03-23 10:47 168次阅读
    海信<b class='flag-5'>空调</b>30周年:从“卖<b class='flag-5'>空调</b>”到“经营空气价值”

    语音空调技术方案:从“声控”到“感知”,HomeSense™ 引领空间智能新体验

    智能家居浪潮中,空调作为调节室内环境的核心设备,其智能化水平直接影响着用户的舒适度与体验。传统的语音控制空调,虽解放了双手,但往往停留在“单向指令”阶段,缺乏对环境与人的主动感知能力
    的头像 发表于 03-16 11:30 170次阅读

    空调控制器:以智能控制实现场景能效提升

    着运维人员。别担心,专为解决这类痛点,安科瑞推出了 AAC100系列空调控制器 ,用远程智能管控能力,成为公共建筑空调管理的“智慧管家”。 一控多能,给空调装上“智慧大脑” AAC10
    的头像 发表于 12-02 16:12 861次阅读
    <b class='flag-5'>空调</b>控制器:以<b class='flag-5'>智能</b>控制实现场景能效提升

    基于MM32 MCU系列微控制器的空调外机智能控制方案

    MCU微控制器为核心的智能方案逐渐成为主流。英尚微电子推出以灵动微MM32 MCU系列为主控的空调外机参考方案,旨在为空调系统提供更加智能化的控制方案。
    的头像 发表于 11-25 17:10 632次阅读

    基于 LORA 智能空调温控器的中央空调智能控制解决方案

    在商业写字楼、大型商场、酒店、医院等大型建筑中,中央空调系统是维持室内舒适环境的核心设备,但其传统运行模式长期面临能耗高、管理难、控制精度低等问题。随着 “双碳” 政策推进与智能化技术发展,中央空调
    的头像 发表于 11-21 17:19 984次阅读

    LORA智能空调温控器:远程操控分体空调,以精准批量控温升级管理效率

    一、行业背景与需求 分体空调因安装灵活、成本适中、适合小空间制冷制热等特点,广泛应用于家庭住宅、小型办公室、连锁便利店、公寓楼、小型商铺等场景。随着人们生活品质提升与智能化生活理念普及,传统分体空调
    的头像 发表于 11-21 17:18 864次阅读

    空调数据难统计?Lora无线远程中央空调控制器:智能联动+精准数据,运维更高效

    逐台巡检排查故障。 Lora 无线远程中央空调控制器的出现,通过 Lora 低功耗无线通信技术与物联网管控逻辑,让中央空调实现 远程调控、精准控温、智能节能,成为物联网时代空调管理的核
    的头像 发表于 11-19 17:19 910次阅读

    上海海思与海信空调携手推出首个支持星闪人感2.0的智能空调

    智能化浪潮席卷各行各业的今天,家电产业正迎来“功能型”向“智慧型”升级。空调作为家庭环境的核心设备,其智能感知和精准决策能力成为衡量智能化程度的重要指标。
    的头像 发表于 09-12 17:27 1759次阅读

    专用于智能空调的24G目标运动轨迹追踪雷达模块

    夏日炎炎,空调是必不可少的解暑圣器。随着科技的发展,智能空调出现,空调不再仅仅是普通的制冷,还需要满足人体在不同情况的风向、温度需求。海凌科新款LD2452雷达模块,是高精度多目标识别
    的头像 发表于 09-08 17:34 1355次阅读
    专用于<b class='flag-5'>智能</b><b class='flag-5'>空调</b>的24G目标运动轨迹追踪雷达模块

    芯海科技赋能鸿蒙智选MEIPONT智能空调 开启人感智能新时代

    2025年8月20日,MEIPONT美邦重磅推出智能空调新品“风神之眼”,标志着MEIPONT正式进军智能人感空调这一全新赛道。“风神之眼”凝聚了MEIPONT在制冷领域15年的技术积
    的头像 发表于 08-27 09:23 3574次阅读
    芯海科技赋能鸿蒙智选MEIPONT<b class='flag-5'>智能</b><b class='flag-5'>空调</b> 开启人感<b class='flag-5'>智能</b>新时代

    云知声携手TCL空调焕新智能家电体验

    空调开24度,新风打开”——刚打完篮球的小涛对着客厅远处的TCL空调发出指令,而空调无需联网仍精准执行操作。这一离线状态下的智能响应场景,正是TCL
    的头像 发表于 08-25 13:53 1356次阅读

    旋智科技家用分体空调电控设计方案

    在家用空调技术不断迭代的今天,旋智凭借强大的芯片研发与系统集成能力,推出了一套完整的家用分体空调电控设计方案。这套方案从硬件到软件,从基础功能到智能升级,全方位提升空调的性能与用户体验
    的头像 发表于 08-18 14:02 5494次阅读
    旋智科技家用分体<b class='flag-5'>空调</b>电控设计方案

    迪米科技红外测温技术在智能空调中的创新应用

    迪米空调测温模组是我司全新推出的智能温度感知解决方案。该模组搭载先进的 32×24 多点红外温度传感器阵列,能够非接触式、实时精准地测量目标物体表面温度分布。
    的头像 发表于 06-25 15:53 915次阅读
    迪米科技红外测温技术在<b class='flag-5'>智能</b><b class='flag-5'>空调</b>中的创新应用

    海尔中央空调如何接入米家智能

    教程贴 在智能化浪潮席卷现代生活的今天,人们对高效、智能、舒适及安全的居家环境愈发向往。想要将家中传统非智能家电升级为智能化、人性化的生活伴侣,从而享受节能健康的智慧生活吗?迈斯Pro
    的头像 发表于 05-22 16:35 3812次阅读
    海尔中央<b class='flag-5'>空调</b>如何接入米家<b class='flag-5'>智能</b>?

    达实智能和开立空调签署战略合作协议

    近日,达实智能和开利空调在高效暖通空调解决方案和绿色建筑行业发展等领域达成合作共识,于深圳达实智能大厦签署了战略合作协议。达实智能联合创始人
    的头像 发表于 05-12 14:33 1005次阅读