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.
🧰 Lista de materiales
🎯 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
| Componente | Pin Arduino |
|---|---|
| HC-SR04 VCC | 5 V |
| HC-SR04 GND | GND |
| HC-SR04 Trig | D9 |
| HC-SR04 Echo | D10 |
| OLED VCC | 5 V (o 3,3 V) |
| OLED GND | GND |
| OLED SDA | A4 |
| OLED SCL | A5 |
💻 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
- Cablea el HC-SR04 (VCC, GND, Trig→D9, Echo→D10).
- Cablea la OLED al bus I2C (SDA→A4, SCL→A5).
- Instala las librerías Adafruit y sube el sketch.
- Acerca y aleja la mano: la distancia y la barra reaccionan.
🧩 Resolución de problemas
| Síntoma | Causa | Solución |
|---|---|---|
| OLED en negro | Dirección I2C distinta | Prueba 0x3D o escanea I2C |
| Distancia 0 o errática | Objeto muy cerca/lejos | Rango útil 2–400 cm |
| Cuelga el sketch | Sin timeout en pulseIn | Manté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.