7基于STM32的智能风扇√★

Posted 行走的皮卡丘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7基于STM32的智能风扇√★相关的知识,希望对你有一定的参考价值。

7、💗💗基于STM32的智能风扇√★💗💗

Introduction

During the alternate seasons of spring and summer (summer and autumn), the temperature is still high during the day. The electric fan should have a high speed and large air volume to make people feel cool. At night, the temperature drops. When people fall asleep, they should gradually reduce the speed to avoid making people catch a cold. Although the electric fan has the function of adjusting different gears, it must be manually shifted. If you fall asleep, there is nothing you can do. The commonly used timer is turned off. On the one hand, there is a limit to the length of the timing, usually one or two. Hours; on the other hand, the temperature may not drop much after one or two hours, and the fan is turned off, making people wake up in sleep and have to get up and turn on the fan again, increasing the timer time, which is very troublesome and may After several timings, the last timing time is too long, and the fan continues to blow after the temperature drops, which makes people catch a cold; the third aspect is that there is only a simple function of turning off the fan power when the timing time is reached, which cannot meet the fan speed due to temperature changes. Different size requirements. For example, in terms of heat dissipation of higher-power electronic products, most of them now use air-cooled systems, which use fans to cause air to flow, take away heat, and prevent electronic products from heating and burning. To keep electronic products at a lower temperature, a fan with high power, high speed and large air volume must be used, and the noise of the fan is proportional to its power. If you want low noise, you have to reduce the fan speed, which will cause the temperature of the electronic equipment to rise, and you cannot have the best of both worlds.

With the rapid development of technology, smart homes have gradually entered ordinary homes, and fans, as basic household appliances, will also become part of smart homes. What is introduced here is a smart electric fan designed with STM32 single-chip microcomputer as the control unit and combined with embedded technology. It has buttons, Bluetooth and infrared control fan start and stop and wind speed, temperature control speed regulation, liquid crystal display temperature and other information. After the preliminary design, production and final test, the fan power supply has good stability, convenient operation, reliable operation, powerful functions, low price, and energy saving.

引言

春夏(夏秋)交替时节,白天温度依旧很高,电风扇应高转速、大风量,使人感到清凉;到了晚上,气温降低,当人入睡后,应该逐步减小转速,以免使人感冒。虽然电风扇都有调节不同档位的功能,但必须要人手动换档,睡着了就无能为力了,而普遍采用的定时器关闭的做法,一方面是定时时间长短有限制,一般是一两个小时;另一方面可能在一两个小时后气温依旧没有降低很多,而风扇就关闭了,使人在睡梦中热醒而不得不起床重新打开风扇,增加定时器时间,非常麻烦,而且可能多次定时后最后一次定时时间太长,在温度降低以后风扇依旧继续吹风,使人感冒;第三方面是只有简单的到了定时时间就关闭风扇电源的单一功能,不能满足气温变化对风扇风速大小的不同要求。又比如在较大功率的电子产品散热方面,现在绝大多数都采用了风冷系统,利用风扇引起空气流动,带走热量,使电子产品不至于发热烧坏。要使电子产品保持较低的温度,必须用大功率、高转速、大风量的风扇,而风扇的噪音与其功率成正比。如果要低噪音则要减小风扇转速,又会引起电子设备温度上升,不能两全其美。

随着科技的日新月异,智能家居逐渐走入普通家庭,风扇作为基本的家用电器也将成为智能家居的一部分。这里介绍的是以STM32单片机为控制单元并结合嵌入式技术设计的一款具有按键、蓝牙及红外控制风扇启停和风速、温控调速、液晶显示温度等信息的智能电风扇。经过前期设计、制作和最终的测试得出,该风扇电源稳定性好,操作方便,运行可靠,功能强大价格低廉,节约能耗。

1、系统概述

1.1、设计任务

用STM32设计一个智能电风扇。

1.2、设计要求

  • (1)按键控制风扇开关及调速;

  • (2)红外控制风扇启停及调速;

  • (3)蓝牙控制风扇启停及调速;

  • (4)自动温度调速。

2 、方案设计与论证

2.1、芯片选择方案

2.1.1、控制核心的选择

方案一:采用电压比较电路作为控制部件。温度传感器采用热敏电阻或热电偶等,温度信号转为电信号并放大,由集成运放成的比较电路判決控制风扇转速,当高于或低于某值时将风扇切換到相应档位。

方案二:采用STM32单片机作为控制核心。

以软件编程的方法进行温度判断,并在端口输出控制信号。

对于方案一,采用电压比较电路具有电路简单、易于实现,以及无需编写软件程序的特点,但控制方式过于单一,不能自由设置上下限动作温度,无法满足不同用户以及不同环境下的多种动作温度要求,故不在本系统中采用。

对于方案二,以STM32单片机作为控制器,通过编写程序不但能将传感器感测到的温度通过显示电路显示出来,而且用户能通过键盘接口,自由设置上下限动作温度值满足全方位的需求。并且通过程序判断温度具有极高的精准度,能精确把握环境温度的微小变化。故本系统采用方案二。

温度传感器的选择

2.1.2、温度传感器可由以下几种方案可供选择

方案一:选用热敏电阻作为感测温度的核心元件,通过运算放大器放大由于温度变化引起热敏电阻电阻的变化、进而导至的输出电压变化的微弱电压变化信号,再用AD转換芯片ADC0809将模拟信号转化为数字信号输入单片机处理。

方案二:采用热电偶作为感测温度的核心元件,配合桥式电路,运算放大电路和AD转換电路,将温度变化信号送入单片机处理。

方案三:采用数字式集成温度传感器DS18B20作为感测温度的核心元件,直接输出数字温度信号供单片机处理。

对于方案一,采用热敏电阻有价格便宜、件易购的优点,但热敏电阻对温度的细微变化不敏感,在信号采集、放大、转过程中还会产生失真和误差,并且由于热敏电阻的R-T关系的非线性,其本身电阻对温度的变化存在较大误差,虽然可以通过一定电路予以纠正,但不仅将使电路复杂稳定性降低,而且在人体所处温度环境温度变化中难以检测到小的温度变化。故该方案不适合本系统。

对于方案二,采用热电偶和桥式测量电路相对于热敏电阻其对温度的敏感性和器件的非线性误差都有较大提高,其测温范围也非常宽,从-50摄氏度到1600摄氏度均可测量。但是依然存在电路复杂,对温度敏感性达不到本系统要求的标准,故不采用该方案。

对于方案三,由于数字式集成温度传感器DS18B20的高度集成化,大大降低了外接

放大转换等电路的误差因素,温度误差很小,并且由于其感测温度的原理与上述两种方案的原理有着本质的不同,使得其温度分辨力极高。温度值在器件內部转换成数字量直接输出,简化了系统程序设计,又由于该传感器采用先进的单总线技术(1WRIE),与单片机的接口变的非常简洁,抗干扰能。

2.1.3、调速方式的选择

方案一:采用数模转化芯片DACO832来控制,由单片机根据当前环境温度值输岀相应数字量到DAC0832中,再由DAC0832产生相应模拟信号控制晶闸管的导通角从而通过无级调速电路实现风扇电机转速的自动调节。

方案二:采用单片机软件编程实现PWM脉沖宽度调制)调速的方案。PWM为英文 Pulse Width Modulation的缩写,它为按一定的规律改变脉冲序列的脉沖宽度,以调节输出量和波形的一种调节方式,在PWM区动控制的调节系统中,最常用的为矩形波PWM信号,在控制时需要调节

PVM波得占空比。占空比为指高电平持续时间在一个周期时间内的百分比。在控制电机的转速时,占空比越大,转速就越快,若全为高电平,占空比为100%时,转速达到最大。用单片机/O口输出PM信号时,有如下两种方案

  • (1)利用软件延时。当高电平延时时间到时,对/O口电平取反,使其变成低电平,然后再延时一定时间;当低电平延时时间到时,再对该O口电平取反,如此循环即可得到PWM信号。在本设计中应用了此方案

  • (2)利用定时器。控制方案与(1)相同,只为在该方案中利用单片机的定时器来定时进行高低电平的转变,而不为用软件延时。应用此方案时编程相对复杂。

对于方案一,该方案能够实现对直流风扇电机的无级调速,速率变化灵敏,但为D/A转化芯片的价格较高,与其温控状态下无级调速性能相比性价比不高。

对于方案二,相对于其他用硬件或者软硬件相结合的方案实现对电机进行调速而言,采用PWM用纯软件的方案来实现调速过程,具有更大的灵活性,并可大大降低成本,能够充分发挥单片机的性能,对于简单速率控制系统的实现提供了一种有效的途径。综合考虑选用方案二。

2.2、系统总体设计思路

  • (1) 本设计采用STM32单片机做主控芯片,通过DS18B20采集温度,将温度显示在OLED上。实现自动温度控制风速。

  • (2) 根据温度不同,利用STM32对风扇进行调速。

  • (3) 利用按键和红外控制功能,实现风扇启停及调速

  • (4) 利用蓝牙功能,完成风扇启停及调速。

2.3、各功能模块程序实现原理分析

该模块由蓝牙HC05模块,OLED模块,电机驱动L298N模块,按钮控制模块,红外控制模块、电机和温度计DS18B20组成,且都通过STM32来实现。

2.3.1、电机驱动L298N模块

2.3.2、 按钮控制模块

四个按钮的一端分别接地,另一端接单片机一个端口的四个引脚,当某一个按钮按下的时候,其对应的引脚就由高电平变成低电平,然后通过单片机扫描读取引脚的电平来判断按钮是否按下。

2.3.3、 OLED模块

OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display)。OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。LCD 都需要背光,而 OLED 不需要,因为它是自发光的。另外,OLED的功耗比LCD低得多,相同显示面积的功耗仅相当于LCD的1/3。OLED尺寸难以大型化,但是分辨率确可以做到很高,非常适合手持式移动设备。

1)HTDS系列OLED模块具 有以下特点:

无需背光:显示单元能自发光;

宽电压支持:无需任何修改,直接支持 3V~5V 直流电压;

独立的 SPI 或 IIC 通信方式:SPI 的优势在于可以独立复位,若使用CPU 的硬件 SPI,显示速度快,性能稳定;IIC 的优势在于只需要两个 IO 口便能工作,节约 IO 口,适合 IO 紧张的用户;

分辨率高:128*64;

可视角度大:最大可视角 160°;

支持众多控制芯片:全面兼容 Arduino、51 系列、MSP430 系列、STM32/2、CSR 芯片等;

超低功耗:全屏点亮时 0.08W,正常全屏显示汉字 0.06W(远低于TFT、LCD 等技术);

工业级工作温度:-30℃~70℃;

体积小:0.96 寸屏尺寸为 27.0MM27.0MM3.6MM,1.3 寸外形尺寸为 35.5MM32MM3.6MM。

丰富的引线接口:模块上默认使用 2.54mm 单排针作为通信接口,预留有 0.5mm 间距 FFC 接口,用户在设计自己的 PCB 时可以更灵活。

2.3.4、 蓝牙HC05模块

1)HC05 简介

YH-HC05 是野火科技推出的蓝牙串口模块,它采用蓝牙 2.0 协议,可与任何版本的蓝牙兼容通讯,包括与具有蓝牙功能的电脑、蓝牙主机、手机、PDA、PSP 等终端配对,可实现串口透传功能。驱动 HC05 模块时只需要使用 TTL 电平标准的串口即可(5V/3.3V 电压均可),支持的波特率范围为 4800~1382400,非常适合用于单片机系统扩展蓝牙特性。

2)特性参数

3)引脚介绍

2.3.5、温度计DS18B20

1)温度计DS18B20简介

DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。 DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。

2)工作原理

DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。 DS18B20测温原理如图3所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号发送给计数器1。高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。

3)DS18B20的外形及管脚

DS18B20内部结构主要由四部分组成:64位光刻ROM 、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。

DS18B20的外形及管脚排列如下:

DS18B20引脚定义:

(1)DQ为数字信号输入/输出端;

(2)GND为电源地;

(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。

2.3.6、 红外控制模块

3、硬件设计

3.1、智能风扇系统硬件设计

该模块由蓝牙HC05模块,OLED模块,电机驱动L298N模块,按钮控制模块,红外控制模块、电机和温度计DS18B20组成,实物如下图所示:

4 、系统程序

4.1、主程序设计如下

主程序流程设计图如下图:

4.2、 主程序内容

#include "main.h"
#include "stdlib.h"
#include ".\\motor_control\\bsp_motor_control.h"
#include "./led/bsp_led.h"
#include "./key/bsp_key.h" 
#include "./usart/bsp_debug_usart.h"
#include "./key/bsp_key.h"
#include "xyz.h"

__IO int16_t speed_leveo = 1;
__IO int16_t fan_mode = 0;
__IO int16_t fan_auto = 0;
__IO int16_t setnum;
__IO int16_t i = 0;							//累加值

unsigned int Task_Delay[NumOfTask]; 
char sendData[1024];
char linebuff[1024];
char* redata;


void Delay(__IO uint32_t nCount)	 //简单的延时函数
{
    for(; nCount != 0; nCount--){
    }
}
void display(void)		//风速显示1
{
    if(speed_leveo==0){
    }
    else if(speed_leveo==1){
        OLED_8x16Str(70,5,"1");				//OLED_8x16Str(水平位置(像素),垂直位置(行),"显示内容")
    }
    else if(speed_leveo==2){
        OLED_8x16Str(70,5,"2");				//OLED_8x16Str(水平位置(像素),垂直位置(行),"显示内容")
    }
    else if(speed_leveo==3){
        OLED_8x16Str(70,5,"3");				//OLED_8x16Str(水平位置(像素),垂直位置(行),"显示内容")
    }
    else if(speed_leveo==4){
        OLED_8x16Str(70,5,"4");				//OLED_8x16Str(水平位置(像素),垂直位置(行),"显示内容")
    }
    else if(speed_leveo==5){
        OLED_8x16Str(70,5,"5");				//OLED_8x16Str(水平位置(像素),垂直位置(行),"显示内容")
    }
    else if(speed_leveo==6){
        OLED_8x16Str(70,5,"6");				//OLED_8x16Str(水平位置(像素),垂直位置(行),"显示内容")
    }
    else if(speed_leveo==7){
        OLED_8x16Str(70,5,"7");				//OLED_8x16Str(水平位置(像素),垂直位置(行),"显示内容")
    }
    else if(speed_leveo==8){
        OLED_8x16Str(70,5,"8");				//OLED_8x16Str(水平位置(像素),垂直位置(行),"显示内容")
    }

}
void display2(void)		//风速显示2
{
    if(speed_leveo==0){
    }
    else if(speed_leveo==1){
        OLED_8x16Str(70,6,"1");				//OLED_8x16Str(水平位置(像素),垂直位置(行),"显示内容")
    }
    else if(speed_leveo==2){
        OLED_8x16Str(70,6,"2");				//OLED_8x16Str(水平位置(像素),垂直位置(行),"显示内容")
    }
    else if(speed_leveo==3){
        OLED_8x16Str(70,6,"3");				//OLED_8x16Str(水平位置(像素),垂直位置(行),"显示内容")
    }
    else if(speed_leveo==4){
        OLED_8x16Str(70,6,"4");				//OLED_8x16Str(水平位置(像素),垂直位置(行),"显示内容")
    }
    else if(speed_leveo==5){
        OLED_8x16Str(70,6,"5");				//OLED_8x16Str(水平位置(像素),垂直位置(行),"显示内容")
    }
    else if(speed_leveo==6){
        OLED_8x16Str(70,6,"6");				//OLED_8x16Str(水平位置(像素),垂直位置(行),"显示内容")
    }
    else if(speed_leveo==7){
        OLED_8x16Str(70,6,"7");				//OLED_8x16Str(水平位置(像素),垂直位置(行),"显示内容")
    }
    else if(speed_leveo==8){
        OLED_8x16Str(70,6,"8");				//OLED_8x16Str(水平位置(像素),垂直位置(行),"显示内容")
    }

}


void LED(void)			//测试用不用管
{
    if(speed_leveo==0){
        LED1_OFF;
        LED2_OFF;
        LED3_OFF;
    }
    else if(speed_leveo==1){
        LED2_OFF;
        LED3_OFF;
        LED1_ON;
        Delay(0x0FFFFF);
        LED1_OFF;
        Delay(0x0FFFFF);
    }
    else if(speed_leveo==2){
        LED1_ON;
        LED2_OFF;
        LED3_OFF;
    }
    else if(speed_leveo==3){
        LED1_ON;
        LED2_ON;
        LED3_OFF;
        Delay(0x0FFFFF);
        LED2_OFF;
        Delay(0x0FFFFF);
    }
    else if(speed_leveo==4){
        LED1_ON;
        LED2_ON;
        LED3_OFF;
    }
    else if(speed_leveo==5){
        LED1_ON;
        LED2_ON;
        LED3_ON;
        Delay(0x0FFFFF);
        LED3_OFF;
        Delay(0x0FFFFF);
    }
    else if(speed_leveo==6){
        LED1_ON;
        LED2_ON;
        LED3_ON;
    }
    else if(speed_leveo==7){
        LED1_ON;
        LED2_ON;
        LED3_ON;
        Delay(0x0FFFFF);
        Delay(0x0FFFFF);
    }
    else if(speed_leveo==8){
        LED1_ON;
        LED2_ON;
        LED3_ON;
    }
}
void hongwai(void)		//红外接收
{
    if( frame_flag == 1 )		//一帧数据接收完成
    {
        if(fan_mode)			//判断是否为开机状态
        {					
            for(i=0; i<8; i++)	//开机页面显示
            {
                OLED_16xACN(i*16,0,i);
                OLED_16xACN(i*16,2,i+8);
                OLED_16xACN(i*16,4,i+16);
                OLED_16xACN(i*16,6,i+24);
            }
        }
        else
        {
            for(i=0; i<8; i++)	//关机页面显示
            {
                OLED_16xBCN(i*16,0,i);
                OLED_16xBCN(i*16,2,i+8);
                OLED_16xBCN(i*16,4,i+16);
                OLED_16xBCN(i*16,6,i+24);
            }
        }
        IrDa_Process();			//红外接收计算
        switch( tir_back )		//判断返回值
        {
            case 0:
                break;

            case 162:		//电源
                fan_auto = 0;			//关闭自动
                OLED_CLS();				//清空屏幕
                if(fan_mode)			//判断是否为开机状态
                {						//如果当前为开机状态
                    fan_mode = 0 ;		//关机
                    speed_leveo = 0;	//风速调0
                    for(i=0; i<8; i++)	//显示关机页面
                    {
                        OLED_16xBCN(i*16,0,i);
                        OLED_16xBCN(i*16,2,i+8);
                        OLED_16xBCN(i*16,4,i+16);
                        OLED_16xBCN(i*16,6,i+24);
                    }
                }
                else					//如果当前为开机状态
                {
                    fan_mode = 1;		//开机
                    speed_leveo = 1;	//风速调1
                    for(i=0; i<8; i++)	//显示开机页面
                    {
                        OLED_16xACN(i*16,0,i);
                        OLED_16xACN(i*16,2,i+8);
                        OLED_16xACN(i*16,4,i+16);
                        OLED_16xACN(i*16,6,i+24);
                    }
                }
                break;

            case 226:		//menu
                if(fan_mode)				
                    fan_auto = ~fan_auto;	//自动状态取反
                if(fan_mode)				//屏幕显示
                {					
                    for(i=0; i<8; i++)		//显示开机页面
                    {
                        OLED_16xACN(i*16,0,i);
                        OLED_16xACN(i*16,2,i+8);
                        OLED_16xACN(i*16,4,i+16);
                        OLED_16xACN(i*16,6,i+24);
                    }
                }
                else
                {
                    for(i=0; i<8; i++)		//显示关机页面
                    {
                        OLED_16xBCN(i*16,0,i);
                        OLED_16xBCN(i*16,2,i以上是关于7基于STM32的智能风扇√★的主要内容,如果未能解决你的问题,请参考以下文章

毕业设计 - 题目:基于stm32的智能温控风扇设计与实现

基于STM32的智能温室控制系统仿真电路设计(温控补光)-基于STM32的智能蓝牙温控风扇控制系统设计-基于STM32的无线蓝牙心电监护仪系统设计毕设课设分享

基于STM32的智能蓝牙温控风扇控制系统设计-毕设课设

基于STM32单片机项目设计目录-加油吧√

基于STM32单片机项目设计目录-加油吧√

基于STM32温室智能监测控制系统设计(温控补光功能)仿真,程序