在这篇文章中,我们将构建一个电路,可以测量道路和高速公路上任何车辆的速度。拟议的电路在怀疑车辆超速的地方保持静止。如果任何车辆超过限速,电路会立即发出警报。我们将查看如何测量车辆速度的代码、电路图和逻辑。
根据 75 年印度意外死亡报告,超速导致 2015% 的道路交通事故,这是一个巨大的数字。大多数交警试图拘留危险驾驶车辆超过城市限速的驾驶者。
并非每次交警都可以阻止超速车辆并向他们收费。因此,在怀疑驾驶者超速的地方安装了一种称为测速摄像头的设备,例如频繁发生事故的区域、十字路口等。
我们将构建类似于测速摄像头的东西,但要简化得多,它可以安装在校园内,例如学校,学院或IT园区,或者只是一个有趣的项目。
拟议的项目包括 16 x 2 LCD 显示屏,以展示每辆车通过的速度;两束激光束相距10米,以测量车辆的速度,同时中断这些激光束。
车辆通过时蜂鸣器会发出哔哔声;表示检测到车辆,每辆车的速度将显示在LCD显示屏上。当车辆超过速度限制时,蜂鸣器将连续发出哔哔声,车辆速度将显示在显示屏上。
注意:无论车辆超速还是欠速,车辆的速度都将显示在LCD上。
现在让我们看看测量速度的电路背后的逻辑。
我们都知道一个简单的公式,叫做速度-距离-时间公式。
速度=距离/时间。
• 速度以米每秒为单位,• 距离以米为单位,
• 时间以秒为单位。
要知道速度,我们必须知道车辆行驶的距离(例如“x”)以及覆盖该距离“x”所需的时间。
为此,我们按以下方式设置两个激光束和两个距离为 10 米的 LDR:
我们知道距离是固定的 10 米,现在我们必须知道等式中的时间。
时间将由Arduino计算,当车辆中断“启动激光”时,计时器开始,当车辆中断“结束激光”时,计时器停止并将值应用于方程Arduino将找到车辆的速度。
请注意,车辆的速度只会在一个方向上检测,即启动激光以停止激光,要在另一个方向检测车辆,必须在相反的方向上放置另一个相同的设置。因此,这是学校,拼贴画等场所的理想选择。他们有进出门的地方。
现在让我们看一下示意图:
Arduino和显示器之间的连接:
上面的电路是不言自明的,只需按照电路连接接线即可。调整 10K 电位计以调整显示对比度。
其他接线细节:
上述电路由Arduino,4个按钮,两个10K下拉电阻(不要改变电阻的值),两个LDR和一个蜂鸣器组成。4个按钮的功能将很快解释。现在让我们看看如何正确安装
LDR。
LDR必须正确遮挡阳光,只有激光束才能击中LDR。确保您的激光模块足够强大,可以在明亮的阳光下工作。
您可以将PVC管用于上述目的,并在管内将其涂成黑色;不要忘记覆盖前部,利用您的创造力来完成这项工作。
程序代码:
// ----------- Developed by R.GIRISH ---------//
#include 《LiquidCrystal.h》
#include《EEPROM.h》
const int rs = 7;
const int en = 6;
const int d4 = 5;
const int d5 = 4;
const int d6 = 3;
const int d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const int up = A0;
const int down = A1;
const int Set = A2;
const int change = A3;
const int start = 8;
const int End = 9;
const int buzzer = 10;
const float km_h = 3.6;
int distance = 10; // In meters.
int variable = 0;
int count = 0;
int address = 0;
int value = 100;
int speed_address = 1;
int speed_value = 0;
int i = 0;
float ms = 0;
float Seconds = 0;
float Speed = 0;
boolean buzz = false;
boolean laser = false;
boolean x = false;
boolean y = false;
void setup()
{
pinMode(start, INPUT);
pinMode(End, INPUT);
pinMode(up, INPUT);
pinMode(down, INPUT);
pinMode(Set, INPUT);
pinMode(change, INPUT);
pinMode(buzzer, OUTPUT);
digitalWrite(change, HIGH);
digitalWrite(up, HIGH);
digitalWrite(down, HIGH);
digitalWrite(Set, HIGH);
digitalWrite(buzzer, LOW);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F(“ Vehicle Speed”));
lcd.setCursor(0, 1);
lcd.print(F(“ detector”));
delay(1500);
if (EEPROM.read(address) != value)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“Set Speed Limit”);
lcd.setCursor(0, 1);
lcd.print(“km/h:”);
lcd.setCursor(6, 1);
lcd.print(count);
while (x == false)
{
if (digitalRead(up) == LOW)
{
lcd.setCursor(6, 1);
count = count + 1;
lcd.print(count);
delay(200);
}
if (digitalRead(down) == LOW)
{
lcd.setCursor(6, 1);
count = count - 1;
lcd.print(count);
delay(200);
}
if (digitalRead(Set) == LOW)
{
speed_value = count;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“Speed Limit is”);
lcd.setCursor(0, 1);
lcd.print(“set to ”);
lcd.print(speed_value);
lcd.print(“ km/h”);
EEPROM.write(speed_address, speed_value);
delay(2000);
x = true;
}
}
EEPROM.write(address, value);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“Testing Laser”);
lcd.setCursor(0, 1);
lcd.print(“Alignment.。..”);
delay(1500);
while (laser == false)
{
if (digitalRead(start) == HIGH && digitalRead(End) == HIGH)
{
laser = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“Laser Alignment”);
lcd.setCursor(0, 1);
lcd.print(“Status: OK”);
delay(1500);
}
while (digitalRead(start) == LOW && digitalRead(End) == LOW)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“Both Lasers are”);
lcd.setCursor(0, 1);
lcd.print(“not Aligned”);
delay(1000);
}
while (digitalRead(start) == LOW)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“Start Laser not”);
lcd.setCursor(0, 1);
lcd.print(“Aligned”);
delay(1000);
}
while (digitalRead(End) == LOW)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“End Laser not”);
lcd.setCursor(0, 1);
lcd.print(“Aligned”);
delay(1000);
}
}
lcd.clear();
}
void loop()
{
if (digitalRead(change) == LOW)
{
change_limit();
}
if (digitalRead(start) == LOW)
{
variable = 1;
buzz = true;
while (variable == 1)
{
ms = ms + 1;
delay(1);
if (digitalRead(End) == LOW)
{
variable = 0;
}
}
Seconds = ms / 1000;
ms = 0;
}
if (Speed 《 EEPROM.read(speed_address))
{
y = true;
}
Speed = distance / Seconds;
Speed = Speed * km_h;
if (isinf(Speed))
{
lcd.setCursor(0, 0);
lcd.print(“Speed:0.00”);
lcd.print(“ km/h ”);
}
else
{
lcd.setCursor(0, 0);
lcd.print(“Speed:”);
lcd.print(Speed);
lcd.print(“km/h ”);
lcd.setCursor(0, 1);
lcd.print(“ ”);
if (buzz == true)
{
buzz = false;
digitalWrite(buzzer, HIGH);
delay(100);
digitalWrite(buzzer, LOW);
}
if (Speed 》 EEPROM.read(speed_address))
{
lcd.setCursor(0, 0);
lcd.print(“Speed:”);
lcd.print(Speed);
lcd.print(“km/h ”);
lcd.setCursor(0, 1);
lcd.print(“Overspeed Alert!”);
if (y == true)
{
y = false;
for (i = 0; i 《 45; i++)
{
digitalWrite(buzzer, HIGH);
delay(50);
digitalWrite(buzzer, LOW);
delay(50);
}
}
}
}
}
void change_limit()
{
x = false;
count = EEPROM.read(speed_address);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“Set Speed Limit”);
lcd.setCursor(0, 1);
lcd.print(“km/h:”);
lcd.setCursor(6, 1);
lcd.print(count);
while (x == false)
{
if (digitalRead(up) == LOW)
{
lcd.setCursor(6, 1);
count = count + 1;
lcd.print(count);
delay(200);
}
if (digitalRead(down) == LOW)
{
lcd.setCursor(6, 1);
count = count - 1;
lcd.print(count);
delay(200);
}
if (digitalRead(Set) == LOW)
{
speed_value = count;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“Speed Limit is”);
lcd.setCursor(0, 1);
lcd.print(“set to ”);
lcd.print(speed_value);
lcd.print(“ km/h”);
EEPROM.write(speed_address, speed_value);
delay(2000);
x = true;
lcd.clear();
}
}
}
// ----------- Developed by R.GIRISH ---------//
现在让我们看看如何操作这个电路:
•完成您的电路并上传代码。
• 两个激光器/LDR 之间的距离应正好为 10 米,不少于或不超过,否则速度将计算错误(如第一张图所示)。
•激光和LDR之间的距离可以由您选择的和情况决定。
• 电路将检查激光与LDR的未对准,如果有,请根据LCD上显示的信息进行更正。
•最初,赛道会要求您输入以公里/小时为单位的速度限制值,超过该值赛道会发出警报,通过按向上(S1)和向下(S2),您可以更改显示屏上的数字并按设置(S3),该值将被保存。
•要更改此速度限制,请按S4按钮,您可以设置新的速度限制。
•现在以30公里/小时的速度驾驶摩托车并中断激光束,电路应该向您显示一个非常接近30 km / h的数字。
全部0条评论
快来发表一下你的评论吧 !