OLED Ekranlı Mesafe Ölçer
Orta40 dkHC-SR04'ün ölçtüğü mesafeyi 0.96" OLED ekranda gösteren, bilgisayarsız çalışan bir ölçer: üstte büyük yazıyla mesafe, altta son 128 ölçümün sağa doğru kayan çubuk grafiği. Elini yaklaştırıp uzaklaştırdıkça grafiğin dalgalandığını görürsün. I2C ile ekran sürmeyi, Adafruit GFX ile yazı ve çizgi çizmeyi, ölçümleri bir dizide döngüsel olarak saklamayı ve delay yerine millis() ile zamanlamayı öğretir. Kitaplık Yöneticisi'nden "Adafruit SSD1306" ve "Adafruit GFX" kütüphaneleri kurulur.
Uygulamada adım adım yapGerekli malzemeler
1 × Arduino Uno R3
1 × Breadboard 830 Pin (MB-102)
1 × HC-SR04 Ultrasonik Mesafe Sensörü
1 × 0.96" OLED Ekran (SSD1306, I2C)
6 × Jumper Kablo - Erkek/Erkek
4 × Jumper Kablo - Erkek/Dişi
Bağlantı adımları
- 1
Güç sıralarını bağla (5V ve GND)

Kırmızı jumper kabloyu Arduino'nun güç başlığındaki 5V pinine tak, diğer ucunu breadboard'un alttaki kırmızı çizgili (+) güç sırasına bağla. Siyah kabloyu aynı başlıktaki GND pinlerinden birine tak, diğer ucunu alttaki mavi çizgili (−) güç sırasına bağla. Uno'da tek 5V pini var; bu iki sıra 5V ve GND'yi hem sensöre hem ekrana dağıtacak.
- Arduino 5V → alttaki kırmızı çizgili (+) sıra (kırmızı kablo)
- Arduino GND → alttaki mavi çizgili (−) sıra (siyah kablo)
- 2
HC-SR04'ü tak ve bağla

HC-SR04'ü breadboard'un üst yarısına dik olarak, "gözleri" ölçeceği yöne bakacak şekilde tak; dört bacağı soldan sağa VCC 7., TRIG 8., ECHO 9., GND 10. sütunda olsun. Kırmızı bir kabloyla 7. sütunu (VCC) alttaki (+) sıraya, siyah bir kabloyla 10. sütunu (GND) alttaki (−) sıraya bağla. Mavi kabloyla Arduino'nun 7 numaralı pinini 8. sütuna (TRIG_PIN 7), sarı kabloyla 8 numaralı pinini 9. sütuna (ECHO_PIN 8) bağla. Pin numaralarıyla sütun numaraları farklı; kabloları sütunlara göre tak.
- HC-SR04 VCC → 7. sütun, üst yarı
- HC-SR04 TRIG → 8. sütun, üst yarı
- HC-SR04 ECHO → 9. sütun, üst yarı
- HC-SR04 GND → 10. sütun, üst yarı
- 7. sütun, üst yarı → alttaki kırmızı çizgili (+) sıra (kırmızı kablo)
- 10. sütun, üst yarı → alttaki mavi çizgili (−) sıra (siyah kablo)
- Arduino pin 7 → 8. sütun, üst yarı (mavi kablo)
- Arduino pin 8 → 9. sütun, üst yarı (sarı kablo)
- 3
OLED ekranı bağla

Ekranı breadboard'a takma; dört pinine erkek-dişi jumper kabloların dişi uçlarını tak. VCC'yi alttaki (+) sıraya, GND'yi alttaki (−) sıraya bağla. SDA'yı kahverengi kabloyla Arduino'nun A4 pinine, SCL'yi yeşil kabloyla A5 pinine bağla. Pinlerin sırası ekrandan ekrana değişebilir (bazılarında VCC önce gelir): kablolamadan önce kartın üzerindeki yazıları oku. Bu ekranlar 5V ile de çalışır; I2C sayesinde 128x64 pikselin hepsi bu iki veri kablosuyla sürülür.
- OLED ekran GND → alttaki mavi çizgili (−) sıra (siyah kablo)
- OLED ekran VCC → alttaki kırmızı çizgili (+) sıra (kırmızı kablo)
- Arduino A4 → OLED ekran SDA (kahverengi kablo)
- Arduino A5 → OLED ekran SCL (yeşil kablo)
Arduino kodu
// Kitaplık Yöneticisi'nden kurulacaklar:
// "Adafruit SSD1306" ve "Adafruit GFX"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// HC-SR04'ün pinleri
const int TRIG_PIN = 7;
const int ECHO_PIN = 8;
// Grafiğin tavanı (cm): ötesi en üstte
const int MAX_CM = 100;
// Grafik alanı: ekranın alttaki 40 satırı
const int GRAPH_TOP = 24;
const int GRAPH_H = 40;
// Ölçümler arası süre (ms)
const unsigned long MEASURE_EVERY = 100;
// 128x64 ekran; I2C adresi çoğunda 0x3C
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
// Son 128 ölçüm, her ekran sütununa bir
byte history[128];
int newest = 0;
unsigned long lastMeasure = 0;
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Serial.begin(9600);
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED bulunamadı");
// Ekran yoksa burada dur
while (true) {}
}
oled.setTextColor(SSD1306_WHITE);
}
// Mesafe (cm); yankı gelmezse -1
int measureCm() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
unsigned long echo = pulseIn(ECHO_PIN, HIGH, 30000);
if (echo == 0) {
return -1;
}
return echo / 58;
}
// Üstte mesafe, altta son ölçümler
void draw(int cm) {
oled.clearDisplay();
oled.setTextSize(2);
oled.setCursor(0, 0);
if (cm < 0) {
oled.print("-- cm");
} else {
oled.print(cm);
oled.print(" cm");
}
// En eski ölçüm solda, en yenisi sağda
for (int x = 0; x < 128; x++) {
int h = history[(newest + 1 + x) % 128];
int bottom = GRAPH_TOP + GRAPH_H - 1;
oled.drawFastVLine(x, bottom - h, h + 1, SSD1306_WHITE);
}
oled.display();
}
void loop() {
if (millis() - lastMeasure < MEASURE_EVERY) {
return;
}
lastMeasure = millis();
int cm = measureCm();
// Ölçülemeyen ya da çok uzak: en üstte
int shown = (cm < 0 || cm > MAX_CM) ? MAX_CM : cm;
newest = (newest + 1) % 128;
history[newest] = map(shown, 0, MAX_CM, 0, GRAPH_H - 1);
draw(cm);
if (cm < 0) {
Serial.println("Mesafe: ölçülemedi");
} else {
Serial.print("Mesafe: ");
Serial.print(cm);
Serial.println(" cm");
}
}
Seri Monitörde göreceğin
Mesafe: 87 cm Mesafe: 64 cm Mesafe: 31 cm Mesafe: 12 cm Mesafe: ölçülemedi
Bir kablo yerinde değilse
OLED bulunamadı
Sonuç
Ekranın üstünde büyük yazıyla mesafe (örneğin 25 cm), altında her 0,1 saniyede bir sağa kayan çubuk grafik görünür: çubuk ne kadar uzunsa engel o kadar uzaktadır. Elini sensöre yaklaştırınca çubuklar kısalır, uzaklaştırınca uzar; 1 metreden uzak ya da ölçülemeyen değerler en üstte durur. Ekran hiç yanmıyorsa Seri Monitöre bak: "OLED bulunamadı" yazıyorsa SDA'nın A4'te, SCL'nin A5'te olduğunu ve VCC/GND'yi kontrol et; ekranının adresi 0x3D olabilir, koddaki 0x3C'yi 0x3D yap. Mesafe hep "--" ise TRIG ile ECHO kablolarını kontrol et.
Uygulamada her bağlantıyı tek tek işaretle, envanterindeki parçalarla eşleştir ve kaldığın yerden devam et.
Uygulamada adım adım yap