【物联网】老程序教你一招,10行代码让超声波模块秒变声控开关_csdn 声控开关(1)

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!


img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

【Arduino实验室】无需编写一行代码,用按键控制LED,Arduino初学者入门首选

3. 先从测距开始

还是先上代码吧!

void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
// 发射超声波
digitalWrite(trigPin, HIGH);
delayMicroseconds(5);
// 这个distance就是距离,超声波返回时,pulseIn函数会返回计时器的时间,单位:微秒
int distance = pulseIn(echoPin, HIGH) * 340 / 2 / 1000
delay(40);
}

这段测距代码一共就6行,其实就是先设置trip管脚低电平,然后再设置高电平,让超声波模块发射超声波。然后通过pulseIn函数将echo管脚设置高电平,等待超声波的返回,如果返回,pulseIn函数会返回时间(单位:微秒),本例计算得到的distance的单位是毫米。

看看,是不是很简单呢?

4. 如何将超声波改造成声控开关

测距很容易理解,那么如果将超声波模块变成声控开关呢?其实也并不复杂,这里用了一个技巧和一个状态机的算法,一共也就十几行代码。

测量距离肯定有远近。如300毫米和600毫米肯定是有差距的,肉眼也是可见的,也可以感知到。而这里的声控开关,其实并不是你要大喊一声:芝麻开门。超声波你也发不出,也听不见。这里的声控是指让超声波感知你的存在。

从前面的视频可以看出,将手在超声波模块前滑动,如果手正好在超声波模块的前面,那么测量的距离肯定要小于手不在超声波模块前的距离,其实这就是一个二值逻辑。利用测量距离的变化,可以判断手是否在超声波模块的前面。因此,这里需要设置一个阈值,如果测量的距离小于这个阈值,说明手在超声波模块的前面,如果大于这个阈值,说明手没在超声波模块的前面。

不过这里还有一个问题,由于loop函数是不断循环的,所以如果你的手一直在超声波模块的前面,那么就会一直触发“开”这个动作,因此需要使用状态机来屏蔽这种情况,也就是说,只有上一个状态是“关”时,才会检测当前状态是否为“开”。完整的实现代码如下:

// 单超声波实现
#include <SoftwareSerial.h>
#define LED 7
int trigPin = 10; // 发射管脚
int echoPin = 9; // 接收管脚
int distance = 0;
int state = 0; // 用于控制状态机的状态
bool led_state = false; // false:灭 true:亮
void setup() {
pinMode(LED, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
digitalWrite(LED, LOW);
Serial.begin(9600);
while (!Serial) {
}
Serial.println(“hello world!”);
}

void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(5);
distance = pulseIn(echoPin, HIGH) * 340 / 2 / 1000;
// 状态:关
if (state == 0) {
// 判断距离是否小于300毫米
if (distance < 300) {
state = 1; // 如果小于300毫米,说明手正好在超声波模块起那么,将状态设置为开
}
} else if (state == 1) { // 状态:开
// 如果距离大于等于300毫米,说明手不在超声波模块前面,状态设置为关
if (distance >= 300 ) {
state = 0;
// 当手不在超声波模块前面时,根据LED当前的状态,决定是关闭LEd,还是点亮LED
if(led_state) {
led_state = false;
digitalWrite(LED, LOW);
} else {
led_state = true;
digitalWrite(LED, HIGH);
}
}
}
delay(40);

}

5. 再加一个超声波开关

如果嫌不过瘾,可以再加一个超声波开关,连接方式同上,控制两个超声波开关的代码如下:

#include <SoftwareSerial.h>

#define LED1 8
#define LED2 7
int trigPin1 = 10; // 发射管脚
int echoPin1 = 9; // 接收管脚
int trigPin2 = 13; // 发射管脚
int echoPin2 = 12; // 接收管脚

int distance = 0;
int state1 = 0;
int state2 = 0;
bool led_state1 = false; // false:灭 true:亮
bool led_state2 = false; // false:灭 true:亮
void setup() {

pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);

pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
Serial.begin(9600);
while (!Serial) {
}
Serial.println(“hello world!”);
}

void loop() {
// 处理第1个超声波开关
digitalWrite(trigPin1, LOW); // 高电平发射超声波, 但要先设置为低电平。 就像打开灯,需要先关闭灯,才能打开
delayMicroseconds(5);
digitalWrite(trigPin1, HIGH);
delayMicroseconds(5);

distance = pulseIn(echoPin1, HIGH) * 340 / 2 / 1000;

if (state1 == 0) {
if (distance < 300) {
state1 = 1;
}
} else if (state1 == 1) {
if (distance > 300 ) {
state1 = 0;
if(led_state1) {
led_state1 = false;
digitalWrite(LED1, LOW);

} else {
led_state1 = true;
digitalWrite(LED1, HIGH);
}

}
}
// 处理第2个超声波开关
digitalWrite(trigPin2, LOW); // 高电平发射超声波, 但要先设置为低电平。 就像打开灯,需要先关闭灯,才能打开
delayMicroseconds(5);
digitalWrite(trigPin2, HIGH);
delayMicroseconds(5);

distance = pulseIn(echoPin2, HIGH) * 340 / 2 / 1000;

if (state2 == 0) {
if (distance < 300) {
state2 = 1;
}
} else if (state2 == 1) {
if (distance > 300 ) {
state2 = 0;
if(led_state2) {
led_state2 = false;
digitalWrite(LED2, LOW);

} else {
led_state2 = true;
digitalWrite(LED2, HIGH);
}

}
}
delay(40);

}

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!


img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!**

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值