Kod Ara

Arduino Kodu ve HC-SR04 Ultrasonik Mesafe Sensörü ile SSD1306 OLED Ekran için Video

Arduino Kodu ve HC-SR04 Ultrasonik Mesafe Sensörü ile SSD1306 OLED Ekran için Video

Bu eğitimde, HC-SR04 ultrasonik mesafe sensörünü SSD1306 OLED ekranla birlikte kullanarak mesafe ölçümlerini görselleştirmeyi göstereceğiz. Bu proje, bir bilgisayara ihtiyaç duymadan mesafe ölçmenizi sağlar ve robotik dahil çeşitli uygulamalar için idealdir. Bu projenin sonunda, mesafe okumalarını doğrudan OLED ekranda gösteren işlevsel bir kuruluma sahip olacaksınız.

How HC-SR04 ulrasonic sensor work
SSD1306 OLED display

Devam ederken, her iki bileşen için gereken bağlantıları açıklayacağım ve bu bileşenleri entegre eden Arduino kodunun adım adım açıklamasını yapacağım. Bu, sensörün mesafeyi nasıl ölçtüğünü ve bu veriyi OLED ekrana nasıl aktardığınızı anlamanıza yardımcı olacaktır. Daha fazla açıklama için bu eğitimle ilişkili videoya başvurabilirsiniz (videoda 00:00).

Donanım Açıklaması

Bu projenin ana bileşenleri HC-SR04 ultrasonik mesafe sensörü ve SSD1306 OLED ekrandır. HC-SR04, ultrasonik ses dalgaları kullanarak çalışır; tetik pini üzerinden bir ses darbesi gönderir ve yankı pininde yankıyı dinler. Sesin geri dönmesi için geçen süreyi hesaplayarak bir nesneye olan mesafeyi belirleyebilir. Bu sensör, tipik olarak 400-500 cm'ye kadar olan kısa mesafe ölçümleri için çok etkilidir.

SSD1306 OLED ekran, metin ve grafik görüntülemenizi sağlayan bir I2C arayüzlü ekrandır. İki pin üzerinden iletişim kurar: SDA (veri hattı) ve SCL (saat hattı). Kurulumumuzda bu pinler belirli Arduino pinlerine bağlanarak kolay entegrasyon ve kontrol sağlar.

Veri Sayfası Detayları

ÜreticiÇeşitli
Parça numarasıHC-SR04
Mantık/IO voltajı5 V
Besleme voltajı5 V
Çıkış akımı (kanal başına)15 mA
Tepe akımı (kanal başına)20 mA
PWM frekans kılavuzuYok
Giriş mantık eşikleri0.3*Vcc ila 0.7*Vcc
Gerilim düşümü / RDS(on) / doyumYok
Termal sınırlar0-70 °C
Paket4 pinli modül
Notlar / varyantlarStandart modül

  • Her iki bileşen için doğru güç kaynağını (5 V) sağlayın.
  • I2C iletişimi için gerekirse pull-up dirençleri kullanın.
  • Paraziti önlemek için tetik ve yankı hatlarını kısa tutun.
  • Doğru okumalar için ultrasonik sensörün yönünü kontrol edin.
  • Mekanik titreşimleri önlemek için ekran için sabit bir yüzey kullanın.

Bağlantı Talimatları

Arduino wiring for HC-SR04 ultrasonic SSD1306 128x64 OLED
Arduino wiring for HC-SR04 ultrasonic SSD1306 128x64 OLED

HC-SR04 ultrasonik sensörü bağlamak için, VCC pinini (genellikle kırmızı) Arduino'daki 5V pinine bağlayarak başlayın. Ardından, GND pinini (genellikle siyah veya sarı) Arduino'nun GND pinlerinden birine bağlayın. Tetik pini (genellikle mavi) Arduino'daki dijital pin 12'ye, yankı pini (genellikle yeşil) ise dijital pin 11'e bağlanmalıdır.

SSD1306 OLED ekran için, VCC pinini Arduino'daki 5V pinine ve GND pinini GND'ye bağlayın. SCL pini Arduino'daki A5 pinine, SDA pini ise A4 pinine bağlanmalıdır. Özel I2C pinlerine sahip farklı bir Arduino modeli kullanıyorsanız, ekranı doğrudan bu pinlere bağlayın.

Kod Örnekleri ve Açıklaması

Kurulum fonksiyonunda, ekranı ve seri iletişimi başlatıyoruz. Aşağıdaki alıntı, ekranın nasıl kurulduğunu gösterir:

void setup() {
   Serial.begin(9600);// seri monitörü 9600 baud ile ayarla
   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // I2C adresi 0x3D ile başlat
}

Burada, ekran I2C adresiyle başlatılır ve Arduino ile iletişim kurması sağlanır. Seri monitör de mesafe değerlerini yazdırmak için ayarlanır.

Ana döngüde, ekranı temizliyor, mesafeyi ölçüyor ve yazdırıyoruz. Aşağıdaki kod parçası, mesafe ölçümünü nasıl ele aldığımızı gösterir:

void loop() {
   display.clearDisplay();
   String distance  = String(sonar.ping_cm());// mesafeyi al ve ekran için string'e dönüştür
   robojaxText(distance +"cm", 3, 20, 3, false);
   display.display();
   delay(50); // Ping'ler arasında 50ms bekle
}

Bu döngü sürekli olarak mesafeyi ölçer ve ekranı mevcut okumayla günceller. `robojaxText` fonksiyonu, metni OLED ekranda görüntülemek için kullanılır.

Gösterim / Beklentiler

Kurulum tamamlandığında ve kod yüklendiğinde, mesafenin OLED ekranda santimetre cinsinden görüntülendiğini görmelisiniz. Bir nesneyi sensöre yaklaştırdıkça veya uzaklaştırdıkça, görüntülenen değer buna göre değişmelidir. Sensörün doğru yönlendirildiğinden ve engellenmediğinden emin olun (videoda 02:30).

Video Zaman Damgaları

  • 00:00 - Projeye giriş
  • 01:15 - Bağlantı talimatları
  • 02:30 - Kod açıklaması
  • 04:00 - Sensörün gösterimi

Görseller

HC-SR04 ulrasonic sensor
HC-SR04 ulrasonic sensor
How HC-SR04 ulrasonic sensor work
How HC-SR04 ulrasonic sensor work
Arduino wiring for HC-SR04 ultrasonic SSD1306 128x64 OLED
Arduino wiring for HC-SR04 ultrasonic SSD1306 128x64 OLED
SSD1306 OLED display
SSD1306 OLED display
SSD1306 OLED display-dimensions
SSD1306 OLED display-dimensions
SSD1306_128x64_OLDE-4
SSD1306_128x64_OLDE-4
SSD1306 OLED display-back
SSD1306 OLED display-back
44-This is the Arduino code for an HC-SR04 ultrasonic distance sensor with an SSD1306 display.
Dil: C++
/*
 * This is the Arduino code for the HC-SR04 Ultrasonic Distance Sensor with SSD1306 Display
 * to measure the distance using Arduino for a robotic car and other applications
 * Watch the video https://youtu.be/Pgx5fNF4Q6M
 * 
 * Written by Ahmad Shamshiri for Robojax Video
 * Date: December 21, 2017, in Ajax, Ontario, Canada
 * Permission granted to share this code given that this
 * note is kept with the code.
 * Disclaimer: this code is "AS IS" and for educational purposes only.
 * 
 */

/* Original Code 
   from https://github.com/adafruit/Adafruit_SSD1306
// https://playground.arduino.cc/Code/NewPing
 * Modified for Robojax video on December 21, 2017
// ---------------------------------------------------------------------------
// Example NewPing library sketch that does a ping about 20 times per second.
// ---------------------------------------------------------------------------
*/
//// start of SSD1306 display 
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2


#define LOGO16_GLCD_HEIGHT 64 
#define LOGO16_GLCD_WIDTH  128 
static const unsigned char PROGMEM logo16_glcd_bmp[] =
{ B00000000, B11000000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000011, B11100000,
  B11110011, B11100000,
  B11111110, B11111000,
  B01111110, B11111111,
  B00110011, B10011111,
  B00011111, B11111100,
  B00001101, B01110000,
  B00011011, B10100000,
  B00111111, B11100000,
  B00111111, B11110000,
  B01111100, B11110000,
  B01110000, B01110000,
  B00000000, B00110000 };

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
//// end of SSD1306 display 

// ---------------------------------------------------------------------------
// Example NewPing library sketch that does a ping about 20 times per second.
// ---------------------------------------------------------------------------

#include <NewPing.h>

#define TRIGGER_PIN  12  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     11  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.



void setup() {
   Serial.begin(9600);// set serial monitor with 9600 baud
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)
  
}// setup end


void loop() {
   display.clearDisplay();
  robojaxText("Distance", 3, 0, 2, false);
  String distance  = String(sonar.ping_cm());// get distance and convert it to string for display
  robojaxText(distance +"cm", 3, 20, 3, false);
    display.display();

  delay(50);                     // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
  Serial.print("Ping: ");
  Serial.print(sonar.ping_cm()); // Send ping, get distance in cm and print result (0 = outside set distance range)
  Serial.println("cm");

}// loop end


/*
 * robojaxText(String text, int x, int y,int size, boolean d)
 * text is the text string to be printed
 * x is the integer x position of text
 * y is the integer y position of text
 * size is the text size, 1, 2, 3 etc
 * d is either true or false.  Use true to display.
 */
void robojaxText(String text, int x, int y,int size, boolean d) {

  display.setTextSize(size);
  display.setTextColor(WHITE);
  display.setCursor(x,y);
  display.println(text);
  if(d){
    display.display();
  }

}

Kaynaklar ve referanslar

Dosyalar📁

Veri Sayfası (pdf)

  • SSD1306 display datasheet
    SSD1306 is a single-chip CMOS OLED/PLED driver with controller for organic / polymer light emitting diode dot-matrix graphic display system. It consists of 128 segments and 64commons. This IC is designed for Common Cathode type OLED panel. The SSD1306 embeds with contrast control, display RAM and oscillator, which reduces the number of external components and power consumption. It has 256-step brightness control. Data/Commands are sent from general MCU through the hardware selectable 6800/8000 series compatible Parallel Interface, I2C interface or Serial Peripheral Interface. It is suitable for many compact portable applications, such as mobile phone sub-display, MP3 player and calculator, etc.
    SSD1306_display_datasheet.pdf 1.79 MB