Mesafeye Göre LED ve Buzzer Uyarılı Park Sensörü
HC-SR04 ultrasonik mesafe sensörü, LED’ler ve buzzer kullanarak mesafeye göre değişen uyarı veren gelişmiş park sensörü yapacağız.
Bu yazıda profesyonel anlamda park sensörü yapmak için gerekli Arduino devre şemasını ve Arduino kodlarını inceleyeceğiz.
İnternette paylaşılan Arduino park sensörü uygulamalarında genellikle mesafe sensöründen alınan uzaklık değerine göre yalnızca LED yakılır. Buzzer kullanımı ise çoğu zaman sadece en yakın mesafede yapılır.
Bu uygulamada arabalardaki park sensörlerine benzer şekilde mesafeye göre değişen aralıklarla buzzer’dan sesli uyarı alınır. Aynı zamanda mesafe durumuna göre LED’ler de kademeli olarak yanar.
- Arduino Uno
- HC-SR04 Ultrasonik Mesafe Sensörü
- 5 adet LED
- LED’ler için uygun dirençler
- Buzzer
- Breadboard
- Jumper kablolar
LED bağlantılarında her LED için seri direnç kullanılmalıdır. HC-SR04 sensöründe VCC, GND, Trig ve Echo pinleri bulunur.
Park sensörü yaparken mesafeye göre hem sesli hem de görüntülü uyarı alınır. Ultrasonik sensörden uzaklık değeri okumak için önce Trig pinine kısa bir tetikleme sinyali gönderilir. Echo pininden dönen süre değeri okunarak mesafe hesaplanır.
Mesafe hesabında (sure / 29.1) / 2 formülü veya pratik olarak sure / 58 kullanılabilir. Bu değer yaklaşık santimetre cinsinden uzaklığı verir.
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
sure = pulseIn(echoPin, HIGH);
uzaklik = (sure / 29.1) / 2;
Buzzerdan aralıklarla ses almak için millis() komutu kullanılabilir. Bu sayede delay() ile programı tamamen bekletmeden, belirli aralıklarla buzzer durumu değiştirilebilir.
Mesafe azaldıkça buzzer daha kısa aralıklarla ses verir. Mesafe uzaklaştığında buzzer susar.
unsigned long eskiZaman = 0;
void ses(int zaman) {
if (millis() - eskiZaman > zaman) {
digitalWrite(buzzer, !digitalRead(buzzer));
eskiZaman = millis();
}
}
int trigPin = 10;
int echoPin = 11;
long sure;
long uzaklik;
int led1 = 2;
int led2 = 3;
int led3 = 4;
int led4 = 5;
int led5 = 6;
int buzzer = 7;
unsigned long eskiZaman = 0;
void ses(int zaman) {
if (millis() - eskiZaman > zaman) {
digitalWrite(buzzer, !digitalRead(buzzer));
eskiZaman = millis();
}
}
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(buzzer, OUTPUT);
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
sure = pulseIn(echoPin, HIGH, 30000);
if (sure == 0) {
uzaklik = 999;
} else {
uzaklik = (sure / 29.1) / 2;
}
if (uzaklik < 40) {
digitalWrite(led1, HIGH);
ses(400);
} else {
digitalWrite(led1, LOW);
}
if (uzaklik < 30) {
digitalWrite(led2, HIGH);
ses(300);
} else {
digitalWrite(led2, LOW);
}
if (uzaklik < 20) {
digitalWrite(led3, HIGH);
ses(200);
} else {
digitalWrite(led3, LOW);
}
if (uzaklik < 10) {
digitalWrite(led4, HIGH);
ses(100);
} else {
digitalWrite(led4, LOW);
}
if (uzaklik < 5) {
digitalWrite(led5, HIGH);
ses(50);
} else {
digitalWrite(led5, LOW);
}
if (uzaklik > 45) {
digitalWrite(buzzer, LOW);
}
}
Verilen kaynak kodun bazı if satırları HTML içinde bozulmuştu. Bu sürümde aynı mantık korunarak kod çalışır hale getirildi.
const int trigPin = 10;
const int echoPin = 11;
const int ledler[] = {2, 3, 4, 5, 6};
const int ledSayisi = 5;
const int buzzer = 7;
unsigned long eskiZaman = 0;
bool buzzerDurum = LOW;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
for (int i = 0; i < ledSayisi; i++) {
pinMode(ledler[i], OUTPUT);
}
pinMode(buzzer, OUTPUT);
digitalWrite(buzzer, LOW);
}
void loop() {
long uzaklik = mesafeOlc();
ledleriAyarla(uzaklik);
buzzerAyarla(uzaklik);
}
long mesafeOlc() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long sure = pulseIn(echoPin, HIGH, 30000);
if (sure == 0) {
return 999;
}
return sure / 58;
}
void ledleriAyarla(long uzaklik) {
digitalWrite(ledler[0], uzaklik < 40 ? HIGH : LOW);
digitalWrite(ledler[1], uzaklik < 30 ? HIGH : LOW);
digitalWrite(ledler[2], uzaklik < 20 ? HIGH : LOW);
digitalWrite(ledler[3], uzaklik < 10 ? HIGH : LOW);
digitalWrite(ledler[4], uzaklik < 5 ? HIGH : LOW);
}
void buzzerAyarla(long uzaklik) {
int aralik;
if (uzaklik < 5) {
aralik = 50;
} else if (uzaklik < 10) {
aralik = 100;
} else if (uzaklik < 20) {
aralik = 200;
} else if (uzaklik < 30) {
aralik = 300;
} else if (uzaklik < 40) {
aralik = 400;
} else {
digitalWrite(buzzer, LOW);
buzzerDurum = LOW;
return;
}
if (millis() - eskiZaman >= aralik) {
buzzerDurum = !buzzerDurum;
digitalWrite(buzzer, buzzerDurum);
eskiZaman = millis();
}
}
Bu sürümde mesafe ölçümü, LED kontrolü ve buzzer kontrolü ayrı fonksiyonlara ayrıldı. Ayrıca pulseIn() için zaman aşımı eklendi.
Koddaki 40, 30, 20, 10 ve 5 cm eşik değerleri ihtiyaca göre değiştirilebilir. Aynı şekilde buzzer aralıkları olan 400, 300, 200, 100 ve 50 milisaniye değerleri de farklı uyarı davranışları elde etmek için düzenlenebilir.
hocam şiyah dirençmi
YanıtlaSilJumper Kablo
Sil