亲,“电路城”已合并升级到更全、更大、更强的「新与非网」。点击查看「新与非网」

本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于HC-SR04超声波传感器的测速计

发布时间:2021-06-05
分享到:

基于HC-SR04超声波传感器的测速计

发布时间:2021-06-05
分享到:

HC-SR 04超声波传感器最常用于测量距离,但是该项目将讲解如何使用此传感器测量物体的移动速度,即在短时间内进行两次距离测量,distance2-distance1 =给定时间的距离速度,如果在在1秒钟的时间内进行测量,那么我们得到的物体移动速度将以cm / s为单位,还可将测量结果显示在LCD屏上。

如果所测对象正在移动,则LCD第一行显示距离,第二行显示速度;还有一个LED发出信号,指示物体放置的距离。如果距离小于5厘米,则LED持续亮起。随着距离的增加,LED开始以取决于物体距离的速度闪烁。如果物体移开,则闪烁会变慢,反之亦然。当物体沿相反方向移动时,显示屏上显示的速度带有负号。

硬件部件:

 示意图:

代码:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);// RS,E,D4,D5,D6,D7
//定义引脚号
const int trigPin = 9;
const int echoPin = 10;

// 定义变量
long duration;
int distance1=0;
int distance2=0;
double Speed=0;
int distance=0;

void setup() 
{
lcd.begin(16, 2);// LCD 16X2
pinMode(trigPin, OUTPUT); // 将  trig引脚设为输出
pinMode(echoPin, INPUT); // 将echo引脚设置为输入
pinMode( 7 , OUTPUT);
Serial.begin(9600); // 开始串行通讯
}


void loop() 
{

//计算速度
   distance1 = ultrasonicRead(); //在下面调用ultrasoninicRead()函数
   
   delay(1000);//留出1秒的时间间隔
   
   distance2 = ultrasonicRead(); //在下面调用ultrasoninicRead()函数
   
   //公式的距离变化除以时间变化
   Speed = (distance2 - distance1)/1.0; //由于时间间隔为1秒,因此我们将其除以1
   
//显示速度
  Serial.print("Speed in cm/s  :"); 
  Serial.println(Speed);
lcd.setCursor(0,1); 
lcd.print("Speed  cm/s ");
lcd.print(Speed); 

// LED指示灯
if (distance >0 && distance <5) 
{
    digitalWrite( 7 , HIGH);
    delay(50);                  // 等待一秒钟
}

if (distance > 5 && distance <10 ) 
{
    digitalWrite( 7 , HIGH);
    delay(50);                  // 等待一秒钟
    digitalWrite( 7 , LOW);    // 关闭LED
    delay(50);                  // 等待一秒钟
}

if (distance >10  && distance < 20) 
{
    digitalWrite( 7 , HIGH);
    delay(210);                  //等待一秒钟
    digitalWrite( 7 , LOW);    // 关闭LED
    delay(210);                  // 等待一秒钟
}

if (distance >20  && distance < 35) 
{
    digitalWrite( 7 , HIGH);
    delay(610);                  // 等待一秒钟
    digitalWrite( 7 , LOW);    //关闭LED
    delay(610);                  // 等待一秒钟
}


}

float ultrasonicRead ()
{
// 清除trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);

// 将trigPin设置为HIGH状态10微秒
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

// 读取echoPin,返回声波传播时间(以微秒为单位)
duration = pulseIn(echoPin, HIGH);

//计算距离
distance= duration*0.034/2;

// 在串行监视器上打印距离
Serial.print("Distance in cm : ");
Serial.println(distance);
lcd.setCursor(0,0);
lcd.print("Dist. in cm ");
lcd.print(distance);
lcd.print("   ");
return distance;

}

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论