在這篇文章中,我們將構建一個電路,可以測量道路和高速公路上任何車輛的速度。擬議的電路在懷疑車輛超速的地方保持靜止。如果任何車輛超過限速,電路會立即發(fā)出警報。我們將查看如何測量車輛速度的代碼、電路圖和邏輯。
根據 75 年印度意外死亡報告,超速導致 2015% 的道路交通事故,這是一個巨大的數字。大多數交警試圖拘留危險駕駛車輛超過城市限速的駕駛者。
并非每次交警都可以阻止超速車輛并向他們收費。因此,在懷疑駕駛者超速的地方安裝了一種稱為測速攝像頭的設備,例如頻繁發(fā)生事故的區(qū)域、十字路口等。
我們將構建類似于測速攝像頭的東西,但要簡化得多,它可以安裝在校園內,例如學校,學院或IT園區(qū),或者只是一個有趣的項目。
擬議的項目包括 16 x 2 LCD 顯示屏,以展示每輛車通過的速度;兩束激光束相距10米,以測量車輛的速度,同時中斷這些激光束。
車輛通過時蜂鳴器會發(fā)出嗶嗶聲;表示檢測到車輛,每輛車的速度將顯示在LCD顯示屏上。當車輛超過速度限制時,蜂鳴器將連續(xù)發(fā)出嗶嗶聲,車輛速度將顯示在顯示屏上。
注意:無論車輛超速還是欠速,車輛的速度都將顯示在LCD上。
現(xiàn)在讓我們看看測量速度的電路背后的邏輯。
我們都知道一個簡單的公式,叫做速度-距離-時間公式。
速度=距離/時間。
? 速度以米每秒為單位,? 距離以米為單位,
? 時間以秒為單位。
要知道速度,我們必須知道車輛行駛的距離(例如“x”)以及覆蓋該距離“x”所需的時間。
為此,我們按以下方式設置兩個激光束和兩個距離為 10 米的 LDR:
我們知道距離是固定的 10 米,現(xiàn)在我們必須知道等式中的時間。
時間將由Arduino計算,當車輛中斷“啟動激光”時,計時器開始,當車輛中斷“結束激光”時,計時器停止并將值應用于方程Arduino將找到車輛的速度。
請注意,車輛的速度只會在一個方向上檢測,即啟動激光以停止激光,要在另一個方向檢測車輛,必須在相反的方向上放置另一個相同的設置。因此,這是學校,拼貼畫等場所的理想選擇。他們有進出門的地方。
現(xiàn)在讓我們看一下示意圖:
Arduino和顯示器之間的連接:
上面的電路是不言自明的,只需按照電路連接接線即可。調整 10K 電位計以調整顯示對比度。
其他接線細節(jié):
上述電路由Arduino,4個按鈕,兩個10K下拉電阻(不要改變電阻的值),兩個LDR和一個蜂鳴器組成。4個按鈕的功能將很快解釋。現(xiàn)在讓我們看看如何正確安裝
LDR。
LDR必須正確遮擋陽光,只有激光束才能擊中LDR。確保您的激光模塊足夠強大,可以在明亮的陽光下工作。
您可以將PVC管用于上述目的,并在管內將其涂成黑色;不要忘記覆蓋前部,利用您的創(chuàng)造力來完成這項工作。
程序代碼:
// ----------- 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 ---------//
現(xiàn)在讓我們看看如何操作這個電路:
?完成您的電路并上傳代碼。
? 兩個激光器/LDR 之間的距離應正好為 10 米,不少于或不超過,否則速度將計算錯誤(如第一張圖所示)。
?激光和LDR之間的距離可以由您選擇的和情況決定。
? 電路將檢查激光與LDR的未對準,如果有,請根據LCD上顯示的信息進行更正。
?最初,賽道會要求您輸入以公里/小時為單位的速度限制值,超過該值賽道會發(fā)出警報,通過按向上(S1)和向下(S2),您可以更改顯示屏上的數字并按設置(S3),該值將被保存。
?要更改此速度限制,請按S4按鈕,您可以設置新的速度限制。
?現(xiàn)在以30公里/小時的速度駕駛摩托車并中斷激光束,電路應該向您顯示一個非常接近30 km / h的數字。
-
檢測電路
+關注
關注
13文章
305瀏覽量
58129 -
DIY
+關注
關注
176文章
886瀏覽量
348279
發(fā)布評論請先 登錄
相關推薦
評論