In this project we will create an environmental system with a MPL3115A2 and a Wemos Mini and we will then display the readings on an OLED display
First of all the MPL3115A2 sensor
The MPL3115A2 is a compact, piezoresistive, absolute pressure sensor with an I2C digital interface. MPL3115A2 has a wide operating range of 20 kPa to 110 kPa, a range that covers all surface elevations on earth. The MEMS is temperature compensated utilizing an on-chip temperature sensor. The pressure and temperature data is fed into a high resolution ADC to provide fully compensated and digitized outputs for pressure in Pascals and temperature in °C.
The compensated pressure output can then be converted to altitude, utilizing the formula stated in Section 9.1.3 “Pressure/altitude” provided in meters.The internal processing in MPL3115A2 removes compensation and unit conversion load from the system MCU, simplifying system design
Requirements
Lets take a look a the shields and boards that are required for this project
Parts List
I connect the Wemos Mini to the dual base and then put the OLED shield along side this, I then connect the MPL3115A2 sensor to the OLED or the spare base
Schematic
We use the I2C connection for the sensor – this shows the sensor connected to the OLED shield
Code
Again we use a library and again its an adafruit one – https://github.com/adafruit/Adafruit_MPL3115A2_Library
For the oled you need https://github.com/sparkfun/SparkFun_Micro_OLED_Arduino_Library
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_MPL3115A2.h>
#include <SFE_MicroOLED.h> // Include the SFE_MicroOLED library
#define PIN_RESET 255 //
#define DC_JUMPER 0 // I2C Addres: 0 - 0x3C, 1 - 0x3D
#define SEALEVELPRESSURE_HPA (1013.25)
MicroOLED oled(PIN_RESET, DC_JUMPER); // Example I2C declaration
Adafruit_MPL3115A2 baro = Adafruit_MPL3115A2();
void setup() {
Serial.begin(9600);
Serial.println("Adafruit_MPL3115A2 test!");
//start the OLED
oled.begin();
oled.clear(ALL); // Clear the display's memory (gets rid of artifacts)
oled.display();
}
void loop()
{
if (! baro.begin()) {
Serial.println("Couldnt find sensor");
return;
}
float pascals = baro.getPressure();
// Our weather page presents pressure in Inches (Hg)
// Use http://www.onlineconversion.com/pressure.htm for other units
oled.clear(PAGE);
oled.setFontType(0); // set font type 0, please see declaration in SFE_MicroOLED.cpp
oled.setCursor(1, 3);
oled.print("Altitude = ");
oled.setCursor(1, 12);
oled.print(baro.getAltitude());
oled.print(" m");
oled.setCursor(1, 21);
oled.print("Temp =");
oled.setCursor(1, 30);
oled.print(baro.getTemperature());
oled.print(" *C ");
oled.display();
delay(2000);
//2nd page of readings
oled.clear(PAGE);
oled.setFontType(0); // set font type 0, please see declaration in SFE_MicroOLED.cpp
oled.setCursor(1, 3);
oled.print("Pressure = ");
oled.setCursor(1, 12);
oled.print(pascals/3377);
oled.print(" Hg");
oled.setCursor(1, 21);
oled.display();
delay(1000);
}
Download the example from ESP8266_OLED_and_MPL31152
Links
https://www.nxp.com/docs/en/data-sheet/MPL3115A2.pdf