Código Arduino e vídeo para o sensor de distância ultrassônico HC-SR04 com display OLED SSD1306
Neste tutorial, vamos demonstrar como usar o sensor de distância ultrassônico HC-SR04 em conjunto com o display OLED SSD1306 para visualizar medições de distância. Este projeto permite medir distâncias sem a necessidade de um computador, tornando-o ideal para várias aplicações, incluindo robótica. Ao final deste projeto, você terá uma montagem funcional que exibe as leituras de distância diretamente na tela OLED.


À medida que avançamos, vou explicar as conexões de fiação necessárias para ambos os componentes e fornecer um passo a passo do código Arduino que integra esses componentes. Isso ajudará você a entender como o sensor mede a distância e como apresentar esses dados no display OLED. Para mais esclarecimentos, você pode consultar o vídeo associado a este tutorial (no vídeo em 00:00).
Hardware explicado
Os principais componentes deste projeto são o sensor de distância ultrassônico HC-SR04 e o display OLED SSD1306. O HC-SR04 funciona usando ondas ultrassônicas; ele emite um pulso ultrassônico pelo pino de disparo e escuta o eco no pino de eco. Ao calcular o tempo que o som leva para retornar, ele pode determinar a distância até um objeto. Este sensor é muito eficaz para medições de curto alcance, tipicamente até 400-500 cm.
O display OLED SSD1306 é um display com interface I2C que permite exibir texto e gráficos. Ele se comunica por meio de dois pinos: SDA (linha de dados) e SCL (linha de clock). Na nossa configuração, esses pinos se conectam a pinos específicos do Arduino, permitindo integração e controle fáceis.
Detalhes da ficha técnica
| Fabricante | Diversos |
|---|---|
| Número da peça | HC-SR04 |
| Tensão lógica/E/S | 5 V |
| Tensão de alimentação | 5 V |
| Corrente de saída (por canal) | 15 mA |
| Corrente de pico (por canal) | 20 mA |
| Orientação sobre a frequência PWM | Não aplicável |
| Limiares de lógica de entrada | 0.3*Vcc a 0.7*Vcc |
| Queda de tensão / RDS(on)/ saturação | Não aplicável |
| Limites térmicos | 0-70 °C |
| Pacote | módulo de 4 pinos |
| Notas / variantes | Módulo padrão |
- Garanta alimentação adequada (5 V) para ambos os componentes.
- Use resistores pull-up se necessário para a comunicação I2C.
- Mantenha as linhas de trigger e echo curtas para evitar interferência.
- Verifique a orientação do sensor ultrassônico para leituras precisas.
- Use uma superfície estável para a tela para evitar vibrações mecânicas.
Instruções de fiação

Para conectar o sensor ultrassônico HC-SR04, comece ligando o pino VCC (geralmente vermelho) ao pino 5V do Arduino. Em seguida, conecte o pino GND (normalmente preto ou amarelo) a um dos pinos GND do Arduino. O pino trigger (frequentemente azul) deve ser ligado ao pino digital 12 do Arduino, enquanto o pino echo (geralmente verde) deve ser conectado ao pino digital 11.
Para o display OLED SSD1306, conecte o pino VCC ao pino 5V do Arduino e o pino GND ao pino GND. O pino SCL deve ser conectado ao pino A5 e o pino SDA ao pino A4 do Arduino. Se você estiver usando um modelo diferente de Arduino que possua pinos I2C dedicados, conecte o display diretamente a esses pinos em vez disso.
Exemplos de Código e Tutorial Passo a Passo
Na função setup, inicializamos o display e a comunicação serial. O trecho a seguir demonstra como o display é configurado:
void setup() {
Serial.begin(9600);// set serial monitor with 9600 baud
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D
}Aqui, o display é inicializado com o endereço I2C, permitindo que ele se comunique com o Arduino. O monitor serial também é configurado para imprimir os valores de distância.
No loop principal, limpamos a tela, medimos a distância e a exibimos. O trecho de código a seguir mostra como lidamos com a medição da distância:
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
}Este loop mede continuamente a distância e atualiza o display com a leitura atual. A função robojaxText é usada para exibir o texto na tela OLED.
Demonstração / O que esperar
Quando a configuração estiver concluída e o código for carregado, você deverá ver a distância exibida na tela OLED em centímetros. Ao aproximar ou afastar um objeto do sensor, o valor exibido deverá mudar de acordo. Certifique-se de que o sensor esteja orientado corretamente e não esteja obstruído (no vídeo em 02:30).
Marcadores de tempo do vídeo
- 00:00- Introdução ao projeto
- 01:15- Instruções de fiação
- 02:30- Explicação do código
- 04:00- Demonstração do sensor
/*
* 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();
}
}
Recursos e referências
-
ExternoBiblioteca Ultrassônica HC-SR04 do site oficial da Arduinoplayground.arduino.cc
Arquivos📁
Folha de dados (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