1.背景
这个夏天,7月的雨季过后天气越来越热,于是买了一个小风扇。但普通小风扇智能化程度低,不能自动开关,会白白浪费电,于是想着利用单片机将其改造一下,增加一些自动开关的功能,感应到有人就开启,没人就关闭,也同时学习一下单片机的知识。
2.实现功能
这个项目称之为USB小风扇改造计划1.0,后续还会有2.0、3.0。目的是将USB小风扇增加一个功能:感应是否有人自动开启风扇。
既然是拓展,不能破坏原来的小风扇结构,于是计划将我的控制系统封装成一个硬件整体,小风扇和控制器连接,然后控制器和电脑电源连接,这样就不会破坏原有的小风扇结构,实现硬件解耦。
3.基本构思
使用超声波传感器感知物体距离,当距离小于一定阈值的时候启动开关,控制风扇运转,大于一定值关闭开关。电源由电脑USB口输入,控制器输出口控制电源通断,与小风扇连接。总之,小风扇最终的输入控制量就是电源的开关量,达到某个条件就打开/关闭。
4.方案设计
这里开始具体方案设计,主要材料选材、连接方案、软件
4.1主要材料
1、单片机最小系统:选择51单片机。这里需要用51单片机的最小系统,不仅仅是单片机芯片。懒得焊接,就买了个51的最小系统底座。用上以前的51单片机芯片。
2、继电器:继电器作为开关,可以通过单片机的IO口高低电平控制电源的通断。选了一个单路继电器,具体接口说明如下图。
3.超声波传感器:选择普通的HC-SR04这种型号的超声波传感器。该型号的超声波传感器的使用方法和原理可以查看相关使用方法,这里就不赘述了。
4.USB接口:用于供电。
4.2设计连接图
选择了上述的硬件后,具体的硬件连接示意图如下
4.3软件代码
软件部分主要是启动超声波传感器,测量距离。这里设置低于40cm触发IO口置为低电平,然后启动继电器常开口,开启风扇。
/*** 项目名称:USBFan1.0 USB感应风扇 ***/
/*** 项目功能:感应有人靠近,自动打开风扇 ***/
/*** 完成时间:20240802 ***/
/*** 作者:罗特布克 ***/
/*** 备注:***/
#include "reg52.h"
/*** 定义IO口 ***/
sbit SWITCH = P3^6; // 定义继电器开关
sbit Trig = P1^1; // 超声波触发口
sbit Echo = P1^2; // 超声波接收口
/*** 函数:延时10us ***/
void Delay10us() // 延时10us @11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
/*** 函数:初始化定时器 ***/
void Time0Init()
{
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = 0;
TL0 = 0;
}
/*** 函数:启动超声波触发信号 ***/
void StartHC_SR04()// 给Trig口一个10us的高电平
{
Trig = 0;
Trig = 1;
Delay10us();
Trig = 0;
}
/*** 函数:返回测得距离 ***/
double Calculate_Dis(void)
{
double distance=0;
double time=0;
StartHC_SR04();
while(Echo == 0); // Echo返回的高电平的持续时间就是超声波传播的时间。这里等待高电平,没来就一直等待,直到变为1进入下一个语句。
TR0 = 1; // 开启定时器
while(Echo == 1); // 当Echo为高电平,说明超声波还没有回来,持续计时,直到变为低电平,进入下一个语句(关闭计时器)。
TR0 = 0; // 关闭定时器
time = (TH0 * 256 + TL0)*1.085; // 计算时间 单位是us
distance = time * 0.017; // 计算距离 = 速度*时间/2,单位cm
return distance;
}
/*** 主函数 ***/
void main()
{
double HC_Dis=0; // 超声波传感器测得的距离
Time0Init();
while(1)
{
HC_Dis=Calculate_Dis();
if(HC_Dis < 40)
{
SWITCH = 0;
}
else
{
SWITCH = 1;
}
TH0 = 0; //定时器清空,以便下一次测距
TL0 = 0;
}
}
4.4实物组装
按照上边的设计图进行连接。
(1)准备材料:增加了一些杜邦线和面包板,当然还需要焊锡、剥线钳、热胶棒、改刀等辅助工具。对了,还要一个现成的USB小风扇。
(2)组装完成,导入代码测试。
(3)整理线束,让控制器更整洁。
测试视频:
基于51单片机的自动启动小风扇
5.小结
这个项目中超声波传感器经常检测不准造成,造成开关开合频繁,可以通过软件延时修复BUG。这次先这样,后边继续优化。