Overview
This project reads values from a BMP280 sensor and displays the readings on a 20x4 LCD screen with an I2C backpack. This sketch measures the pressure and derives the altitude based on that and prints both values on the LCD screen.
Components
Component Name | Purpose |
---|---|
Arduino Nano | This will be the microcontroller |
BMP280 | This will be the pressure sensor |
I2C LCD 20X4 | This will be the LCD display |
Circuit Diagram
Assembly
BMP280
Nano Pin | BMP280 Pin |
---|---|
A4 | SDA |
A5 | SCL |
5V | VCC |
Gnd | Gnd |
I2C LCD Pin
Nano Pin | I2C LCD Pin |
---|---|
A4 | SDA |
A5 | SCL |
5V | VCC |
GND | GND |
Code
/*
Project: BMP Sensor value reading with output on LCD with I2C Backpack
Project Description:
This sketch writes readings read from a BMP sensor to an LCD display module.
This sketch is for a 20x4 screen.
Author: STEMVentor Educonsulting
This code is copyrighted. Please do not reuse or share for any purpose other than for learning with subscribed STEMVentor programs.
This code is for educational purposes only and is not for production use.
*/
// LIBRARIES
//used for communicating with I2C devices
#include <Wire.h>
//https://www.arduino.cc/reference/en/libraries/liquidcrystal-i2c/
// Install the LiquidCrystal I2C by Frank de Brabander from the IDE library manager.
#include <LiquidCrystal_I2C.h>
//BMP pressure sensor library
//one change has been made to the .h file of BMP280 library file that the default address of the bmp is set to 0x76 since the BMP being used in this project has that as its address.
//address of the BMP was found with the help of I2C address finder code
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
// PIN DEFINITIONS
// GLOBAL VARIABLES
// Define the display size
const byte rows = 4;
const byte cols = 20;
// used for reading sensor value
float tempValue;
float pressureValue;
float altitudeValue;
/* INITIALIZE OBJECTS
* Libraries usually follow an object-oriented approach that requires
* an instance of the class to call its methods.
*/
/*
* All I2C components have an address, the default is usually 0x27
* If that doesn't work, see this:https://playground.arduino.cc/Main/I2cScanner/
* The init statement accepts the address and the number of columns and rows.
*/
LiquidCrystal_I2C lcd(0x27, cols, rows);
Adafruit_BMP280 bmp;
/* LOCAL FUNCTIONS */
// Read an entire string (this is a blocking function and waits until timeout).
void readBMPValue()
{
tempValue = bmp.readTemperature(); // degree celcius
pressureValue = bmp.readPressure(); //in hPa
// Calculate altitude assuming 'standard' barometric
// pressure of 1013.25 millibar = 101325 Pascal
altitudeValue= bmp.readAltitude(1004); //1004 is Mumbai's avg sea level pressure
}
/*
Function to print to LCD on a single row.
Takes the row number and the text to display on that row (max 20 chars, rest will be truncated).
The entire display is cleared if the clear_all flag is true, else only the row is cleared (the default).
*/
void printToLCDByRow(int row, String text, bool clear_all = false)
{
const char* twenty_spaces = " ";
if(clear_all){
lcd.clear(); //clears the entire display
}
lcd.setCursor(0, row-1);
lcd.print(twenty_spaces); //clears the row
lcd.setCursor(0, row-1); //cursor has to be set again after printing spaces
lcd.print(text);
}
/*
Function to print to LCD across rows with each row having 20 chars.
Messages can be a maximum of 20x4 chars, rest will betruncated.
The entire display is cleared before printing the text.
Test string of 20 char:
12345678901234567890
Test strings of 80 chars:
12345678901234567890123456789012345678901234567890123456789012345678901234567890
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec varius est donec.
*/
void printToLCD(String text)
{
lcd.clear(); //clears the entire display
byte chars_remaining = text.length();
byte char_from = 0;
byte char_to = chars_remaining < cols ? text.length() : char_from + cols;
byte row = 1;
while(chars_remaining > 0){
String line = text.substring(char_from, char_to);
printToLCDByRow(row, line);
chars_remaining = text.length() - char_to;
char_from = char_to;
char_to = chars_remaining < cols ? text.length() : char_from + cols;
row++;
}
Serial.println("Data string has been displayed on LCD");
}
void bmp_setup()
{
if (bmp.begin()) //starts the bmp
{
Serial.println("BMP180 initialized successfully.");
}
else
{
Serial.println("BMP180 initialization failed.");
}
}
// function to LCD setup
void LCD_setup()
{
// Initializing wire
Wire.begin();
// Initialize the LCD.
lcd.init();
// Turn on the blacklight and print a message.
lcd.backlight();
// Use the function to display text on each line indiviudally.
printToLCDByRow(1, "I2C LCD Ready!", true);
printToLCDByRow(2, "Enter some text.", false);
printToLCDByRow(3, "Max 80 characters.", false);
printToLCDByRow(4, "For a 20x4 LCD.", false);
}
/* SETUP CODE: runs once when the board starts up or resets */
void setup() {
// Start the serial communication with baud rate suitable for your components.
Serial.begin(9600);
LCD_setup();
bmp_setup();
Serial.println("The board is ready!");
}
/* MAIN LOOP: runs repeatedly at a very high frequency (1000s of times a second) */
void loop() {
delay(1000);
readBMPValue();
printToLCDByRow(1, "Temperature" + String(tempValue) + "C", true);
printToLCDByRow(2, "Pressure" + String(pressureValue) + "hPa", false);
printToLCDByRow(3, "Altitude" + String(altitudeValue) + "m", false);
}