embassy-bmp280
Driver asynchrone no_std pour le capteur pression/température Bosch BMP280.
Conçu dans la même philosophie que embassy-gy-bmi160 :
async natif, zéro allocation, zéro unsafe, compatible bus I2C partagé.
Update v0.2.0
- Remplacement des plages de compatibilité par des versions explicites afin d’assurer une meilleure stabilité et reproductibilité des builds.
Dépendances
[]
= "0.2"
= "0.8"
= "0.5"
= "1.0"
⚡ Caractéristiques
#![forbid(unsafe_code)]:sécurité garantie à la compilation- Async natif via
embedded-hal-async - Reset logiciel + vérification Chip ID au démarrage
- Lecture et application de la calibration OTP (algorithme Bosch officiel)
- Compensation température et pression entièrement entière (
no_stdpur) - Gestion d'erreurs typée :
Bmp280Error<E>avec variants distincts - Compatible
embassy-embedded-hal(bus I2C partagé multi-périphériques) - Feature
floatoptionnelle pour les conversionsf32
📦 Installation
[]
= "0.2.0"
= "0.8"
="0.5"
="1.0"
Pour activer les méthodes de conversion f32 (temperature_celsius(), pressure_hpa()) :
= { = "0.2.1", = ["float"] }
🔴 Câblage (Pico 2 / RP2350)
| Broche BMP280 | Connexion | Note |
|---|---|---|
| VIN | 3.3V ou 5V | Vérifiez la sérigraphie du module |
| GND | Masse commune | |
| SCL | ex: GP5 | Pull-up souvent intégré |
| SDA | ex: GP4 | Pull-up souvent intégré |
🚀 Utilisation
Initialisation
use ;
// Adresse par défaut
let mut bmp = new.await?;
Bmp280::new effectue dans l'ordre :
- Reset logiciel du capteur (+ délai datasheet 3 ms)
- Vérification du Chip ID (0x58 ou 0x60 acceptés)
- Lecture des 24 octets de calibration OTP
- Application de la configuration (oversampling + mode)
Lecture d'une mesure
let data = bmp.read.await?;
// Température en centidegrés (i32) : 2315 = 23.15 °C
let temp_cdeg = data.temperature_cdeg;
// Pression en Pascals × 256 (format Q24.8)
let press_raw = data.pressure_pa256;
let press_pa = press_raw / 256; // Pascals (entier)
let press_hpa = press_raw as f32 / ; // hPa (avec feature "float")
Avec la feature float
// Activez features = ["float"] dans Cargo.toml
let temp_c = data.temperature_celsius; // f32, ex: 23.15
let press_hpa = data.pressure_hpa; // f32, ex: 1013.25
Configuration personnalisée
use ;
let config = Bmp280Config ;
let mut bmp = new.await?;
OversamplingTemp / OversamplingPress |
Résolution | Courant typ. |
|---|---|---|
Skip |
désactivé | — |
X1 |
16 bit | minimal |
X2 |
17 bit | |
X4 |
18 bit | |
X8 |
19 bit | |
X16 |
20 bit | maximal |
Gestion de l'adresse alternative
let mut bmp = new.await?;
// Ou dynamiquement après une redétection
bmp.set_address;
Gestion du mode veille
// Économie d'énergie entre les acquisitions
bmp.set_mode.await?;
// Reprise sans reconfigurer l'oversampling
bmp.set_mode.await?;
Gestion d'erreurs
use Bmp280Error;
match new.await
📡 Signaux globaux
BMP280_SIGNAL permet de partager la dernière mesure entre tâches sans
mémoire partagée explicite.
use BMP280_SIGNAL;
// Tâche productrice : déjà appelée dans system_task ci-dessus
BMP280_SIGNAL.signal;
// Tâche consommatrice (ex: logger, radio, autre affichage)
async
🏗️ Architecture du projet
embassy-bmp280/
├── Cargo.toml
└── src/
├── lib.rs ← Driver principal, types publics
├── error.rs ← Bmp280Error<E>
├── calibration.rs ← CalibrationData + algorithmes Bosch
└── signals.rs ← BMP280_SIGNAL (CriticalSectionRawMutex)
Pourquoi ce découpage ?
calibration.rs isole l'arithmétique Bosch — testable indépendamment, sans I2C.
error.rs expose un type dédié : le ? fonctionne partout sans .map_err répétitif.
signals.rs offre un canal de diffusion inter-tâches sûr depuis les interruptions.
📋 API publique : référence rapide
Bmp280
| Méthode | Description |
|---|---|
Bmp280::new(i2c, addr, config).await |
Crée, initialise et configure le driver |
bmp.read().await |
Lit et retourne Bmp280Data compensé |
bmp.set_mode(mode).await |
Change le mode sans toucher l'oversampling |
bmp.set_address(addr) |
Met à jour l'adresse I2C dynamiquement |
Bmp280Address
| Variant | Valeur |
|---|---|
Default |
0x76 |
Secondary |
0x77 |
Custom(u8) |
Valeur libre |
Bmp280Data
| Champ | Type | Valeur |
|---|---|---|
temperature_cdeg |
i32 |
°C × 100 (ex: 2315 = 23.15 °C) |
pressure_pa256 |
u32 |
Pa × 256 : format Q24.8 |
temperature_celsius() ¹ |
f32 |
°C décimaux |
pressure_hpa() ¹ |
f32 |
hPa décimaux |
¹ Disponible uniquement avec features = ["float"].
Bmp280Error<E>
| Variant | Cause |
|---|---|
I2c(E) |
Erreur de bus (NACK, timeout…) |
InvalidChipId(u8) |
ID lu ≠ 0x58 / 0x60 : mauvais composant |
InvalidCalibration |
OTP corrompue (dig_T1 == 0) |
📜 Licence
GPL-2.0-or-later — voir LICENSE.
Copyright (C) 2026 Jorge Andre Castro