这个小项目是基于Arduino设计的一款感应式智能开盖垃圾桶这个项目只要一点C语言的基础,懂得一点点物联网知识就可以,是一个刚入行物联网值得练手的小项目。
硬件准备
- Arduino UNO
- HC-SR04超声波模块
- SG90舵机
- 杜邦线若干
工作原理
当手靠近垃圾桶时,超声波传感器测出两者之间的距离,距离小于设定的阈值,舵机转动,垃圾桶盖打开。
接线方式
Arduino | 5V | GND | 引脚5 | 引脚8 | 引脚2 |
---|---|---|---|---|---|
舵机 | VCC(红) | GND(黑/褐) | 信号线(白/黄) | ||
超声波传感器 | VCC | GND | Trig | Echo |
代码
#include<Servo.h>
#define Trig 8
#define Echo 2
#define DuoPIN 5
Servo myDuoJi;
long gettime()
{
digitalWrite(Trig,HIGH);
delayMicroseconds(10);
digitalWrite(Trig,LOW);
return pulseIn(Echo,HIGH);
}
void initChaoShengBo()
{
pinMode(Echo,INPUT);
pinMode(Trig,OUTPUT);
}
void setup() {
initChaoShengBo();
myDuoJi.attach(DuoPIN);
Serial.begin(115200);
}
void loop() {
//获取距离
long dis;
dis = gettime()/58;
if(dis <10){
myDuoJi.write(90);
delay(1500);
}
else{
myDuoJi.write(180);
}
}
- 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
实物
补充 舵机和超声波 调试
舵机
接线
Arduino | 5V | GND | 引脚5 |
---|---|---|---|
舵机 | VCC(红) | GND(黑/褐) | 信号线(白/黄) |
舵机代码调试
#include<Servo.h>
#define DuoPIN 5
Servo myDuoJi;
void setup() {
myDuoJi.attach(DuoPIN);
Serial.begin(115200);
}
void loop() {
int cmd;
if(Serial.available()>0){
cmd = Serial.read();
if(cmd 1){
myDuoJi.write(90);
}
if(cmd 0){
myDuoJi.write(180);
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
通过串口工具调试舵机的转动角度
输入 0 或者输入 1 来控制舵机的转动(调整合适的角度)
超声波传感器
接线方式
Arduino | 5V | GND | 引脚8 | 引脚2 |
---|---|---|---|---|
超声波传感器 | VCC | GND | Trig | Echo |
#define Trig 8 #define Echo 2 #define BEEP 5 long gettime() { // 产生一个10us的高脉冲去触发TrigPin digitalWrite(Trig,HIGH); delayMicroseconds(10); digitalWrite(Trig,LOW);
<span class="token keyword">return</span> <span class="token function">pulseIn</span><span class="token punctuation">(</span>Echo<span class="token punctuation">,</span>HIGH<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
void initChaoShengBo()
{
pinMode(Echo,INPUT);
pinMode(Trig,OUTPUT);
}
void setup() {
initChaoShengBo();
pinMode(BEEP,OUTPUT);
digitalWrite(BEEP,HIGH);
Serial.begin(115200);//波特率设置为115200
}
void loop() {
//获取距离
long dis;
dis = gettime()/58;// 检测脉冲宽度,并计算出距离
Serial.print(dis);
Serial.println(“cm”);
if(dis<10){
digitalWrite(BEEP,LOW);
}
else{
digitalWrite(BEEP,HIGH);
}
delay(500);
}
- 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
通过串口工具的可以接收到超声波测的距离
为什么接收到的脉冲信号要除以58得到距离?
声音在干燥、摄氏 20度的空气中的传播速度大约为343米/秒,合34,300厘米/秒。
或者,我们作一下单位换算,34,300除以1,000,000厘米/微秒。
即为:0.0343厘米/微秒
再换一个角度,1/(0.0343 厘米/微秒)
即:29.15 微秒/厘米。
这就意味着,每291.5微秒表示10CM的距离。1厘米就是29.15微秒。
但是发送后到接收到回波,声音走过的是2倍的距离呀。
所以实际距离就是1厘米,对应58.3微秒。
实际上整个测距过程是测的发出声波到收到回波的时间,你的程序里的第一个distance实际上是时间us。
所以换成距离cm,要除以58。当然除以58.3可能更精确