/* 第三周项目:测距报警器
实现的功能: 舵机带动超声波测距传感器转动,(转动角度0-180,再反向180-0),每转动x度测量一次障碍物的距离dis。当障碍物速度小于等于为20厘米/秒,判定为低速移动物体,忽略,舵机继续转动。当障碍物速度大于20厘米/秒,计算障碍物垂直距离dis_min;当障碍物垂直距离dis_min小于10cm时,舵机停止转动,"监视"障碍物动向,并且蜂鸣器报警;当障碍物垂直距离dis_min大于安全距离10cm时,舵机继续转动测量。
需要的主要器件:(1)超声波测距传感器X1个;(2)舵机X1个;(3)杜邦线若干,排线若干,led若干;
注意的问题:(1)根据舵机的工作原理,它只能0-180度转动,360度转动时需要增加舵机个数; (2)超声波测距传感器US-100自带温度补偿;可工作在串口和电平状态等,本项目要求它工作于串口状态, 要带上跳线帽; (3)本实验按实际应用的1:10缩小,假设实际中的安全距离为100厘米,人体步行的平均速度200厘米/秒。
学号:220201978
姓名:张慧琳
班级:物联202
*/
#include <Servo.h>
int echo = 2;
int trig = 3;
Servo myservo;//舵机对象
////////////////////////////////////////////////////////
int distance()//测距函数distance
{
digitalWrite(trig,LOW);
delayMicroseconds(15);// 发出持续时间为 15us到 trigger脚驱动超声波检测
digitalWrite(trig,HIGH);
delayMicroseconds(15);
digitalWrite(trig,LOW);
int distance = pulseIn(echo,HIGH);// 接收脉冲的时间
// dist_mm =(time echo us * 0.34mm/us)/ 2 (mm)
distance= distance/58;//测得的距离转换为厘米
Serial.println(distance);//输出距离值
delay(50);
return distance;
}
//////////////////////////////////////////////////////////////////////
int report(int angle_fun) { //报告速度,垂直距离以及是否报警
int dis_fun = 0; //障碍物的距离distance,单位厘米cm
int dis_minfun = 0; //障碍物与目标的垂直距离,单位厘米
int v_fun = 0; //障碍物移动的速度,单位厘米/秒
int dis1_fun = 0;
float pi = 3.141592;
int buzzpin = 8; //led的引脚D4
//angle_fun=angle_fun+90;
myservo.write(angle_fun); // 指定舵机转向的角度
Serial.print("The angle is: "); //输出结果至串口监视器
Serial.print(angle_fun, DEC);
Serial.println("degree");
dis_fun = distance(); //调用测距函数
Serial.print("dis_fun is: ");
Serial.println(dis_fun);
delay(100);
dis1_fun = distance();
v_fun = (dis_fun - dis1_fun) * 10+20; //速度厘米/秒
Serial.print("The rate is: "); //输出结果至串口监视器
Serial.print(v_fun, DEC);
Serial.println("cm/s");
dis_minfun = abs(sin(angle_fun * pi / 180) * dis1_fun); //计算垂直距离
Serial.print("The minimum of distance is: "); //输出结果至串口监视器
Serial.print(dis_minfun, DEC);
Serial.println("cm");
//delay(1000);
{ if ((v_fun > 20) && (dis_minfun <= 10)) //如果速度大于20厘米/秒并且处置距离小于10,报警
{
digitalWrite(buzzpin, HIGH); //报警
delay(5000);
return 1;
}
else
{ digitalWrite(buzzpin, LOW);
return 0;
}
}
}
//////////////////////////////////////////////////////////
int angle = 0; //舵机的转动角度
int i = 5; //舵机每次步进转动的角度
int num;//报警提示
int buzzpin = 4; //蜂鸣器的引脚D4
/////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(9600); //设置连接PC的串口波特率为 9600bps.
pinMode(echo,INPUT);
pinMode(trig,OUTPUT);
pinMode(buzzpin, OUTPUT);
myservo.attach(11); // 舵机接arduinoD11脚
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//补充loop()函数
void loop() {
for (angle=0;angle <= 160;angle +=i){
distance();
report (angle);
myservo.write(angle);
delay(20);
}
for(angle=160;angle >= 0;angle -=i){
distance();
report (angle);
myservo.write(angle);
delay(20);
}
}