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


مع تقدمنا، سأشرح توصيلات الأسلاك المطلوبة للمكوّنَين وسأقدم شرحًا تفصيليًا لشفرة الأردوينو التي تدمج هذه المكوّنات. سيساعدك ذلك على فهم كيفية قياس المستشعر للمسافة وكيفية إخراج تلك البيانات إلى شاشة 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.
- اجعل خطوط الزناد والصدى قصيرة لتجنب التداخل.
- تحقق من اتجاه المستشعر فوق الصوتي للحصول على قراءات دقيقة.
- استخدم سطحًا ثابتًا للشاشة لتجنب الاهتزازات الميكانيكية.
تعليمات التوصيل

للاتصال بمستشعر الموجات فوق الصوتية 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- عرض المستشعر
/*
* 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();
}
}
الموارد والمراجع
-
خارجيمكتبة HC-SR04 فوق صوتية من الموقع الرسمي لأردوينوplayground.arduino.cc
ملفات📁
لا توجد ملفات متاحة.