基于STM32设计的智能空调

发布者:Yuexiang最新更新时间:2024-01-17 来源: elecfans关键字:STM32  智能空调  温度调节 手机看文章 扫描二维码
随时随地手机看文章

一、项目背景

随着人们生活水平的不断提高,对居住环境的舒适度要求也越来越高。空调作为一种重要的家电设备,已经成为了现代家庭中必不可少的一部分。本文介绍了一种基于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);

[1] [2]
关键字:STM32  智能空调  温度调节 引用地址:基于STM32设计的智能空调

上一篇:STM32入门篇—ADC教程
下一篇:如何快速上手STM32学习?

推荐阅读最新更新时间:2024-10-31 15:45

再造STM32---第十二部分:启动文件详解
本章参考资料《STM32F4xx 中文参考手册》第十章-中断和事件:表 46.STM32F42xxx 和 STM32F43xxx 的向量表; MDK 中的帮助手册—ARM Development Tools:用来查询 ARM 的汇编指令和编译器相关的指令。 12.1 启动文件简介: 启动文件由汇编编写,是系统上电复位后第一个执行的程序。主要做了以下工作: 1、 初始化堆栈指针 SP=_initial_sp 2、 初始化 PC 指针=Reset_Handler 3、 初始化中断向量表 4、 配置系统时钟 5、 调用 C 库函数_main 初始化用户堆栈,
[单片机]
再造STM32---第十二部分:启动文件详解
基于STM32的数字示波器设计与实现
0 引言 随着集成电路的发展和数字信号处理技术的采用,数字示波器已成为集显示、测量、运算、分析、记录等各种功能于一体的智能化测量仪器。数字示波器在性能上也逐渐超越模拟示波器,并有取而代之的趋势。与模拟示波器相比,数字示波器不仅具有可存储波形、体积小、功耗低,使用方便等优点,而且还具有强大的信号实时处理分析功能。因此,数字示波器的使用越来越广泛。目前我国国内自主研发的高性能数字示波器还是比较少,广泛使用的仍是国外产品。因此,有必要对高性能数字示波器进行广泛和深入研究。本文通过采用高速高性能器件,设计了一实时采样率为60 Msa/s的宽带数字示波器。 1 数字示波器的性能参数设计 数字存储示波器的指标很多,包括采样率、带宽、灵敏
[单片机]
基于<font color='red'>STM32</font>的数字示波器设计与实现
STM32】DMA—直接存储器存取(原理篇)
一、DMA是什么? 直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。FLASH、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标! 二、DMA的工作原理是什么? 1.DMA的工作流程分析 在发生一个事件后,外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求。当DMA控制器开始
[单片机]
嵌入式编程(以STM32为例)中的volatile,const意义及应用场景
__I、 __O 、__IO是什么意思? 这是ST库里面的 宏定义 ,定义如下: #define __I volatile const /*! defines 'read only' permissions */ #define __O volatile /*! defines 'write only' permissions */ #define __IO volatile /*! defines 'read / write' permissions */ 显然,这三个宏定义都是用来替换成 volati
[单片机]
基于STM32的重力感应无线智能遥控小车设计
引言 随着社会进步,电子消费产品的需求越来越高,遥控智能车辆以及在智能化车辆基础上开发出来的产品已广泛应用到自动化物流运输等领域。目前,遥控智能车辆大多采用无线传输方式,而无线传输逐渐取代有线传输不仅是因为“无线”,更因为在安装、增减节点方面都比有线方式方便、快捷,因此得到了广泛的应用。 本设计首先采集手持遥控端的倾角信息并进行处理、生成指令,然后无线发送给智能小车,赋予智能小车更灵活的运动状态和更宽广的运动范围。设计灵活,操作方便,控制稳定,制作成本低,可应用于视线可观察但人体涉及不到的区域,可制作成高端智能玩具,或应用于工业控制,与实际相结合,有良好的现实意义和市场经济价值。 1、系统硬件电路设计 采用整体设计的方法进行
[单片机]
基于<font color='red'>STM32</font>的重力感应无线<font color='red'>智能</font>遥控小车设计
STM32-快速上手DMA
1.概述 DMA传输是内核授权总线给DMA控制器,把数据传输的工作交给DMA控制器来进行管理的一种数据传输方式。关键的参数是需要指定数据源地址、目标地址、传输的数据个数。 2. 配置步骤 2.1 抽象的配置过程 DMA通道x的配置步骤如下: 1. 在DMA_CPARx寄存器中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将 是数据传输的源或目标。 2. 在DMA_CMARx寄存器中设置数据存储器的地址。发生外设数据传输请求时,传输的数 据将从这个地址读出或写入这个地址。 3. 在DMA_CNDTRx寄存器中设置要传输的数据量。在每个数据传输后,这个数值递减。 4. 在DMA_CCRx寄存器的PL 位中设置通道的优先
[单片机]
STM32-快速上手DMA
STM32引脚的4中输出模式
1、普通推挽输出(GPIO_Mode_Out_PP): 使用场合:一般用在0V和3.3V的场合。线路经过两个P_MOS 和N_MOS 管,负责上拉和下拉电流。 使用方法:直接使用 输出电平:推挽输出的低电平是0V,高电平是3.3V。 2、普通开漏输出(GPIO_Mode_Out_OD): 使用场合:一般用在电平不匹配的场合,如需要输出5V的高电平。 使用方法:就需要再外部接一个上拉电阻,电源为5V,把GPIO设置为开漏模式, 当输出高组态时,由上拉电阻和电源向外输出5V的电压。 输出电平:在开漏输出模式时,如果输出为0,低电平,则使N_MOS 导通,使输 出接地。若控制输出为1(无法直接输出高电平),则
[单片机]
【eBox生态圈】连载一:简化STM32的编程之eBox
STM32目前已经成为一款性价比相当高的单片机控制解决方案,由于STM32本身功能比较全面,备受大家的青睐,网络上有这相当全面的资料,不管是新手还是老鸟都可以通过一个开发板的学习来了解STM32的基本编程思路。但是总体感觉STM32的编程比较复杂,难以记忆或者理解。设置任何一个外设都要初始化相当多的寄存器。靠记忆已经无法完成,经常是是复制一段配置代码再修改成自己需要的,或者不断的查询复杂的手册和编程指南来完成。用起来总是不能像Arduino那样方便。如何解决STM32编程复杂的问题已经成为一个相当大的问题。 目前编程所遇到的问题: 外设问题:STM32官方库在一定程度上降低了编程的复杂度。提供了全面的API接口,可以支持任何一
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved