Apprenez à utiliser le BME680 Capteur environnemental avec Arduino. Le BME680 est un petit capteur capable de mesurer la température, l’humidité, la pression et la concentration de gaz. Il prend également en charge différents modes d’alimentation, y compris un mode ultra-basse consommation, ce qui le rend adapté aux projets alimentés par batterie.
Pièces requises
Vous trouverez ci-dessous les pièces nécessaires pour ce projet. En plus du capteur BME680, vous aurez besoin d’un microcontrôleur. J’ai choisi un Arduino UNO, mais vous pouvez utiliser n’importe quel autre Arduino. Comme le BME680 fonctionne en 5V et 3,3V, vous pouvez aussi utiliser un ESP32 ou ESP8622, par exemple.

Capteur BME680

Arduino Uno

Jeu de fils Dupont

Plaque d’essai (breadboard)

Câble USB pour Arduino UNO
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Présentation du capteur BME680
Le BME680 est un petit capteur (3x3x1 mm) capable de mesurer la température, l’humidité, la pression et la concentration de composés organiques volatils (COV) tels que l’éthanol, l’alcool et le monoxyde de carbone. La photo ci-dessous montre le capteur avec le petit trou pour l’échange de gaz sur le dessus :

La communication avec le capteur se fait via une interface I2C ou SPI et est compatible avec un Arduino ou un ESP32, par exemple.
La puce BME680 fonctionne sous une tension de 1,7V à 3,6V. Mais généralement, vous utiliserez une carte breakout avec un régulateur de tension qui permet d’alimenter le capteur en 5V également. Nous en reparlerons plus tard.
La consommation actuelle est d’environ 4µA pour les mesures d’humidité, pression et température, et peut atteindre 12mA lorsque tous les capteurs, y compris le gaz, sont utilisés. Cependant, vous pouvez mettre le capteur en mode veille où il ne consomme que 0,15µA. De plus, les capteurs d’humidité, de pression et de gaz peuvent être activés ou désactivés indépendamment pour gérer la consommation d’énergie.
Concernant la précision, le capteur peut mesurer l’humidité avec une précision de ±3%, la pression barométrique avec une précision absolue de ±1 hPa, et la température avec une précision de ±1,0°C. Grâce à la précision de la pression, le capteur peut être utilisé pour estimer l’altitude avec une marge d’erreur de ±1 mètre.
| Capteur | Précision | Plage |
| Température | ± 1,0 ºC | -40 à 85 ºC |
| Humidité | ± 3 % | 0 à 100 % |
| Pression | ± 1 hPa | 300 à 1100 hPa |
Capteur de gaz
Le BME680 contient un capteur MOx (oxyde métallique) avec un chauffage pour mesurer la concentration de composés organiques volatils (COV) dans l’air, notamment l’éthane, l’isoprène / 2-méthyl-1,3 butadiène, l’éthanol, l’acétone, le monoxyde de carbone. Cependant, il ne peut pas distinguer ces COV individuellement. Il fournit plutôt une valeur de résistance proportionnelle à la concentration de COV.
Notez que le capteur de gaz nécessite un temps de rodage de 5 à 30 minutes ! Si vous souhaitez mettre le capteur (et le microcontrôleur) en mode veille entre les mesures, vous devez stocker le sensor state pour réduire ce temps de rodage du capteur de gaz. Pour les mesures d’humidité, de pression et de température, ce n’est pas nécessaire.
Pour la spécification technique complète, consultez la fiche technique liée ci-dessous :
Carte breakout pour BME680
Comme la puce BME680 est très petite, vous voudrez généralement une carte breakout pour connecter le capteur à un Arduino ou ESP32. La photo ci-dessous montre le recto et le verso d’une carte breakout typique pour le BME680 :

Brochage du BME680
La carte breakout possède généralement le XC6206 (662K) régulateur de tension à faible chute qui vous permet d’alimenter le capteur en 3,3V ou 5V. Le BME680 est la petite boîte métallique carrée, sur le côté droit de la photo ci-dessous :

Sur le côté gauche se trouvent les broches pour l’interface I2C ou SPI, ainsi que les connexions d’alimentation (VCC, GND). Pour la communication I2C, seules les broches SCL et SDA sont nécessaires. En mode SPI, la broche CS (Chip Select) permet à plusieurs capteurs BME680 de partager le même bus. Chaque capteur peut être contrôlé individuellement en connectant sa broche CS à un GPIO distinct.
Avec l’interface I2C, la broche SDO détermine l’adresse I2C du capteur. Laisser SDO non connecté définit l’adresse à 0x77, tandis que la connecter à la masse change l’adresse à 0x76. Cette configuration évite les conflits d’adresse avec d’autres périphériques I2C et permet également à deux capteurs BME680 de fonctionner sur le même bus I2C.
Connexion du BME680 via I2C
La connexion du BME680 via I2C est simple. Connectez SCL et SDA du BME680 aux broches correspondantes de l’Arduino UNO. GND doit être connecté à GND, et VCC peut être connecté à 5V ou 3,3V. Voir le câblage complet ci-dessous :

Si vous ne savez pas quelles sont les broches I2C matérielles de votre carte, consultez le Find I2C and SPI default pins tutoriel. Si vous utilisez une carte 3,3V, par exemple un ESP32, assurez-vous de connecter VCC à 3,3V !
Code pour mesurer la température, l’humidité, la pression, l’altitude et le gaz
Le code suivant montre comment mesurer la température, l’humidité, la pression, l’altitude et la concentration de gaz avec le BME680. Jetez un coup d’œil rapide au code complet avant d’en discuter les détails :
#include "Adafruit_BME680.h"
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME680 bme;
void setup() {
Serial.begin(115200);
bme.begin();
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
bme.setPressureOversampling(BME680_OS_4X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
bme.setGasHeater(320, 150); // 320*C for 150 ms
}
void loop() {
if (bme.performReading()) {
Serial.print("Temperature = ");
Serial.print(bme.temperature);
Serial.println(" *C");
Serial.print("Humidity = ");
Serial.print(bme.humidity);
Serial.println(" %");
Serial.print("Pressure = ");
Serial.print(bme.pressure / 100.0);
Serial.println(" hPa");
Serial.print("Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");
Serial.print("Gas = ");
Serial.print(bme.gas_resistance / 1000.0);
Serial.println(" KOhms");
Serial.println();
delay(2000);
}
}
bibliothèques
Pour commencer, le code inclut la Adafruit BME680 library qui fournit toutes les fonctions essentielles pour le capteur BME680. Cette bibliothèque gère la communication via I2C ou SPI et simplifie la lecture des capteurs.
#include "Adafruit_BME680.h"
Vous pouvez installer cette bibliothèque comme d’habitude via le LIBRARY MANAGER. Il suffit de chercher « bme680 » et de sélectionner la « Adafruit BME680 Library » comme montré ci-dessous :

constantes
Ensuite, le code définit une constante pour la pression au niveau de la mer en hectopascals (hPa). Cette valeur est importante pour calculer l’altitude. Vous pouvez l’ajuster selon votre localisation pour améliorer la précision. Ce map peut vous aider.
#define SEALEVELPRESSURE_HPA (1013.25)
objets
Ici, le code crée une instance de la classe Adafruit_BME680. Cet objet nous permettra d’accéder aux mesures du capteur et de le configurer.
Adafruit_BME680 bme;
Si vous laissez SDO non connecté et utilisez les broches I2C par défaut de votre microcontrôleur, ce constructeur devrait fonctionner tel quel. Sinon, vous pouvez spécifier l’adresse I2C via bme.begin(addr) dans la fonction setup :
bme.begin(uint8_t addr = BME68X_DEFAULT_ADDRESS);
ou des broches I2C différentes via
Adafruit_BME680(TwoWire *theWire = &Wire);
lors de la création de l’objet capteur.
setup
Dans la fonction setup(), le code démarre la communication série à 115200 bauds. C’est essentiel pour afficher les données du capteur dans le Moniteur Série.
Serial.begin(115200);
Ensuite, il initialise le capteur BME680 en appelant bme.begin(). Si le capteur est correctement connecté et que la bibliothèque fonctionne, la communication commence.
bme.begin();
N’oubliez pas que vous pouvez spécifier une autre adresse I2C en appelant bme.begin(addr) à la place, si nécessaire.
La précision du capteur dépend fortement de ses réglages de suréchantillonnage. Dans cette ligne, la mesure de température est configurée pour un suréchantillonnage 8 fois, ce qui lisse les fluctuations et améliore la fiabilité.
bme.setTemperatureOversampling(BME680_OS_8X);
Le BME680 supporte les réglages suivants pour le suréchantillonnage :
BME680_OS_NONEBME680_OS_1XBME680_OS_2XBME680_OS_4XBME680_OS_8XBME680_OS_16X
L’humidité est configurée pour un suréchantillonnage 2 fois. Cela suffit généralement pour la plupart des applications où l’humidité ne change pas rapidement.
bme.setHumidityOversampling(BME680_OS_2X);
Pour la pression, le capteur utilise un suréchantillonnage 4x. La pression atmosphérique fluctue lentement, donc ce niveau offre un bon compromis entre rapidité et précision.
bme.setPressureOversampling(BME680_OS_4X);
Le code applique également un filtre passe-bas aux mesures du capteur en utilisant un filtre IIR (réponse impulsionnelle infinie). Cela aide à éliminer le bruit des mesures de pression.
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
Les tailles de filtre suivantes sont supportées :
BME680_FILTER_SIZE_0BME680_FILTER_SIZE_1BME680_FILTER_SIZE_3BME680_FILTER_SIZE_7BME680_FILTER_SIZE_15BME680_FILTER_SIZE_31BME680_FILTER_SIZE_63BME680_FILTER_SIZE_127
Enfin, il y a un réglage spécial pour le capteur de gaz. Il doit chauffer avant de prendre une mesure. Cette ligne règle le chauffage à 320°C pendant 150 millisecondes. C’est crucial pour mesurer les composés organiques volatils (COV) dans l’air.
bme.setGasHeater(320, 150); // 320*C for 150 ms
loop
Voyons maintenant la fonction loop(), qui s’exécute en continu. Elle commence par vérifier si une lecture du capteur est disponible avec bme.performReading(). Si la lecture réussit, elle affiche les données.
if (bme.performReading()) {
La température est récupérée depuis bme.temperature, et la valeur est affichée dans le Moniteur Série en degrés Celsius.
Serial.print("Temperature = ");
Serial.print(bme.temperature);
Serial.println(" *C");
De même, la mesure d’humidité est extraite de bme.humidity et affichée en pourcentage.
Serial.print("Humidity = ");
Serial.print(bme.humidity);
Serial.println(" %");
La pression atmosphérique est obtenue depuis bme.pressure. La valeur est en Pascals, donc la division par 100 la convertit en hPa (hectopascals), unité standard pour la pression barométrique.
Serial.print("Pressure = ");
Serial.print(bme.pressure / 100.0);
Serial.println(" hPa");
L’altitude n’est pas mesurée directement — elle est calculée à partir de la pression en utilisant la référence au niveau de la mer. La fonction readAltitude() s’en charge pour vous.
Serial.print("Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");
Enfin, la résistance du gaz (en Ohms) est affichée. Cette valeur donne une indication de la qualité de l’air. Le capteur ne précise pas quels gaz sont présents, mais une résistance élevée signifie généralement un air plus propre. La division par 1000 convertit la valeur en kilo-ohms pour une lecture plus facile.
Serial.print("Gas = ");
Serial.print(bme.gas_resistance / 1000.0);
Serial.println(" KOhms");
La boucle fait ensuite une pause de 2 secondes avant de recommencer. Ce délai vous permet de voir clairement la sortie dans le Moniteur Série. Vous devriez voir la sortie suivante :

Voilà ! Vous savez maintenant comment configurer et lire les données du BME680 connecté à une carte Arduino via I2C. Dans la section suivante, je vous montre rapidement comment utiliser l’interface SPI à la place.
Connexion du BME680 via SPI
Au lieu de l’I2C, vous pouvez aussi communiquer avec le BME680 via SPI, ce qui nécessite plus de connexions mais permet des mesures plus rapides.
Selon la carte microcontrôleur, les broches SPI matérielles diffèrent. Consultez le Find I2C and SPI default pins tutoriel si vous devez les identifier. Pour l’Arduino UNO, ces broches sont 13 (SCK), 12 (MISO/SDO), 11 (MOSI/SDA) et 10 (CS/SS). Le schéma ci-dessous montre les connexions à réaliser.

Par rapport au code précédent, vous devez seulement remplacer la ligne suivante qui crée l’objet capteur
Adafruit_BME680 bme;
par cette ligne, qui spécifie les broches utilisées pour connecter le BME680 via SPI :
#define BME_SCK 13 #define BME_MISO 12 #define BME_MOSI 11 #define BME_CS 10 Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);
Tout le reste du code peut rester exactement le même.
Conclusion
Dans ce tutoriel, vous avez appris à utiliser le BME680 capteur environnemental avec un Arduino. Le BME680 est un capteur très petit capable de mesurer avec précision la température, l’humidité, la pression et les concentrations de gaz.
Comparé au très similaire BME280, le BME680 possède un capteur de gaz supplémentaire, mais cela signifie aussi qu’il doit chauffer pendant 5 à 20 minutes avant que les mesures de gaz soient fiables et qu’il consomme plus d’énergie. Si vous n’avez pas besoin des mesures de gaz, optez pour le BME280, moins cher et plus petit. Consultez le How To Use BME280 Pressure Sensor With Arduino tutoriel pour plus d’informations.
Notez qu’il existe aussi un BMP280, qui est moins cher et consomme moins d’énergie, mais ne mesure que la température et la pression. Si vous avez seulement besoin de la température et de l’humidité, préférez le SI7021, qui est encore plus petit et plus précis. Jetez un œil au Si7021 Temperature Sensor Arduino Tutorial.
D’autres capteurs courants mais moins précis à considérer sont le LM35, le TMP36, le DS18B20 et le DHT11/ DHT22. Pour afficher les données des capteurs, consultez les tutoriels Weather Station on e-Paper Display et Temperature Plotter on e-Paper Display.
Enfin, si vous souhaitez transmettre des données environnementales sur de plus longues distances, au-delà de la portée Bluetooth ou Wi-Fi, la communication longue portée via LoRa pourrait vous intéresser : Send Environmental Data with LoRa.
Nous n’avons pas abordé l’interprétation des mesures de concentration de gaz du BME680. Si vous souhaitez mesurer la qualité de l’air, consultez le Measure Air Quality with BME680 tutoriel, où ce sujet est traité en détail.
Si vous avez des questions, n’hésitez pas à les poser dans la section des commentaires.
Bon bricolage ; )

