Ir al contenido
← Volver a Formación Arduino Intermedio

11. Radar de distancia ultrasónico en OLED

Mide distancias con ultrasonidos y las muestra en una pantalla OLED con una barra gráfica. Aprende I2C y el sensor HC-SR04.

Dificultad: Intermedio · Tiempo: 60 min · Cerebro: Arduino Uno

🧰 Lista de materiales

Arduino Uno R3 (ATmega328P)
Arduino Uno R3 (ATmega328P)
Mide y dibuja
sin foto
Sensor ultrasónico HC-SR04
Mide distancia por eco
sin foto
Pantalla OLED I2C 0,96" (SSD1306)
Pantalla gráfica I2C SSD1306
Breadboard 830 puntos
Breadboard 830 puntos
Montaje

🎯 Qué vas a aprender

Dos pilares del nivel intermedio: medir tiempo de vuelo con el HC-SR04 y dibujar en una pantalla OLED gráfica por el bus I2C, que usa solo 2 cables para muchos dispositivos.

📚 Teoría: eco ultrasónico e I2C

El HC-SR04 emite un pulso de ultrasonido por Trig y mide en Echo cuánto tarda en volver el rebote. Como el sonido viaja a ~343 m/s, la distancia es tiempo × 0,0343 / 2 (dividimos entre 2 porque el sonido va y vuelve).

El I2C es un bus serie de 2 hilos (SDA datos, SCL reloj) donde cada dispositivo tiene una dirección. La OLED SSD1306 suele estar en 0x3C. Con I2C podrías colgar OLED, sensores y RTC en los mismos 2 pines.

🔌 Conexiones

ComponentePin Arduino
HC-SR04 VCC5 V
HC-SR04 GNDGND
HC-SR04 TrigD9
HC-SR04 EchoD10
OLED VCC5 V (o 3,3 V)
OLED GNDGND
OLED SDAA4
OLED SCLA5
NotaEn el Arduino Uno, I2C está fijado en A4 (SDA) y A5 (SCL).

💻 Código completo

Necesitas las librerías Adafruit_GFX y Adafruit_SSD1306 (Gestor de librerías del IDE).

// Radar ultrasónico con barra en OLED SSD1306
#include 
#include 
#include 

#define ANCHO 128
#define ALTO  64
Adafruit_SSD1306 oled(ANCHO, ALTO, &Wire, -1);

const int TRIG = 9;
const int ECHO = 10;

long medirDistancia() {
  digitalWrite(TRIG, LOW);  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH); delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  long t = pulseIn(ECHO, HIGH, 30000); // timeout 30 ms (~5 m)
  if (t == 0) return -1;               // sin eco
  return t * 0.0343 / 2;               // cm
}

void setup() {
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.clearDisplay();
  oled.setTextColor(SSD1306_WHITE);
}

void loop() {
  long d = medirDistancia();
  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setCursor(0, 0);
  if (d < 0) { oled.print("--- cm"); }
  else       { oled.print(d); oled.print(" cm"); }

  // barra proporcional (0..200 cm -> 0..128 px)
  int barra = map(constrain(d, 0, 200), 0, 200, 0, 128);
  oled.fillRect(0, 40, barra, 16, SSD1306_WHITE);
  oled.display();
  delay(150);
}

🛠️ Montaje paso a paso

  1. Cablea el HC-SR04 (VCC, GND, Trig→D9, Echo→D10).
  2. Cablea la OLED al bus I2C (SDA→A4, SCL→A5).
  3. Instala las librerías Adafruit y sube el sketch.
  4. Acerca y aleja la mano: la distancia y la barra reaccionan.

🧩 Resolución de problemas

SíntomaCausaSolución
OLED en negroDirección I2C distintaPrueba 0x3D o escanea I2C
Distancia 0 o erráticaObjeto muy cerca/lejosRango útil 2–400 cm
Cuelga el sketchSin timeout en pulseInMantén el timeout de 30 ms

🚀 Para ir más lejos

  • Monta el sensor sobre un servo y barre 180° para un radar real (proyecto 19).
  • Usa el JSN-SR04T impermeable para medir nivel de un depósito.
← Volver a Formación Arduino