Bonjour et bienvenue dans ce tutoriel où j’utilise le BMP280 pour mesurer la température, la pression et aussi l’altitude, avec l’aide d’une carte Arduino UNO et d’un afficheur OLED, et voici quelques données du BMP280 tirées de sa fiche technique:

Composants
Pour ce projet, nous allons utiliser le module BMP280 pour mesurer toutes ces variables dans les systèmes métrique et impérial, comme d’habitude, je ne suis pas sûr des unités mais vous pouvez toujours les convertir dans le code, et voici les composants que nous allons utiliser :





Si vous utiliser l’afficheur OLED pour la première fois, je vous conseille de jeter un coup d’oeil sur ce tuto:
Schéma de câblage:
Le câblage est simple, les deux modules utilisent l’interface i²c, SDA/SCL avec A4 et A5, le BMP280 est alimenté par 5v tandis que l’OLED utilise le 3.3v.

Librairies
Voici les librairies que j’ai utilisés:
- Librairie BMP 280: Télécharger ici depuis Github, ou bien télécharger directement ici.
- Librairie BMP 280 utilisée dans la vidéo et celle que j’ai modifié en dessous: Télécharger ici.
- Librairies OLED :
- Adafruit SSD1306: Vous pouvez télécharger la librairie depuis Github ici, ou bien télécharger directement par ici.
- Adafruit GFX-library: Vous pouvez télécharger la librairie depuis Github ici, ou bien télécharger directement par ici.
Vous pouvez toujours chercher les librairies qui vous conviennent vous même soit sur le gestionnaire de librairies de l’IDE soit sur les moteurs de recherches. Juste veiller à ne pas avoir deux librairies portante le même nom. et n’oubliez pas que les librairies sur Github sont mise à jour, donc il peut y avoir quelques modifications à faire.
Codes
Voici les codes que j’ai utilisés, Il y a d’abord le “I2C Scanner” pour vous aider à identifier l’adresse i2c du module, il y a aussi quelques exemples de la librairies. Vous pouvez copier les codes ci dessous, ou bien les télécharger ici.
J’ai rencontré un problème de détection au début, vous trouverez la solution en bas.
Vous trouverez les résultats des codes en bas.
Code 0: I2c Scanner
#include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); while (!Serial); //wait for serial monitor Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Unknow error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); // wait 5 seconds for next scan }
Code 1: Exemple de librairie -BMP280test
/*************************************************************************** This is a library for the BMP280 humidity, temperature & pressure sensor Designed specifically to work with the Adafruit BMP280 Breakout ----> http://www.adafruit.com/products/2651 These sensors use I2C or SPI to communicate, 2 or 4 pins are required to interface. Adafruit invests time and resources providing this open source code, please support Adafruit andopen-source hardware by purchasing products from Adafruit! Written by Limor Fried & Kevin Townsend for Adafruit Industries. BSD license, all text above must be included in any redistribution ***************************************************************************/ #include <Wire.h> #include <SPI.h> #include <Adafruit_BMP280.h> #define BMP_SCK (13) #define BMP_MISO (12) #define BMP_MOSI (11) #define BMP_CS (10) Adafruit_BMP280 bmp; // I2C //Adafruit_BMP280 bmp(BMP_CS); // hardware SPI //Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK); void setup() { Serial.begin(9600); while ( !Serial ) delay(100); // wait for native usb Serial.println(F("BMP280 test")); unsigned status; //status = bmp.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID); status = bmp.begin(); if (!status) { Serial.println(F("Could not find a valid BMP280 sensor, check wiring or " "try a different address!")); Serial.print("SensorID was: 0x"); Serial.println(bmp.sensorID(),16); Serial.print(" ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n"); Serial.print(" ID of 0x56-0x58 represents a BMP 280,\n"); Serial.print(" ID of 0x60 represents a BME 280.\n"); Serial.print(" ID of 0x61 represents a BME 680.\n"); while (1) delay(10); } /* Default settings from datasheet. */ bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */ Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */ Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */ Adafruit_BMP280::FILTER_X16, /* Filtering. */ Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */ } void loop() { Serial.print(F("Temperature = ")); Serial.print(bmp.readTemperature()); Serial.println(" *C"); Serial.print(F("Pressure = ")); Serial.print(bmp.readPressure()); Serial.println(" Pa"); Serial.print(F("Approx altitude = ")); Serial.print(bmp.readAltitude(1013.25)); /* Adjusted to local forecast! */ Serial.println(" m"); Serial.println(); delay(2000); }
Code 2: Affichage en moniteur série en unités métriques
/* Ceci est un code à utiliser avec BMP280 * On mesure la température,la pression et l'altitude et on les affichent sur le moniteur série (métrique) * Modifié depuis l'exemple de la librairie Adafruit * Veuillez visiter https://SurtrTech.com pour plus de détails */ #include <Adafruit_BMP280.h> //Librairie BMP280 Adafruit_BMP280 bmp; //Instance void setup() { Serial.begin(9600); Serial.println(F("BMP280 test")); if (!bmp.begin()) { Serial.println(F("Could not find a valid BMP280 sensor, check wiring!")); while (1); } /* Default settings from datasheet. */ bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */ Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */ Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */ Adafruit_BMP280::FILTER_X16, /* Filtering. */ Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */ } void loop() { Serial.print(F("Temperature = ")); Serial.print(bmp.readTemperature()); Serial.println(" *C"); Serial.print(F("Pression = ")); Serial.print(bmp.readPressure()/100); //Pression en hPa Serial.println(" hPa"); Serial.print(F("Altitude = ")); Serial.print(bmp.readAltitude(1019.66)); //(1019.66) est la pression en (hPa) au niveau de la mer dans votre région Serial.println(" m"); Serial.println(); delay(2000); }
Code 3: Affichage en moniteur série en unités impériales
/* Ceci est un code à utiliser avec BMP280 * On mesure la température,la pression et l'altitude et on les affichent sur le moniteur série (impérial) * Modifié depuis l'exemple de la librairie Adafruit * Veuillez visiter https://SurtrTech.com pour plus de détails */ #include <Adafruit_BMP280.h> //Librairie BMP280 Adafruit_BMP280 bmp; //Instance void setup() { Serial.begin(9600); Serial.println(F("BMP280 test")); if (!bmp.begin()) { Serial.println(F("Could not find a valid BMP280 sensor, check wiring!")); while (1); } /* Default settings from datasheet. */ bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */ Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */ Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */ Adafruit_BMP280::FILTER_X16, /* Filtering. */ Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */ } void loop() { float f = bmp.readTemperature()*9/5 + 32 ; //Convertir °C à °F Serial.print(F("Temperature = ")); Serial.print(f); Serial.println(" *F"); float P = bmp.readPressure()/3386.39; //Affichage de la pression en pouces de mercure Serial.print(F("Pression = ")); Serial.print(P); Serial.println(" inHg"); float A = bmp.readAltitude(1019.66)*3.28084; //(1019.66) est la pression en (hPa) au niveau de la mer dans votre région Serial.print(F("Altitude = ")); Serial.print(A); Serial.println(" ft"); Serial.println(); delay(2000); }
Code 4: Affichage sur OLED en unités métriques
/* Ceci est un code à utiliser avec BMP280 et OLED * On mesure la température,la pression et l'altitude et on les affichent sur l'écran OLED (métrique) * Veuillez visiter https://SurtrTech.com pour plus de détails */ #include <Adafruit_GFX.h> //Librairies BMP et OLED #include <Adafruit_SSD1306.h> #include <Adafruit_BMP280.h> #define SCREEN_WIDTH 128 //Résolutions OLED #define SCREEN_HEIGHT 32 #define OLED_RESET -1 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //Instances Adafruit_BMP280 bmp; void setup() { bmp.begin(); //Initialisation BMP et OLED display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.display(); display.setTextColor(WHITE); display.setTextSize(1); display.print("SurtrTech"); display.setCursor(32,12); display.setTextSize(2); display.println("BMP280"); display.display(); delay(2000); } void loop() { display.clearDisplay(); float T = bmp.readTemperature(); //Mesure de température en °C float P = bmp.readPressure()/100; //Mesure de la pression en Pa et conversion en hPa float A = bmp.readAltitude(1019.66); //Mesure de l'altitude (1019.66) est la pression en (hPa) au niveau de la mer dans votre région display.setCursor(0,0); display.setTextColor(WHITE); display.setTextSize(2); display.print("Temp"); display.setCursor(0,18); display.print(T,1); display.setCursor(50,17); display.setTextSize(1); display.print("C"); display.setTextSize(1); display.setCursor(65,0); display.print("Pres"); display.setCursor(65,10); display.print(P); display.setCursor(110,10); display.print("hPa"); display.setCursor(65,25); display.print("Alt"); display.setCursor(90,25); display.print(A,0); display.setCursor(110,25); display.print("m"); display.display(); delay(2000); }
Code 5: Affichage sur OLED en unités impériales
/* Ceci est un code à utiliser avec BMP280 et OLED * On mesure la température,la pression et l'altitude et on les affichent sur l'écran OLED (impériale) * Veuillez visiter https://SurtrTech.com pour plus de détails */ #include <Adafruit_GFX.h> //Librairies BMP et OLED #include <Adafruit_SSD1306.h> #include <Adafruit_BMP280.h> #define SCREEN_WIDTH 128 //Résolutions OLED #define SCREEN_HEIGHT 32 #define OLED_RESET -1 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //Instances Adafruit_BMP280 bmp; void setup() { bmp.begin(); //Initialisation BMP et OLED display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.display(); display.setTextColor(WHITE); display.setTextSize(1); display.print("SurtrTech"); display.setCursor(32,12); display.setTextSize(2); display.println("BMP280"); display.display(); delay(2000); } void loop() { display.clearDisplay(); float T = bmp.readTemperature()*9/5 + 32; //Mesure de température en °C et conversion en °F float P = bmp.readPressure()/3386.39; //Mesure de la pression en Pa et conversion en pouces de mercure float A = bmp.readAltitude(1019.66)*3.28084; //Mesure de l'altitude, puis conversion de "m" à "ft" (1019.66) est la pression en (hPa) au niveau de la mer dans votre région display.setCursor(0,0); display.setTextColor(WHITE); display.setTextSize(2); display.print("Temp"); display.setCursor(0,18); display.print(T,1); display.setCursor(50,17); display.setTextSize(1); display.print("F"); display.setTextSize(1); display.setCursor(65,0); display.print("Pres"); display.setCursor(65,10); display.print(P); display.setCursor(100,10); display.print("inHg"); display.setCursor(65,25); display.print("Alt"); display.setCursor(90,25); display.print(A,0); display.setCursor(110,25); display.print("ft"); display.display(); delay(2000); }
Tests, résultats et troubleshooting:
Après avoir câblé votre module, il est préférable de tester le code de l’exemple de bibliothèque dont le nom est « BMP280test », si votre module n’est pas détecté comme dans l’image ci-dessous :

Vous pouvez lancer le code du scanner i²c (mais débranchez tout autre périphérique i²c comme un LCD ou un OLED), et si votre module n’est pas cassé, ou n’a pas de problème de soudure, vous verrez que le périphérique est détecté par le scanner :

Solution 1:
Ceci est la solution 1, je vous conseille d’abord d’essayer la solution 2, parce que la librairie a changé.
Notez cette adresse et allez dans le fichier « .C++ Source File » de votre bibliothèque, la bibliothèque est généralement installée dans « Documents/Arduino/Libraries » :

Et ouvrez-le avec un éditeur approprié, j’utilise Dev c++.

Ensuite, allez à la ligne « 41 » et _i2caddr remplacez le « a » par l’adresse que vous avez trouvée sur le moniteur série :

Sauvegardez tout et fermez, la bibliothèque est censée fonctionner avec des modules qui ont 0x77 comme adresse i²c mais celui que j’utilise a 0x76.
Exécutez à nouveau le code de test :

Solution 2
Ne modifier rien dans la librairie, et dans le code aller à la ligne
bmp.begin()
entre () mettez l’adresse i2c que vous avez trouvé par le I2c Scanner.
Autres résultats:

