Quantcast
Channel: Yassine – SURTR TECHNOLOGY
Viewing all articles
Browse latest Browse all 21

Mesurer la température, la pression et l’altitude avec Arduino et BMP280 + OLED

$
0
0

 



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:

1.jpg
Quelques caractéristiques du BMP280

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:

Utiliser un afficheur OLED avec Arduino



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.

Wiring
BMP280 avec un afficheur OLED et Arduino

Librairies

Voici les librairies que j’ai utilisés:

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 :

test1.png
Module non détecté par la bibliothèque

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 :

test2.png
Module détecté, noter l’adresse

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 » :

lib1.jpg
Dossier de la bibliothèque

 

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

lib2
look of _i2caddr = a line

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

lib3
Remplacer a par l’adresse i²c du module

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 :

test3.jpg
Tout va bien



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:

 


Viewing all articles
Browse latest Browse all 21

Trending Articles