Mã Arduino và Video cho Cảm biến khoảng cách siêu âm HC-SR04 với Màn hình OLED SSD1306
Trong hướng dẫn này, chúng tôi sẽ trình bày cách sử dụng cảm biến khoảng cách siêu âm HC-SR04 kết hợp với màn hình OLED SSD1306 để hiển thị trực quan các phép đo khoảng cách. Dự án này cho phép bạn đo khoảng cách mà không cần máy tính, lý tưởng cho nhiều ứng dụng khác nhau, bao gồm cả robot. Kết thúc dự án này, bạn sẽ có một thiết lập hoạt động hiển thị số đo khoảng cách trực tiếp trên màn hình OLED.


Khi chúng ta tiếp tục, tôi sẽ giải thích các kết nối dây cần thiết cho cả hai linh kiện và hướng dẫn chi tiết về mã Arduino tích hợp các linh kiện này. Điều này sẽ giúp bạn hiểu cách cảm biến đo khoảng cách và cách xuất dữ liệu đó ra màn hình OLED. Để làm rõ hơn, bạn có thể tham khảo video liên quan đến hướng dẫn này (trong video tại 00:00).
Phần cứng được giải thích
Các thành phần chính của dự án này là cảm biến khoảng cách siêu âm HC-SR04 và màn hình OLED SSD1306. HC-SR04 hoạt động bằng sóng âm siêu âm; nó phát ra một xung âm thanh qua chân trigger và lắng nghe tiếng vọng trên chân echo. Bằng cách tính thời gian âm thanh quay trở lại, nó có thể xác định khoảng cách đến một vật thể. Cảm biến này rất hiệu quả cho các phép đo tầm ngắn, thường lên đến 400-500 cm.
Màn hình OLED SSD1306 là màn hình giao diện I2C cho phép bạn hiển thị văn bản và đồ họa. Nó giao tiếp qua hai chân: SDA (đường dữ liệu) và SCL (đường xung nhịp). Trong thiết lập của chúng tôi, các chân này kết nối với các chân Arduino cụ thể, cho phép tích hợp và điều khiển dễ dàng.
Chi tiết bảng dữ liệu
| Nhà sản xuất | Nhiều hãng |
|---|---|
| Số bộ phận | HC-SR04 |
| Điện áp Logic/IO | 5 V |
| Điện áp cấp nguồn | 5 V |
| Dòng điện đầu ra (mỗi kênh) | 15 mA |
| Dòng điện đỉnh (mỗi kênh) | 20 mA |
| Hướng dẫn tần số PWM | Không áp dụng |
| Ngưỡng logic đầu vào | 0,3*Vcc đến 0,7*Vcc |
| Sụt áp / RDS(on) / bão hòa | Không áp dụng |
| Giới hạn nhiệt | 0-70 °C |
| Đóng gói | Mô-đun 4 chân |
| Ghi chú / biến thể | Mô-đun tiêu chuẩn |
- Đảm bảo nguồn điện phù hợp (5 V) cho cả hai linh kiện.
- Sử dụng điện trở kéo lên nếu cần cho giao tiếp I2C.
- Giữ các đường trigger và echo ngắn để tránh nhiễu.
- Kiểm tra hướng của cảm biến siêu âm để có số đo chính xác.
- Sử dụng bề mặt ổn định cho màn hình để tránh rung động cơ học.
Hướng dẫn nối dây

Để kết nối cảm biến siêu âm HC-SR04, bắt đầu bằng cách nối chân VCC (thường màu đỏ) với chân 5V trên Arduino. Tiếp theo, kết nối chân GND (thường màu đen hoặc vàng) với một trong các chân GND của Arduino. Chân trigger (thường màu xanh dương) nên được nối với chân kỹ thuật số 12 trên Arduino, trong khi chân echo (thường màu xanh lá cây) nên được kết nối với chân kỹ thuật số 11.
Đối với màn hình OLED SSD1306, kết nối chân VCC với chân 5V trên Arduino và chân GND với GND. Chân SCL nên được kết nối với chân A5 và chân SDA với chân A4 trên Arduino. Nếu bạn sử dụng một mẫu Arduino khác có các chân I2C chuyên dụng, hãy kết nối màn hình trực tiếp với các chân đó.
Ví dụ mã và hướng dẫn chi tiết
Trong hàm setup, chúng ta khởi tạo màn hình và giao tiếp nối tiếp. Đoạn trích sau đây minh họa cách màn hình được thiết lập:
void setup() {
Serial.begin(9600);// đặt màn hình nối tiếp với tốc độ 9600 baud
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // khởi tạo với địa chỉ I2C 0x3D
}
Ở đây, màn hình được khởi tạo với địa chỉ I2C, cho phép nó giao tiếp với Arduino. Màn hình nối tiếp cũng được thiết lập để in các giá trị khoảng cách.
Trong vòng lặp chính, chúng ta xóa màn hình, đo khoảng cách và in nó. Đoạn mã sau đây cho thấy cách chúng ta xử lý phép đo khoảng cách:
void loop() {
display.clearDisplay();
String distance = String(sonar.ping_cm());// lấy khoảng cách và chuyển đổi thành chuỗi để hiển thị
robojaxText(distance +"cm", 3, 20, 3, false);
display.display();
delay(50); // Chờ 50ms giữa các lần ping
}
Vòng lặp này liên tục đo khoảng cách và cập nhật màn hình với số đo hiện tại. Hàm `robojaxText` được sử dụng để hiển thị văn bản trên màn hình OLED.
Trình diễn / Điều gì sẽ xảy ra
Khi thiết lập hoàn tất và mã được tải lên, bạn sẽ thấy khoảng cách hiển thị trên màn hình OLED tính bằng centimet. Khi bạn di chuyển một vật thể đến gần hoặc ra xa cảm biến, giá trị hiển thị sẽ thay đổi tương ứng. Đảm bảo cảm biến được định hướng chính xác và không bị cản trở (trong video tại 02:30).
Mốc thời gian video
- 00:00 - Giới thiệu về dự án
- 01:15 - Hướng dẫn nối dây
- 02:30 - Giải thích mã
- 04:00 - Trình diễn cảm biến
/*
* 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();
}
}
Tài nguyên & tài liệu tham khảo
-
Bên ngoàiHC-SR04 Ultrasonic Library from the Arduino official websiteplayground.arduino.cc
Tập tin📁
Bảng dữ liệu (pdf)
-
SSD1306 display datasheetSSD1306 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.pdf1.79 MB