摘要
本系统由主控台和工作区两部分组成。主控台通过TFT液晶触屏设定阈值温度等信息后,由单片机STM32经无线收发模块传送至工作区。
工作区内由单片机AT89S52控制DS18B20采集环境温度,当温度达到设定阈值时,AT89S52单片机与ATmega16单片机交换信息,ATmega16控制热释红外传感器进行人群位置定位,从而通过PWM控制电机和舵机做相应动作。
引言
当今生活中,风扇已成为人们解暑的重要工具,然而使用风扇缓解夏日酷热的同时也存在着一些问题。比如,由于风扇的转动方向只能机械式的保持在一定范围内,而不能根据人群的位置做出具体的调整,即在一片区域内,有人和没人对于风扇来说是一样的。此外,传统风扇只能根据选择的档位来设置转速,而不能根据周围环境温度的变化而自动调节转速。基于以上两点设计了自动调速跟踪风扇系统。
系统方案
系统硬件设计
(1)检测模块
方案一:采用红外成像仪它具有被动式的非接触的检测与识别,隐蔽性好,不受电磁干扰,能远距离精确跟踪热目标,但成本高、价格昂贵。
方案二:采用热释红外传感器检测,它具有传输距离远,可靠性强,能准确的进行人体移动探测。
综上考虑采用方案二热释红外传感器。
(2)环境温度采集模块
方案一:采用热敏电阻,可满足 40 摄氏度至 90 摄氏度测量范围,但热敏电精度、重复性、可靠性较差。
方案二:采用温度传感器DS18B20,它具有测量范围广,且测量精度高,可采用单片机直接进行温度的读取,使用方便。
基于DS18b20的以上优点,系统决定采用方案二来采集温度。
(3) 电机模块
方案一:采用舵机同直流电机搭配,舵机具有扭力大容易控制。小型直流减速电机,减速电机控制精度低,且速度均匀性好,控制简单,电源要求低,易于实现。
方案二:采用步进电机同直流电机搭配,步进电机具有精确度高转角范围广但扭力小控制复杂。小型直流减速电机,减速电机控制精度低,且速度均匀性好,控制简单,电源要求低,易于实现。
由于只需要转动180度的转角,因此选择方案一。
(4)数据传输模块
方案一:采用RS232传输线传递数据,虽然监测方便编程容易但数据传输线要求太长且妨碍机车的正常运行。
方案二:采用NRF24L01无线收发芯片进行数据传输,NRF24L01无线收发芯片具有功耗低、控制简单、可自动处理字头和CRC校验的优点,不仅利于单片机间的数据通信而且体积小不会妨碍机车的运行。
由于本设计要求能对机车进行远程监测及数据无线传输,因此采用第二种方案。
(5)显示模块
方案一:采用12864液晶显示,此液晶显示信息容量小,界面友好型差,且不能很好的显示图像信息。
方案二:采用彩屏显示,此液晶显示信息容量大,且界面友好,能够进行图像信息的显示及触摸屏设置。
综上考虑选择方案二进行显示
(6)最终方案
经过仔细的分析和论证,系统各模块的最终方案如下:
微控制器模块:采用STM32F103VET6单片机控制主控台,采用AT89S52和ATmega16单片机控制工作区。
检测模块:采用热释红外传感器。
环境温度采集模块:采用DS18B20温度传感器。
电机模块:采用舵机与直流电机搭配。
数据传输模块:采用NRF24L01无线收发模块。
显示模块:采用彩屏液晶显示。
系统软件设计
(1) 参数设置程序设计
主控台可以通过触摸彩屏对工作区阈值温度、温度和转速的对应关系以及电量的价格等信息进行设置。其设置流程图如图8所示。
图8 参数设置程序流程图
(2) 射频电路程序设计
利用射频模块实现主控台与工作区的信息转换。主控台设置启动温度、温度与转速转换对应关系等信息,通过NRF24L01射频模块传到工作区。工作区将采集到的环境温度通过射频模块回传给主控台,当达到启动温度时,整个系统开始运行。
信号无线传输的工作流程如图9、图10所示:
图9 主控台射频电路程序流程图 图10 工作区射频电路程序流程图
(3) 驱动电路程序设计
驱动电路主要包括电机驱动和舵机驱动两部分。根据人群位置的信息,计算改变舵机的转角;根据环境温度的高低,调节风扇电机的转速。其程序流程图如图11所示:
图11 驱动电路程序流程图
(4)系统功能模拟
系统模拟图如图12所示,自动调速跟踪风扇系统由主控台和工作区两部分组成(实际应用时可设置多个控制台与工作区)。
图12 自动调速跟踪风扇系统模拟图
主控台如图13所示,主要由STM32单片机系统、TFT触摸屏与NRF24L01无线射频传输模块组成。当系统开始工作后,可以通过触摸屏设置阈值温度、转速调节温度、电量价格等信息,而且可以实时查看风扇的工作状态、风扇转速等级以及当前消耗的总电量和总费用。NRF24L01无线射频传输模块实现与工作区信息的交换。
图13 主控台模拟图
工作区电路如图14组成,主要包括ATmega16与AT89S52单片机、电机、舵机、风扇、DS18B20温度传感器、热释红外传感器以及NRF24L01无线射频传输模块。DS18B20将检测的环境温度传送给AT89S52单片机,AT89S52判断当前温度,达到阈值温度时,风扇开始转动。进入工作状态后,扇形的热释红外传感器系统检测人群位置,ATmega16控制舵机的转角,使风扇只在人群区域内转动。此时DS18B20继续采集环境温度,AT89S52将此温度值与转速调节温度进行对比,ATmega16则相应的调节直流电机的转速,使其更加的人性化。NRF24L01无线射频传输模块则实现与控制台信息的交换。
图14 工作区模拟图
关键代码
#include "stm32f10x.h"
#include "lcd.h"
#include "sd_fs_app.h"
#include "SPI_Flash.h"
#include "systick.h"
#include "usart1.h"
#include "Touch.h"
#include "led.h"
#include "24l01.h"
void RCC_Configuration(void);
extern volatile unsigned char touch_flag;
extern unsigned int flagflag,flagflag1,flagflag2;
extern unsigned int flagflag3,flagflag4,flagflag5,flagflag6;
extern unsigned char emission[5];
extern unsigned char emission1[4];
extern unsigned char emission2[5];
extern unsigned char emission3[3];
/*
* 函数名:main
* 描述 :主函数
* 输入 :无
* 输出 :无
*/
int main(void)
{
unsigned char five=0;
RCC_Configuration(); /*时钟配置*/
LCD_Init(); /*LCD初始化*/
Touch_init(); /*触摸初始化*/
while(Touchl_Calibrate() !=0); /*等待触摸屏校准完毕*/
/*******************************开始工作**************************************************/
while (1)
{
Init_Menu();
//进入起始菜单
while(flagflag==0)
{
if((touch_flag==1)&&(flagflag3==1))
{
{
if(Get_touch_point(&display, Read_2046_2(), &touch_para ) !=DISABLE)
{ if((display.y>90)&&(display.y<140)||((240-display.x)>110)&&((240-display.x)<190) )
{
#ifdef HX8347 //
LCD_draw_rectangle(0,0,240,320,BLACK); /*清白屏*/ //
#else //
LCD_draw_rectangle(0,0,240,320,BLACK); /*清白屏*/ //
#endif
Init_Menu1();
LED_GPIO_Config();
NRF24L01Int1();
while(five<=20)
{
five++;
NRFSetTxMode1(emission);//发送温度
while(CheckACK1()); //检测是否发送完毕
GPIO_SetBits(GPIOC,GPIO_Pin_0);NRFDelay(1000);
GPIO_ResetBits(GPIOC,GPIO_Pin_0);NRFDelay(1000);
}
five=0;
flagflag3=0;
delay_ms(500);
Init_Menu();
/*************连续发送5次信息数组emission*******************/
LCD_Show_8x16_String(180,10,1,emission1); //
LCD_Show_8x16_String(180,33,1,emission2); //
LCD_Show_8x16_String(180,56,1,emission3); //
}
}
}
}
//
if(touch_flag == 1) /*如果触笔按下了*/ //下面的就是判断坐标了
{
if(Get_touch_point(&display, Read_2046_2(), &touch_para ) !=DISABLE)
{
Palette_draw_point(display.x,display.y);
}
}
} //进入二级菜单
while(flagflag1==1)
{
flagflag2=1;
if(touch_flag == 1)
{
if(Get_touch_point(&display, Read_2046_2(), &touch_para ) !=DISABLE)
{
Palette_draw_point(display.x,display.y);
}
}
}
}
}
/*****************************验证各个通道**********************************************************/
/* config the sysclock to 72M */
void RCC_Configuration(void)
{
SystemInit();
}
获取资料
大家点赞、收藏、关注、评论 啦
查看👇🏻文章下方名片联系我即可~👇🏻