搜索代码

Lesson 96-3: Barometric Pressure, Temperature, and Approximate Altitude Sensor BMP390 with Arduino on LCD2004

Lesson 96-3: Barometric Pressure, Temperature, and Approximate Altitude Sensor BMP390 with Arduino on LCD2004

In this lesson, the BMP390 is explained, with wiring shown for I2C and SPI. Then, it shows how to display barometric pressure, temperature, and approximate altitude on the serial monitor, on an LCD1602, and on an LCD2004. A full wiring diagram is shown. Library installation is shown, and approximate altitude is measured on the first floor and compared with the altitude on the 25th floor. The code is fully explained and demonstrated using an Arduino UNO and an Arduino MEGA.

This code is for an LCD2004 with I2C, which has only 4 wires.

436-Lesson 96: Barometric Pressure, Temperature, and Approximate Altitude Sensor BMP390 with LCD
语言: C++
/*
 * Lesson 96: Using Precision BMP390 Barometric Pressure and Temperature Sensor
 * with Arduino with LCD2004
 * 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);     
  }     
 }

|||您可能需要的东西

资源与参考

文件📁

没有可用的文件。