距离感应风扇
1.实现功能:根据不同的靠近距离,控制风扇是否转动,可以设计根据距离不同,风扇转速不同
2.硬件模块
2.1WemosD1 – 核心控制单片机
2.2超声波模块 – 测量距离
2.3 L9110模块-- 电机控制器
2.4电机风扇模块
2.5电源模块
3.开发环境搭建
- 编程语言:C语言
- 编程软件:arduino
- 第三方库:Wemos
- 编程、编译、烧写
3.1安装带Wemos库的破解版arduino
-
安装事项:安装路径不能有中文,直接安装在D盘根目录下(任意盘,C、D、E、F盘随意)
-
配置开发板型号为Wemos01
-
在软件arduino上方点击工具,在子菜单中点击端口‘在子子菜单点击COM6(有些COM5,COM1)
配置端口
3.2安装驱动
单片机通过数据线接到电脑后,需要安装驱动。
- 必须使用有传输数据功能的安卓数据线,否则电脑不能识别出单片机,因为市面上有些安卓数据线内部只有VCC和GND两根线,缺少数据正极、数据负极两根线,故此不能传输数据)。
- 要先预安装成功,预安装成功后会显示预安装成功再把单片机通过有数据传输功能的数据线连接成功(听到电脑咚咚的铃声才算连接成功)
- 连接上单片机后安装驱动,安装成功驱动后,会显示驱动安装成功
3.3第三方库:Wemos
3.4编程、编译、烧写
4.电机转起来
4.1解决电机何时启动、转速多少的问题
9110电机控制器,就可以通过编程来控制电机的正反转,通过巧妙的软件编程,实现速度控制
控制器VCC – 接外接电源的正极
控制器GND --接外接电源的负极
这样接之后,电机的供电单元是外接电源,可以保护单片机电源系统
B-1A接D5 B-1B接D6 编程控制wemosD1可以控制电机控制器,从而控制电机
/*
电机转动
copied from chen
*/
void setup()
{
// put your setup code here, to run once:
// 这个函数只会在上电后执行一次
pinMode(D5, OUTPUT);
pinMode(D6, OUTPUT);//把D5 D6引脚配置成输出引脚,为了向电机控制器输出信号
}
void loop()
{
// put your main code here, to run repeatedly:
//把主要控制逻辑的代码放在这里,重复运行
digitalWrite(D5, HIGH);
digitalWrite(D6, LOW);
delay(1000);
digitalWrite(D5, HIGH);
digitalWrite(D6, HIGH);
delay(1000);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
5.超声波测距
5.1超声波测距原理
HC-SR04超声波模块的驱动时许
给Trig一个10us的TTL电平,模块内部就会发出信号,信号发出后,模块把ECHO从低电平切换成
高电平,当模块收到返回波,模块把ECHO从高电平切回到低电平,所以ECHO维持高电平的时间就是波在空气中的传播速度
距离 = 速度*时间
速度=340m/s
void setup() { // put your setup code here, to run once: // 这个函数只会在上电后执行一次 pinMode(D5, OUTPUT); pinMode(D6, OUTPUT);//把D5 D6引脚配置成输出引脚,为了向电机控制器输出信号 pinMode(D8, OUTPUT);//把D8(Trig)引脚配置成输出引脚,为了向超声波发送10us高电平信号 pinMode(D7, INPUT);// 把D7(Echo)引脚配置成输入引脚,检测Echo引脚高电平持续的时间=波在空气中的时间
Serial<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token number">9600</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
}
void loop()
{
// put your main code here, to run repeatedly:
//把主要控制逻辑的代码放在这里,重复运行
unsigned long time;
unsigned long dis;
// 1、10us的脉冲
digitalWrite(D8, LOW);
digitalWrite(D8, HIGH);
delayMicroseconds(10);
digitalWrite(D8, LOW);
//2. 检测D7echo高电平持续时间
time = pulseIn(D7,HIGH); //us
// 3.计算距离 2s = time * 340m/s
dis = time * 0.017;
Serial.print(dis);
Serial.println(“cm”); //32cm
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
6根据距离控制不同的转速
当距离小于30cm的时候风扇转动,大于30cm的时候,风扇不转动
void setup()
{
// put your setup code here, to run once:
// 这个函数只会在上电后执行一次
pinMode(D5, OUTPUT);
pinMode(D6, OUTPUT);//把D5 D6引脚配置成输出引脚,为了向电机控制器输出信号
pinMode(D8, OUTPUT);//把D8(Trig)引脚配置成输出引脚,为了向超声波发送10us高电平信号
pinMode(D7, INPUT);// 把D7(Echo)引脚配置成输入引脚,检测Echo引脚高电平持续的时间=波在
空气中的时间
Serial.begin(9600);
}
void loop()
{
// put your main code here, to run repeatedly:
//把主要控制逻辑的代码放在这里,重复运行
unsigned long time;
unsigned long dis;
// 1、10us的脉冲
digitalWrite(D8, LOW);
digitalWrite(D8, HIGH);
delayMicroseconds(10);
digitalWrite(D8, LOW);
//2. 检测D7echo高电平持续时间
time = pulseIn(D7,HIGH); //us
// 3.计算距离 2s = time * 340m/s
dis = time * 0.017;
Serial.print(dis);
Serial.println("cm"); //32cm
//如果距离小于30的时候,就转动,否则就不转
if(dis < 30)
{
digitalWrite(D5, LOW);
digitalWrite(D6, HIGH);
}
else
{
digitalWrite(D5, HIGH);
digitalWrite(D6, HIGH);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
6.1开发逻辑
单位时间内电机全速运转占用的时间比
快 = 全速运转占用的时间多
慢 = 全速运转占用的时间少
void setup() { // put your setup code here, to run once: // 这个函数只会在上电后执行一次 pinMode(D5, OUTPUT); pinMode(D6, OUTPUT);//把D5 D6引脚配置成输出引脚,为了向电机控制器输出信号 pinMode(D8, OUTPUT);//把D8(Trig)引脚配置成输出引脚,为了向超声波发送10us高电平信号 pinMode(D7, INPUT);// 把D7(Echo)引脚配置成输入引脚,检测Echo引脚高电平持续的时间=波在 空气中的时间 Serial.begin(9600); } void loop() { // put your main code here, to run repeatedly: //把主要控制逻辑的代码放在这里,重复运行 unsigned long time; unsigned long dis; //时刻让风扇处于停止状态 digitalWrite(D5, HIGH); digitalWrite(D6, HIGH); // 1、10us的脉冲 digitalWrite(D8, LOW); digitalWrite(D8, HIGH); delayMicroseconds(10); digitalWrite(D8, LOW); //2. 检测D7echo高电平持续时间 time = pulseIn(D7,HIGH); //us // 3.计算距离 2s = time * 340m/s dis = time * 0.017; Serial.print(dis); Serial.println("cm"); //32cm if(dis > 80) { return; }//如果距离小于30的时候,就转动,否则就不转
<span class="token keyword">while</span><span class="token punctuation">(</span>dis<span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token comment">//dis = 5 4 3 2 1 dis = 20 19 18 17 .....0</span> <span class="token function">digitalWrite</span><span class="token punctuation">(</span>D5<span class="token punctuation">,</span> LOW<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">digitalWrite</span><span class="token punctuation">(</span>D6<span class="token punctuation">,</span> HIGH<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">delayMicroseconds</span><span class="token punctuation">(</span><span class="token number">260</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
文章所有内容转载并再编辑于学浪APP“老陈的IT杂货铺”。