Code de recherche

Leçon 96-3 : Capteur de pression barométrique, de température et d'altitude approximative BMP390 avec Arduino sur LCD2004

Leçon 96-3 : Capteur de pression barométrique, de température et d'altitude approximative BMP390 avec Arduino sur LCD2004

Le BMP390 est un capteur de pression barométrique, de température et d'altitude approximative très précis de Bosch. Ce tutoriel, qui fait partie du cours Arduino Step-by-Step de Robojax, se concentre sur la façon de lire les données de ce capteur et de les afficher sur un grand écran à caractères 20x4 (LCD2004). Cette configuration est idéale pour les projets où vous devez voir toutes les lectures du capteur simultanément sur un seul écran, ce qui la rend parfaite pour les stations de surveillance environnementale, les stations météorologiques ou comme altimètre de précision pour les fusées modèles ou les drones.

BMP380_pink-module-1

Voici quelques idées de projets pratiques que vous pouvez réaliser avec cette configuration :

  • Construire une station météorologique domestique qui affiche la température, la pression et l'altitude.
  • Créer un altimètre de haute précision pour une fusée modèle ou un ballon à haute altitude afin de suivre son ascension et sa descente.
  • Développer un enregistreur de données pour une serre ou une salle de serveurs où vous pouvez surveiller les conditions atmosphériques en temps réel.
  • Construire un dispositif pour mesurer la différence d'altitude entre les étages d'un bâtiment, comme démontré dans la vidéo.
BMP380_pink-module-4

Matériel requis

  • Arduino Uno (ou toute carte compatible)
  • Module capteur de pression barométrique BMP390
  • Écran LCD LCD2004 (20x4) I2C
  • Fils de connexion

Guide de câblage

BMP390_arduino_wiring_2-gravity-module
BMP390_arduino_wiring_pink-1-from-sda-scl-pins
BMP390_arduino_wiring_pink-2
BMP390_LCD2004_wiring_pink

Le câblage de ce projet est simple, car le capteur BMP390 et l'écran LCD2004 utilisent tous deux le protocole de communication I2C. Cela vous permet de connecter les deux appareils en utilisant seulement deux lignes de données (SDA et SCL) plus l'alimentation et la masse.

Dans la vidéo, la broche VIN du capteur est connectée à une broche numérique (broche 12) de l'Arduino. C'est une astuce intelligente utilisée dans le code pour contrôler l'alimentation du capteur, permettant à l'Arduino de l'allumer ou de l'éteindre par programmation. Les lignes SDA et SCL du capteur sont connectées respectivement aux broches A4 et A5 de l'Arduino.

Pour l'écran LCD2004, les broches VCC et GND sont connectées aux broches 5V et GND de l'Arduino. Ses broches SDA et SCL sont également connectées à A4 et A5, partageant le même bus I2C que le capteur.

Remarque sur les adresses I2C : Chaque appareil I2C a une adresse unique. L'écran LCD2004 utilise souvent l'adresse 0x27 ou 0x3F. Vous devez exécuter un programme de balayage I2C pour trouver l'adresse correcte pour votre écran LCD spécifique, comme montré dans la vidéo. Le capteur BMP390 doit également être détecté sur le bus.

 

BMP380_pink-module-2
BMP288-1

Explication du code

Cette section explique les parties du code configurables par l'utilisateur. Le programme complet est disponible sous l'article. Le code est conçu pour être modulaire, avec une fonction personnalisée pour récupérer les données et une autre pour les afficher sur l'écran LCD.

1. Configuration de la bibliothèque et des broches

Le code commence par inclure les bibliothèques nécessaires pour le capteur BMP390 et l'écran LCD I2C. Vous devrez installer la bibliothèque Adafruit BMP3XX et la bibliothèque LiquidCrystal_I2C à l'aide du gestionnaire de bibliothèques Arduino.

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BMP3XX.h"
#include <LiquidCrystal_I2C.h>

// Définir l'adresse LCD sur 0x27 ou 0x3F pour un affichage de 20 caractères et 4 lignes
LiquidCrystal_I2C lcd(0x27, 20, 4);

// Broche pour le VIN du BMP390
int bmpVCCPin = 12;
  • LiquidCrystal_I2C lcd(0x27, 20, 4); : Cette ligne initialise l'écran LCD. Le premier paramètre est l'adresse I2C, que vous devez modifier pour correspondre à votre écran LCD (par exemple, 0x3F). Les deuxième et troisième paramètres sont le nombre de colonnes (20) et de lignes (4) pour votre LCD2004.
  • int bmpVCCPin = 12; : Cela définit la broche Arduino qui fournira l'alimentation au capteur BMP390. Vous pouvez la changer pour toute autre broche numérique. Le code définit cette broche comme sortie et la met à HIGH dans la fonction setup() pour fournir 5V au capteur.

2. Configuration des unités d'affichage

boolean fahrenheit = true;//pour Celsius, mettez-le à "false"
  • boolean fahrenheit = true; : Cette variable contrôle l'unité de température affichée sur le moniteur série. La définir sur true affiche Fahrenheit, tandis que la définir sur false affiche Celsius. Le code d'affichage LCD montre toujours les deux unités.

3. La fonction getBMP()

Il s'agit d'une fonction personnalisée puissante qui récupère une lecture spécifique du capteur. Elle prend un argument de caractère unique pour spécifier la valeur souhaitée.

float getBMP(char type)
{
   float value;
   float temp = bmp.temperature;
   if(type =='F') {
       value = temp *9/5 + 32;//convertir en Fahrenheit
   } else if(type =='K') {
       value = temp + 273.15;//convertir en Kelvin
   } else if(type =='P') {
       value = bmp.pressure / 100.0F; // lire la pression en hPa
   } else if(type =='A') {
       value = bmp.readAltitude(SEALEVELPRESSURE_HPA);// lire l'altitude
   } else {
       value = bmp.temperature;// lire la température en Celsius
   }
   return value;
}

Comment l'utiliser : Pour obtenir une valeur spécifique, appelez la fonction avec le caractère correspondant. Par exemple, getBMP('F') renvoie la température en Fahrenheit, getBMP('P') renvoie la pression en hectopascals (hPa), et getBMP('A') renvoie l'altitude approximative en mètres.

4. La fonction lcdDisplay()

Cette fonction est une aide qui simplifie l'affichage d'un titre et d'une valeur sur l'écran LCD à une position spécifique. Elle gère automatiquement le positionnement du curseur et les symboles d'unité (comme °C, °F, hPa, m).

void lcdDisplay(int tc, int tr, String title, int vc, int vr, float value, char symbol)
{
   lcd.setCursor (tc,tr);
   lcd.print(title);
   if(vc !=99) {
       lcd.setCursor (vc,vr);
   }
   lcd.print(value);
   // ... code pour imprimer le symbole d'unité correct basé sur 'symbol' ...
}

Comment l'utiliser : Vous devez fournir le caractère de départ (colonne) et la ligne pour le titre, le texte du titre lui-même, la position du caractère et de la ligne pour la valeur, la valeur numérique, et un caractère de symbole (par exemple, 'C', 'F', 'p', 'm') pour imprimer l'unité correcte. Une valeur de 99 pour la position du caractère de la valeur indique à la fonction d'imprimer la valeur immédiatement après le titre.

Démonstration du projet en direct

Dans la vidéo (à 28:05), Robojax démontre le projet en action. L'écran LCD2004 affiche clairement les quatre lectures clés en même temps : la température en Celsius, la température en Fahrenheit, la pression en hPa et l'altitude approximative en mètres. C'est un avantage significatif par rapport à un écran LCD1602 plus petit, qui ne peut afficher que deux de ces valeurs à la fois.

Il effectue également un test de chaleur à l'aide d'un pistolet thermique (dans la vidéo à 30:30), montrant comment les valeurs de température et d'altitude affichées réagissent instantanément aux changements de l'environnement du capteur, confirmant la haute précision et le taux d'échantillonnage rapide du capteur.

Pour démontrer la fonctionnalité d'altitude, Robojax emmène le projet au 25e étage d'un bâtiment (dans la vidéo à 35:43). Le capteur lit une altitude approximative de 57,2 mètres au sommet, par rapport à une lecture négative au rez-de-chaussée, montrant une différence claire correspondant à la hauteur du bâtiment.

Le projet pour utiliser le BMP390 comme thermostat pour contrôler un relais est couvert dans Leçon 96-4 : Capteur de pression barométrique, de température et d'altitude approximative BMP390 avec Arduino comme thermostat.

La conduite du capteur avec un code de base sur le moniteur série est couverte dans Leçon 96-1 : Capteur de pression barométrique, de température et d'altitude approximative BMP390 avec Arduino Code de base.

L'affichage des données du capteur sur un écran plus petit à deux lignes est couvert dans Leçon 96-2 : Capteur de pression barométrique, de température et d'altitude approximative BMP390 avec Arduino sur LCD1602.

Projets connexes de cette vidéo

Chapitres

  • [00:00] Introduction au projet BMP390
  • [01:19] Comprendre le capteur BMP390 et ses caractéristiques
  • [05:45] Schéma de câblage pour BMP390 avec Arduino Uno
  • [10:29] Installation des bibliothèques Arduino nécessaires
  • [11:38] Explication du code BMP390 de base
  • [16:54] Configuration du LCD2004 et du scanner d'adresse I2C
  • [20:09] Explication détaillée du code pour l'affichage LCD2004
  • [26:22] Démonstration en direct avec le moniteur série et le test de chaleur
  • [28:05] Démonstration du projet sur LCD2004
  • [32:12] Test d'altitude réel au 25e étage

Images

LCD2004_display-2
LCD2004_display-2
BMP288-1
BMP288-1
BMP380_pink-module-4
BMP380_pink-module-4
BMP380_pink-module-3-size
BMP380_pink-module-3-size
BMP380_pink-module-2
BMP380_pink-module-2
BMP380_pink-module-1
BMP380_pink-module-1
BMP380_pink-module-gravitiy-1
BMP380_pink-module-gravitiy-1
BMP390_arduino_wiring_2-gravity-module-sda-scl-pins
BMP390_arduino_wiring_2-gravity-module-sda-scl-pins
BMP390_arduino_wiring_2-gravity-module
BMP390_arduino_wiring_2-gravity-module
BMP390_arduino_wiring_pink-1-from-sda-scl-pins
BMP390_arduino_wiring_pink-1-from-sda-scl-pins
BMP390_arduino_wiring_pink-2
BMP390_arduino_wiring_pink-2
BMP390_LCD2004_wiring_pink
BMP390_LCD2004_wiring_pink
436-Lesson 96-3: BMP390 with LCD2004
Langue: C++
/*
 * Lesson 96: BMP390 with LCD2004
 * with Arduino with LCD2004
Download and resource page https://robojax.com/RJT456

 * Watch video instruction on YouTube:  https://youtu.be/XevQYG_A5xA
 * 
 * Code updated by Ahmad Shamshiri for Robojax.com
 * on Jan 13, 2022 at 17:10 in Ajax, Ontario, Canada
  
  This video is part of Arduino Step by Step Course which starts here: https://youtu.be/-6qSrDUA5a8
 

If you found this tutorial helpful, please support me so I can continue creating content like this
and make a donation using PayPal http://robojax.com/L/?id=64


  This is a library for the BMP390 temperature & pressure sensor

  Designed specifically to work with the Adafruit BMP388 Breakout
  ----> http://www.adafruit.com/products/3966

  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 and open-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 <Adafruit_Sensor.h>
#include "Adafruit_BMP3XX.h"


#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BMP3XX bmp;
int bmpVCCPin = 12;
boolean fahrenheit = true;//for Celsius set it to "false"

#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 or 0x3F for a 20 chars and 4  line display
LiquidCrystal_I2C lcd(0x27, 20, 4);


void setup() {
    pinMode(bmpVCCPin, OUTPUT);// set pin as output
    digitalWrite(bmpVCCPin,HIGH);// always keep it high (5V) for BMB390 module
     
  Serial.begin(9600);
  while (!Serial);
  Serial.println("Adafruit BMP388 / BMP390 test");

  if (!bmp.begin_I2C()) {   // hardware I2C mode, can pass in address & alt Wire
    Serial.println("Could not find a valid BMP3 sensor, check wiring!");
    while (1);
  }

  // Set up oversampling and filter initialization
  bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X);
  bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X);
  bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3);
  bmp.setOutputDataRate(BMP3_ODR_50_HZ);
  // initialize the LCD, 
  lcd.begin();
  // Turn on the blacklight and print a message.
  lcd.backlight();     
  lcd.print("Robojax Video");
  lcd.setCursor (0,1); // go to start of 2nd line
  lcd.print("BMP390 Test LCD2004");
  lcd.setCursor (0,2); // go to start of 3nd line
  lcd.print("www.Robojax.com");  
  delay(4000);  
}

void loop() {
  if (! bmp.performReading()) {
    Serial.println("Failed to perform reading :(");
    return;
  }

    // Robojax.com BME390 Code
   lcd.clear();// clear previous values from screen  

lcdDisplay(
             // to print Celsius:
             0, // character 0 
             0, // line 0
             "Celsius: ", 

             // to print Celsius value
             12, // character undefined
             0, // line 0
             getBMP('C'),
             'C'
             );  

 lcdDisplay(
             // to print fahrenheit:
             0, // character 0 
             1, // line 2
             "Fahrenheit: ", 

             // to print Fahrenheit value
             12, // character 9
             1, // line 2
             getBMP('F'),
             'F'
             );  
 

lcdDisplay(
             // to print pressure text
             0, // character 0 
             2, // line 3
             "Pressure:", 

             // to print pressure value
             99, // character undefined
             2, // line 3
             getBMP('P'),
             'p' 
             );  
  lcdDisplay(
             // to print altitude text
             0, // character 0 
             3, // line 4
             "Aprx. Alt.:", 

             // to print Altitude value
             12, // character undefined
             3, // line 4
             getBMP('A'),
             'm' 
             );                   
        delay(4000);

     // Robojax.com BMP390 Code                                

  //take action, do something when temperature is greater than 38.0 C
  if(bmp.temperature >38.0)
  {
   digitalWrite(10, HIGH); 

   
  }else{
    digitalWrite(10, LOW);
  }
  delay(2000);
  printRobojax(false);//set to true, or false
  
}//loop ends here

/*
 * @brief returns temperature or relative humidity
 * @param "type" is character
 *     C = Celsius
 *     K = Kelvin
 *     F = Fahrenheit
 *     H = Humidity
 *     P = Pressure
 *     A = Altitude
 * @return returns one of the values above
 * Usage: to get Fahrenheit type: getBMP('F')
 * to print it on serial monitor Serial.println(getBMP('F'));
 * Written by Ahmad Shamshiri on July 13, 2019. Update 13 Jan 2022
 * at 20:56 
 * in Ajax, Ontario, Canada
 * www.Robojax.com 
 */
float getBMP(char type)
{
   // Robojax.com BMP390 Code
  float value;
    float temp = bmp.temperature;
  if(type =='F')
   {
    value = temp *9/5 + 32;//convert to Fahrenheit 
   }else if(type =='K')
   {
    value = temp + 273.15;//convert to Kelvin
   }else if(type =='P')
   {
    value = bmp.pressure / 100.0F; // read pressure
   }else if(type =='A')
   {
    value = bmp.readAltitude(SEALEVELPRESSURE_HPA);// read altitude
   }else{
    value = bmp.temperature;// read temperature
   }
   return value;
    // Robojax.com BME390 Code
}//getBME



/*
 * lcdDisplay(int tc, int tr, String title, int vc, int vr, float value)
 * displays value and title on LCD1602
 * How to use:
 * If you want to display: "Temp.: 340.45K" starting from first character
 * on second row.
 * use:
 * lcdDisplay(0, 1, "Temp.: ", 340.45,'K')
 *   
 *   'C' is degree symbol for C and F
 * tc  is character number  (0)
 * tr is row in the lcd (1)
 * title is the text (Voltage:)
 * vc value for character 
 * vr value for  row or line
 * value is the value (13.56)
 */
void lcdDisplay(int tc, int tr, String title, int vc, int vr, float value,char symbol)
{
   // Robojax.com LCD1602 for BMP390 Demo

   lcd.setCursor (tc,tr); //
   lcd.print(title);
   if(vc !=99)
   {
   lcd.setCursor (vc,vr); //
   }   
   lcd.print(value);
   if(symbol == 'C')
   {
    lcd.print((char)223);
    lcd.print('C');
   }else if(symbol == 'F')
   {
    lcd.print((char)223);
    lcd.print('F');
   }else if(symbol =='k')
   {
    lcd.print("K");
   }else if(symbol =='p')
   {
    lcd.print("hPa");
   }else if(symbol =='m')
   {
    lcd.print("m");
   }
}
 // Robojax.com LCD1602 for BMP390 Demo

/*
 * 
 * this function, if called, will print Robojax stuff
 * */
 void printRobojax( boolean doPrint)
 {
  if (doPrint){
   lcd.clear();// clear previous values from screen  
   lcd.setCursor (0,0); //set to line char 1, line 1
   lcd.print("Robojax  Tutorial"); 

   lcd.setCursor (0,1); //set to line char 1, line 2
   lcd.print("BME390 Demonstration");    

   lcd.setCursor (0,0); //set to line char 1, line 1
   lcd.print("Robojax  Tutorial"); 

   lcd.setCursor (0,2); //set to line char 1, line 3
   lcd.print("Dispaly on LCD2004");  

   lcd.setCursor (0,3); //set to line char 1, line 4
   lcd.print("www.ROBOJAX.com");
   delay(4000);     
  }     
 }

Ressources et références

Fichiers📁

Fiche technique (pdf)