كود البحث

كود أردوينو وفيديو لمستشعر المسافة بالموجات فوق الصوتية HC-SR04 مع شاشة OLED طراز SSD1306

كود أردوينو وفيديو لمستشعر المسافة بالموجات فوق الصوتية HC-SR04 مع شاشة OLED طراز SSD1306

في هذا الدرس، سنوضح كيفية استخدام حساس المسافة بالموجات فوق الصوتية HC-SR04 بالتزامن مع شاشة OLED من نوع SSD1306 لعرض قياسات المسافة. يتيح لك هذا المشروع قياس المسافات دون الحاجة إلى كمبيوتر، مما يجعله مثالياً لتطبيقات متنوعة، بما في ذلك الروبوتات. بنهاية هذا المشروع، ستحصل على إعداد عملي يعرض قراءات المسافة مباشرةً على شاشة OLED.

How HC-SR04 ulrasonic sensor work
SSD1306 OLED display

مع تقدمنا، سأشرح توصيلات الأسلاك المطلوبة للمكوّنَين وسأقدم شرحًا تفصيليًا لشفرة الأردوينو التي تدمج هذه المكوّنات. سيساعدك ذلك على فهم كيفية قياس المستشعر للمسافة وكيفية إخراج تلك البيانات إلى شاشة OLED. لمزيد من التوضيح، يمكنك الرجوع إلى الفيديو المرتبط بهذا الدرس (في الفيديو عند 00:00).

شرح الأجهزة

المكونات الرئيسية لهذا المشروع هي مستشعر المسافة بالموجات فوق الصوتية HC-SR04 وشاشة OLED من نوع SSD1306. يعمل HC-SR04 باستخدام الموجات فوق الصوتية؛ يصدر نبضة صوتية عبر دبوس الزناد (trigger) ويستمع للصدى عبر دبوس الإيكو (echo). من خلال حساب الزمن الذي تستغرقه الموجة الصوتية للعودة، يمكنه تحديد المسافة إلى الجسم. هذا المستشعر فعال جدًا في القياسات قصيرة المدى، عادةً حتى 400-500 cm.

شاشة OLED SSD1306 هي شاشة ذات واجهة I2C تتيح لك عرض النصوص والرسومات. تتواصل عبر دبوسين: SDA (خط البيانات) وSCL (خط الساعة). في إعدادنا، تتصل هذه الدبابيس بمنافذ محددة على لوحة Arduino، مما يسهل التكامل والتحكم.

تفاصيل ورقة البيانات

المصنّعمتنوع
رقم القطعةHC-SR04
جهد المنطق/المدخلات والمخرجات5 فولت
جهد التغذية5 فولت
تيار الإخراج (لكل قناة)15 ميلي أمبير
التيار الأقصى (لكل قناة)20 mA
إرشادات تردد PWMغير متاح
عتبات منطقية للإدخالمن 0.3*Vcc إلى 0.7*Vcc
هبوط الجهد / RDS(on)/ تشبعلا ينطبق
الحدود الحرارية0-70 °م
حزمةوحدة ذات 4 دبابيس
ملاحظات / متغيراتالوحدة القياسية

  • تأكد من وجود مصدر طاقة مناسب (5 V) لكلا المكوّنين.
  • استخدم مقاومات سحب للأعلى (pull-up) إذا لزم الأمر للاتصال عبر I2C.
  • اجعل خطوط الزناد والصدى قصيرة لتجنب التداخل.
  • تحقق من اتجاه المستشعر فوق الصوتي للحصول على قراءات دقيقة.
  • استخدم سطحًا ثابتًا للشاشة لتجنب الاهتزازات الميكانيكية.

تعليمات التوصيل

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

للاتصال بمستشعر الموجات فوق الصوتية HC-SR04، ابدأ بتوصيل دبوس VCC (عادةً الأحمر) إلى دبوس 5V على لوحة الأردوينو. بعد ذلك، قم بتوصيل دبوس GND (غالبًا الأسود أو الأصفر) إلى أحد دبابيس GND في الأردوينو. يجب توصيل دبوس التريغر (غالبًا الأزرق) بالدبوس الرقمي 12 على الأردوينو، بينما يجب توصيل دبوس الإيكو (عادةً الأخضر) بالدبوس الرقمي 11.

بالنسبة لشاشة OLED من طراز SSD1306، وصل دبوس VCC بدبوس 5V في الأردوينو ودبوس GND بالأرضي (GND). يجب توصيل دبوس SCL بالدبوس A5 ودبوس SDA بالدبوس A4 في الأردوينو. إذا كنت تستخدم طراز أردوينو مختلف يحتوي على دبابيس I2C مخصصة، فوصّل الشاشة مباشرة بتلك الدبابيس بدلاً من ذلك.

أمثلة على الشيفرة وشرح خطوة بخطوة

في دالة الإعداد، نقوم بتهيئة العرض والاتصال التسلسلي. يوضح المقتطف التالي كيفية تهيئة العرض:

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

هنا، تم تهيئة الشاشة باستخدام عنوان I2C، مما يتيح لها التواصل مع الأردوينو. كما تم إعداد المراقب التسلسلي لطباعة قيم المسافة.

في الحلقة الرئيسية، نمسح شاشة العرض، نقيس المسافة، ونطبعها. يوضح مقتطف الشيفرة التالي كيف نتعامل مع قياس المسافة:

void loop() {
   display.clearDisplay();
   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
}

تقوم هذه الحلقة بقياس المسافة باستمرار وتُحدّث شاشة العرض بالقراءة الحالية. تُستخدم دالة robojaxText لعرض النص على شاشة OLED.

عرض توضيحي / ما الذي تتوقعه

عند اكتمال الإعداد وتحميل الشيفرة، يجب أن ترى المسافة معروضة على شاشة OLED بالسنتيمترات. عند تحريك جسم أقرب أو أبعد من المستشعر، ينبغي أن تتغير القيمة المعروضة وفقًا لذلك. تأكد من أن المستشعر موجه بشكل صحيح وغير معوّق (في الفيديو عند 02:30).

طوابع زمنية للفيديو

  • 00:00- مقدمة عن المشروع
  • 01:15- تعليمات الأسلاك
  • 02:30- شرح الكود
  • 04:00- عرض المستشعر

الصور

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.
اللغة: 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();
  }

}

الموارد والمراجع

ملفات📁

لا توجد ملفات متاحة.