⭐效果
blob:https://www.bilibili.com/49190746-e7aa-43fe-bde0-60f9ab74ec78
自制超声波垃圾桶(硬件设施细节还要完善)
⭐所需器材
超声波传感器,跳线,舵机,小垃圾桶外壳,arduino uno开发板
⭐连线图片
⭐程序代码
#include <Arduino.h> #include <Servo.h> #define echoPin 2 #define trigPin 3 Servo duoji; long duration; int distance; int angle = 0; //舵机角度 void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); duoji.attach(9); Serial.begin(9600); } void loop() { //先清空触发脚状态,准备发送下一次的超声波信号 digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration * 0.034 / 2; //测距 Serial.println(distance); if (distance > 20)//20厘米 { if (duoji.read() == 90) { delay(1000); } else { angle = duoji.read(); while (angle < 90) //打开垃圾桶 { angle+=10; duoji.write(angle); delay(10); } delay(1000); } } else { angle = duoji.read(); while (angle > 0) //关闭垃圾桶 { angle-=10; duoji.write(angle); delay(10); } duoji.write(0); } }
⭐代码分析
✨引入所需的库文件
#include <Arduino.h> #include <Servo.h>
✨定义引脚
#define echoPin 2 //将Echo引脚连接到D2 #define trigPin 3 //将Trig引脚连接到D3
✨定义变量并且初始化
long duration = 0; int distance = 0; int angle = 0;
✨程序初始化
void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); duoji.attach(9); //将舵机信号引脚连接到数字引脚9 Serial.begin(9600); //设置波特率 }
✨pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); 函数
这两行代码用于初始化 HC-SR04 超声波传感器连接的两个引脚,即将触发脚(Trig Pin)设置为输出模式,使其能够发送超声波信号,并将回波脚(Echo Pin)设置为输入模式,用于接收回波信号。
在使用 HC-SR04 进行测距时,需要通过触发引脚发送一定时间的超声波信号,然后等待该信号的回波,测量回波的行程时间,最终通过行程时间和声波在空气中的传播速度计算出测距结果。因此,在这段代码中需要将引脚初始化为相应的输入输出模式,以便进行后续的超声波测距操作。
✨digitalWrite(trigPin, HIGH)函数
digitalWrite(trigPin, HIGH) 用于将触发引脚 trigPin 的电平设置为高电平,以激活 HC-SR04 超声波传感器并发送超声波信号。
在 HC-SR04 进行测距时,需要向触发引脚发送一定时间的高电平信号才能启动传感器,并在一定时间后自动停止发射传感器,开始接收回波信号,该函数用于实现发送触发信号的操作,从而开始一次超声波测距操作。
✨digitalWrite(trigPin, LOW)函数
digitalWrite(trigPin, LOW) 用于将触发引脚 trigPin 的电平设置为低电平,以实现清空触发脚状态,准备发送下一次的超声波信号。
在 HC-SR04 测距过程中,需要向触发引脚发送一定时间的高电平信号才能激活传感器并发送超声波信号,因此在每次测距结束后,需要调用该函数将触发引脚的电平设置为低电平,以便准备下一次的超声波测距。
🍔注意
要先使用digitalWrite(trigPin, LOW),以实现清空触发脚状态,准备发送下一次的超声波信号。然后再使用digitalWrite(trigPin, HIGH)
如果不明白的话,分析一下上面的完整代码
✨delayMicroseconds(2)函数
delayMicroseconds(2) 是一个延时函数,用于在超声波传感器触发引脚电平由低电平变为高电平后延迟 2 微秒的时间,以满足 HC-SR04 的触发要求。
在 HC-SR04 进行测距时,需要将触发引脚电平设置为高电平并保持至少 10 微秒的时间,才能激活传感器并发送超声波信号。而本函数的作用就是在设置触发引脚为高电平后,等待一段时间(这里为 2 微秒)后再继续执行下一步操作,从而满足 HC-SR04 触发的要求。
✨pulseIn() 函数
pulseIn() 是Arduino内置的一个函数,它用于测量数字引脚上的高或低脉冲的持续时间,通常用于接收超声波传感器(如 HC-SR04)的回波信号的持续时间。在这个代码中,它被用于读取echoPin引脚输入的声波行程时间,从而计算距离。
具体来说,pulseIn() 函数接收两个参数,第一个是要测量的引脚,第二个是脉冲电平(HIGH或LOW)。在这里,我们需要测量接收到的高电平的持续时间,因此第二个参数是 HIGH。该函数将等待引脚上产生与给定电平相同的脉冲,并返回脉冲持续的时间,单位是微秒。因此,这个代码中,通过pulseIn(echoPin, HIGH) 读取到的值为声波从发送出去到接收到回波的总时间,即行程时间(单位:微秒)。最后将计算后的距离除以58.0,得到测量距离的结果(单位:厘米)。
需要注意的是,由于pulseIn()函数要等待接收到指定电平的脉冲,因此会阻塞代码执行。此外,在pulseIn()函数中还可以设置超时时间,避免因为某些原因导致函数一直等待而无法返回。
✨Serial.println(distance)函数
方便在串口监视器来查看测量的距离是多少