El Mercury tiene a bordo un sensor de presión Bosch BMP390 o Bosch BMP581.
Este script te muestra cómo detectar cuál tienes y leer su temperatura y presión y convertirla a una altitud.
La conversión estándar utilizada en este programa asume una presión de 1013.25 Hpa (promedio) y una temperatura ambiente de 15 grados centígrados.
Si buscas el pronóstico meteorológico local para tu ubicación y hora e introduces esa presión en su lugar, este script debería mostrarte aproximadamente tu altura sobre el nivel del mar.
Si utilizas nuestro compilador y cargador en línea, no olvides conectar el monitor Serie después de reiniciar (presionar el botón de encendido) tu Mercury para ver la información que viene.
// Ejemplo de prueba del sensor de presión para altímetros Mercury (altimetercloud.com) #include "Wire.h" #include "Mercury_Pins.h" // Hay bastantes opciones de bibliotecas, hemos elegido estas para nuestro ejemplo #include "Adafruit_BMP3XX.h" #include "Adafruit_BMP5xx.h" Adafruit_BMP3XX bmp3; Adafruit_BMP5xx bmp5; bool hasBMP581 = false; bool hasBMP390 = false; float seaLevelHpa = 1013.25; // La presión meteorológica del nivel del mar pronosticada para tu ubicación. void setup() { Serial.begin(115200); // Enciende la alimentación de los sensores en el altímetro Mercury pinMode(VACC, OUTPUT); digitalWrite(VACC, HIGH); delay(100); // Inicia I2C en los pines SDA y SCL del Mercury Wire.begin(SDA, SCL); // Detecta qué sensor de presión está presente en tu Mercury, las revisiones anteriores tenían un Bosch BMP390 y las revisiones posteriores (3+) tienen el Bosch BMP581 if (bmp5.begin(0x47, &Wire)) { hasBMP581 = true; Serial.println("BMP581 encontrado"); } else if (bmp3.begin_I2C(0x77, &Wire)) { hasBMP390 = true; Serial.println("BMP390 encontrado"); } else { Serial.println("¡No se encontró sensor!"); } } void loop() { float temp = 0, pressure = 0, alt = 0; // Lee el sensor detectado para obtener su presión y temperatura if (hasBMP581 && bmp5.performReading()) { temp = bmp5.temperature; pressure = bmp5.pressure; } else if (hasBMP390 && bmp3.performReading()) { temp = bmp3.temperature; pressure = bmp3.pressure / 100.0; } else { delay(500); return; } // Convierte la presión a altitud utilizando la suposición estándar de 15 grados centígrados de temperatura ambiente y la presión del nivel del mar definida anteriormente. alt = 44330.0 * (1.0 - pow(pressure / seaLevelHpa, 0.1903)); Serial.printf("Temp: %.1fC Presión: %.2f hPa Alt: %.1f m\n", temp, pressure, alt); delay(500); }#pragma once /* * Definiciones de pines de Mercury (ESP32-C6) * Asignaciones GPIO específicas de la placa */ // ââ LED de estado (NeoPixel) ââ #define LEDPOWER 3 // Alimentación de NeoPixel (usar HIGH para habilitar) #define LED 2 // Señal de datos de NeoPixel // ââ Bus I2C ââ #define SDA 21 // Datos I2C #define SCL 22 // Reloj I2C // ââ Alimentación del sensor ââ #define VACC 20 // Carril de alimentación del sensor (usar HIGH para habilitar) // ââ Puertos de uso general ââ #define GP06 6 // Puerto GP06 #define GP07 7 // Puerto GP07 // ââ Salida de corriente alta ââ #define OUT1 5 // Salida de corriente alta (p. ej. pirotecnia / relé) // ââ LEDs de indicador de batería ââ #define BL1 4 // LED de batería 1 (más bajo) #define BL2 14 // LED de batería 2 #define BL3 15 // LED de batería 3 #define BL4 18 // LED de batería 4 #define BL5 19 // LED de batería 5 (más alto) // ââ Indicadores ââ #define DISK 8 // LED de actividad de disco // ââ Analógico / Detección ââ #define BATIN 0 // Voltaje de batería (divisor 1:1) #define USBDETECT 1 // Detección de alimentación USB (HIGH = USB presente) #define BUTTON 9 // BOTÓN en la placa, botón de arranque pero se puede usar