
BermejaSat #11: Identificación de Sensores Barométricos (BME280 vs. BMP280), Doble Bus I2C y Telemetría en Pantalla con Heltec V3.2
Introducción
En la construcción de un CanSat como BermejaSat, la lectura precisa de la presión atmosférica es la piedra angular para calcular la altitud en tiempo real durante el descenso. Sin embargo, en el mundo del prototipado electrónico nos encontramos con frecuencia con un clásico del hardware comercial: módulos adquiridos como BME280 que, al ser examinados por software, resultan ser BMP280.
En esta undécima entrega de la serie BermejaSat, resolvemos el misterio del chip barométrico, explicamos cómo gestionar dos buses I2C independientes en la placa Heltec WiFi LoRa 32 V3.2 y dejamos funcionando el sistema de telemetría local con datos reales en la pantalla OLED.
🔍 Paso 1: El Escáner I2C y la Arquitectura de Doble Bus (Wire vs Wire1)
La placa Heltec V3.2 basa su arquitectura en el microcontrolador ESP32-S3. Para integrar componentes sin conflictos, la placa separa los periféricos en dos buses I2C independientes:
- Bus Interno (
Wire): Conectado directamente por debajo del PCB a la pantalla OLED integrando los pines GPIO 17 (SDA), GPIO 18 (SCL) y GPIO 21 (Reset). - Bus Externo (
Wire1): Dirigido a las patillas de expansión visibles en los bordes de la placa en los pines GPIO 41 (SDA) y GPIO 42 (SCL).
Utilizando un script de escaneo I2C configurado sobre Wire1, enviamos una señal de reconocimiento (ping) a través de las patillas 41 y 42 hasta obtener la respuesta del chip en la dirección hexadecimal 0x76.
🆚 Paso 2: ¿BME280 o BMP280? Descifrando el Chip ID
Aunque exteriormente los encapsulados metálicos son casi idénticos, existen diferencias clave entre ambos sensores de Bosch Sensortec:
- BMP280 (Bosch Micro Pressure): Mide Presión Atmosférica y Temperatura.
- BME280 (Bosch Micro Environmental): Mide Presión Atmosférica, Temperatura y Humedad Relativa.
La prueba del algodón: Registro 0xD0
Para confirmar qué chip físico tenemos montado sin depender del etiquetado del vendedor, el microcontrolador lee el registro de memoria 0xD0 del sensor (Chip ID):
- Si el registro devuelve
0x58, el silicio es un BMP280. - Si el registro devuelve
0x60, el silicio es un BME280.
Conclusión para la misión: Para el cálculo de la curva de descenso, velocidad terminal y apogeo de BermejaSat, el sensor BMP280 es más que suficiente y ofrece una precisión métrica idéntica en presión y temperatura.
🛠️ Paso 3: Diferencias de Sintaxis en las Librerías Adafruit
Un punto crítico al programar en C++ para Arduino IDE es que las librerías oficiales de Adafruit para ambos sensores no gestionan el bus I2C secundario (Wire1) de la misma forma:
- Librería BME280: Se le pasa el puntero del bus en la función
.begin():bme.begin(0x76, &Wire1); - Librería BMP280: Exige indicar el bus
Wire1en la declaración inicial del objeto (constructor) y solo la dirección I2C en el.begin():Adafruit_BMP280 bmp(&Wire1);bmp.begin(0x76);
💻 Paso 4: Código Definitivo de Auto-Detección y Telemetría Local
El siguiente programa activa el pin de alimentación Vext (GPIO 36), resetea la pantalla por hardware en el pin 21, inicializa la pantalla en los pines 17/18, detecta dinámicamente si el sensor externo conectado a los pines 41/42 es un BME280 o BMP280 y muestra la telemetría en vivo.
C++
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BME280.h>
#include <Adafruit_BMP280.h>
// --- PINES PANTALLA OLED INTERNA (HELTEC V3.2) ---
#define OLED_SDA 17
#define OLED_SCL 18
#define OLED_RST 21
#define VEXT_PIN 36 // Control de energia periférica
// --- PINES SENSOR EXTERNO BME/BMP280 ---
#define BME_SDA 41
#define BME_SCL 42
// Pantalla OLED en bus I2C principal (Wire)
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RST);
// Instancia de sensores (El BMP280 recibe el bus Wire1 en la declaración)
Adafruit_BME280 bme;
Adafruit_BMP280 bmp(&Wire1);
int tipoSensor = 0; // 1 = BME280, 2 = BMP280, 0 = Error
unsigned long ultimoEnvio = 0;
const long intervalo = 1000;
int paqueteID = 0;
float presionSuelo = 1013.25;
void setup() {
Serial.begin(115200);
// 1. Activar alimentación Vext (GPIO 36)
pinMode(VEXT_PIN, OUTPUT);
digitalWrite(VEXT_PIN, LOW);
delay(100);
// 2. Reseteo por hardware de la pantalla OLED
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, LOW);
delay(20);
digitalWrite(OLED_RST, HIGH);
// 3. Inicializar buses I2C asignando pines
Wire.begin(OLED_SDA, OLED_SCL); // Bus OLED interno (17 y 18)
Wire1.begin(BME_SDA, BME_SCL); // Bus externo (41 y 42)
// 4. Inicializar pantalla OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("[ERROR] No se detecta la pantalla OLED.");
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(0, 10);
display.println("BERMEJASAT - HELTEC V3");
display.setCursor(0, 30);
display.println("Iniciando sensor...");
display.display();
// 5. Auto-deteccion: Probar BME280 primero, luego BMP280
if (bme.begin(0x76, &Wire1)) {
tipoSensor = 1; // BME280
presionSuelo = bme.readPressure() / 100.0F;
Serial.println("[OK] DETECTADO: BME280 (Presion, Temp, Humedad)");
}
else if (bmp.begin(0x76)) {
tipoSensor = 2; // BMP280
presionSuelo = bmp.readPressure() / 100.0F;
Serial.println("[OK] DETECTADO: BMP280 (Presion, Temp)");
}
else {
tipoSensor = 0;
Serial.println("[ERROR] Sensor no encontrado en direccion 0x76.");
}
delay(1000);
}
void loop() {
unsigned long tiempoActual = millis();
if (tiempoActual - ultimoEnvio >= intervalo) {
ultimoEnvio = tiempoActual;
float temp = 0.0, pres = 0.0, hum = 0.0, altitud = 0.0;
if (tipoSensor == 1) { // LECTURA BME280
temp = bme.readTemperature();
pres = bme.readPressure() / 100.0F;
hum = bme.readHumidity();
altitud = bme.readAltitude(presionSuelo);
}
else if (tipoSensor == 2) { // LECTURA BMP280
temp = bmp.readTemperature();
pres = bmp.readPressure() / 100.0F;
hum = 0.0;
altitud = bmp.readAltitude(presionSuelo);
}
if (tipoSensor > 0) {
paqueteID++;
// Trama CSV por Puerto Serie para la Estación Terrena en Python
Serial.print(paqueteID); Serial.print(",");
Serial.print(altitud, 1); Serial.print(",");
Serial.print(pres, 1); Serial.print(",");
Serial.print(temp, 1); Serial.print(",");
Serial.println(hum, 1);
// Renderizado en pantalla OLED
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
if (tipoSensor == 1) display.println("HELTEC V3 - BME280");
else display.println("HELTEC V3 - BMP280");
display.drawLine(0, 9, 128, 9, SSD1306_WHITE);
display.setCursor(0, 15);
display.print("Alt: ");
display.setTextSize(2);
display.print(altitud, 1);
display.setTextSize(1);
display.println(" m");
display.setCursor(0, 38);
display.print("P: "); display.print(pres, 1); display.println(" hPa");
display.setCursor(0, 50);
display.print("T: "); display.print(temp, 1); display.print(" C");
if (tipoSensor == 1) {
display.print(" | H: "); display.print(hum, 0); display.println("%");
} else {
display.println(" | BMP280");
}
display.display();
} else {
display.clearDisplay();
display.setCursor(0, 20);
display.println("ERROR LECTURA SENSOR");
display.setCursor(0, 35);
display.println("Revisa conexion 0x76");
display.display();
}
}
}
Conclusión y Próximos Pasos
Aprender a gestionar buses I2C secundarios por hardware y depurar identificadores de chip es una competencia fundamental en el desarrollo de satélites y sistemas embebidos. Con la telemetría barométrica local totalmente estabilizada y visualizable en pantalla, vuestro CanSat está listo para el siguiente gran hito.
En la siguiente entrega: Empaquetado de tramas de radio LoRa a 868 MHz desde la Heltec V3.2 hacia el receptor LILYGO T-Beam para transmisión telemetrométrica a larga distancia.
Ficha de Metadatos para la Publicación (MonteSTEAM)
- Slug:
bermejasat-11-identificacion-bmp280-bme280-doble-bus-i2c-heltec-v32 - Extracto: Undécima entrega de BermejaSat: cómo solucionar la diferencia entre sensores BME280 y BMP280, configurar el segundo bus I2C (
Wire1) en los pines 41 y 42 de la Heltec V3.2 y mostrar telemetría en tiempo real en la pantalla OLED. - Palabras clave: BermejaSat, CanSat, ESA, Heltec V3.2, ESP32-S3, BMP280, BME280, I2C, Wire1, OLED, MonteSTEAM, IES Monterroso, AIDARAC.
Etiquetas: AIDARAC, BermejaSat, CanSat, ESA, ies monterroso, montesteam, Arduino, ESP32, Heltec, BMP280, BME280, I2C, Hardware, Telemetria
Etiqueta:AIDARAC, BermejaSat, bme280, BMP280, cansat, ESA, ESP32-S3, Heltec V3.2, I2C, ies monterroso, montesteam, OLED, Wire1


