Arduino-Code und Video für HC-SR04 Ultraschall-Abstandssensor mit SSD1306 OLED-Display
In diesem Tutorial zeigen wir, wie man den HC-SR04 Ultraschall-Entfernungssensor in Kombination mit dem SSD1306 OLED-Display verwendet, um Entfernungsmessungen zu visualisieren. Dieses Projekt ermöglicht es Ihnen, Entfernungen zu messen, ohne einen Computer zu benötigen, und ist damit ideal für verschiedene Anwendungen, einschließlich Robotik. Am Ende dieses Projekts haben Sie einen funktionierenden Aufbau, der Entfernungswerte direkt auf dem OLED-Bildschirm anzeigt.


Im weiteren Verlauf erkläre ich die für beide Komponenten erforderlichen Verdrahtungsanschlüsse und führe Sie durch den Arduino-Code, der diese Komponenten integriert. Das hilft Ihnen zu verstehen, wie der Sensor die Entfernung misst und wie Sie diese Daten auf dem OLED-Display ausgeben. Zur weiteren Klärung können Sie sich das mit diesem Tutorial verknüpfte Video ansehen (im Video bei 00:00).
Hardware erklärt
Die Hauptkomponenten dieses Projekts sind der HC-SR04 Ultraschall-Entfernungssensor und das SSD1306 OLED-Display. Der HC-SR04 arbeitet mit Ultraschallwellen; er sendet über den Trigger-Pin einen Schallimpuls und empfängt das Echo am Echo-Pin. Durch die Berechnung der Zeit, die der Schall für die Rückkehr benötigt, kann er die Entfernung zu einem Objekt bestimmen. Dieser Sensor ist sehr effektiv für Kurzstreckenmessungen, typischerweise bis zu 400–500 cm.
Das SSD1306-OLED-Display ist ein Display mit I2C-Schnittstelle, das es Ihnen ermöglicht, Text und Grafiken anzuzeigen. Es kommuniziert über zwei Pins: SDA (Datenleitung) und SCL (Taktleitung). In unserer Konfiguration sind diese Pins mit bestimmten Arduino-Pins verbunden, was eine einfache Integration und Steuerung ermöglicht.
Details des Datenblatts
| Hersteller | Verschiedene |
|---|---|
| Teilenummer | HC-SR04 |
| Logik-/I/O-Spannung | 5 V |
| Versorgungsspannung | 5 V |
| Ausgangsstrom (pro Kanal) | 15 mA |
| Spitzenstrom (je Kanal) | 20 mA |
| Hinweise zur PWM-Frequenz | Nicht zutreffend |
| Schwellenwerte der Eingangslogik | 0.3*Vcc bis 0.7*Vcc |
| Spannungsabfall / RDS(on)/ Sättigung | Nicht zutreffend |
| Thermische Grenzwerte | 0–70 °C |
| Paket | 4-poliges Modul |
| Notizen / Varianten | Standardmodul |
- Stellen Sie sicher, dass beide Komponenten eine ordnungsgemäße Stromversorgung (5 V) erhalten.
- Verwenden Sie bei Bedarf Pull-up-Widerstände für die I2C-Kommunikation.
- Halten Sie Trigger- und Echo-Leitungen kurz, um Störungen zu vermeiden.
- Überprüfen Sie die Ausrichtung des Ultraschallsensors für genaue Messwerte.
- Verwenden Sie eine stabile Oberfläche für das Display, um mechanische Vibrationen zu vermeiden.
Verdrahtungsanleitung

Um den HC-SR04-Ultraschallsensor anzuschließen, beginnen Sie damit, den VCC-Pin (normalerweise rot) mit dem 5V-Pin am Arduino zu verbinden. Verbinden Sie als Nächstes den GND-Pin (typischerweise schwarz oder gelb) mit einem der GND-Pins des Arduinos. Der Trigger-Pin (oft blau) sollte mit dem digitalen Pin 12 am Arduino verdrahtet werden, während der Echo-Pin (normalerweise grün) mit dem digitalen Pin 11 verbunden werden sollte.
Für das SSD1306-OLED-Display verbinden Sie den VCC-Pin mit dem 5V-Pin des Arduino und den GND-Pin mit GND. Der SCL-Pin sollte mit Pin A5 und der SDA-Pin mit Pin A4 am Arduino verbunden werden. Wenn Sie ein anderes Arduino-Modell verwenden, das dedizierte I2C-Pins hat, verbinden Sie das Display stattdessen direkt mit diesen Pins.
Codebeispiele & Schritt-für-Schritt-Anleitung
In der Setup-Funktion initialisieren wir das Display und die serielle Kommunikation. Der folgende Ausschnitt zeigt, wie das Display initialisiert wird:
void setup() {
Serial.begin(9600);// set serial monitor with 9600 baud
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D
}Hier wird das Display mit der I2C-Adresse initialisiert, sodass es mit dem Arduino kommunizieren kann. Der serielle Monitor wird ebenfalls eingerichtet, um Abstandswerte auszugeben.
In der Hauptschleife löschen wir das Display, messen die Entfernung und geben sie aus. Der folgende Codeausschnitt zeigt, wie wir die Entfernungsmessung handhaben:
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
}Diese Schleife misst kontinuierlich die Entfernung und aktualisiert die Anzeige mit dem aktuellen Messwert. Die Funktion robojaxText wird verwendet, um den Text auf dem OLED-Bildschirm anzuzeigen.
Demonstration / Was Sie erwartet
Wenn die Einrichtung abgeschlossen ist und der Code hochgeladen wurde, sollte die Entfernung in Zentimetern auf dem OLED-Bildschirm angezeigt werden. Wenn Sie ein Objekt näher an den Sensor heran- oder weiter davon wegbewegen, sollte sich der angezeigte Wert entsprechend ändern. Stellen Sie sicher, dass der Sensor korrekt ausgerichtet ist und nicht blockiert wird (im Video bei 02:30).
Video-Zeitstempel
- 00:00- Einführung in das Projekt
- 01:15- Verdrahtungsanleitung
- 02:30- Code-Erklärung
- 04:00- Demonstration des Sensors
/*
* 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();
}
}
Ressourcen & Referenzen
-
ExternHC-SR04 Ultraschallbibliothek von der offiziellen Arduino-Websiteplayground.arduino.cc
Dateien📁
Keine Dateien verfügbar.