MPL3115A2 – barometro, altimetro e termometro

Il sensore MPL3115A2 illustrato in questo articolo è prodotto da Freescale (ora NXP)può essere utilizzato come barometro, altimetro e termometro.
Il dispositivo ha una risoluzione tipica di 1,5 Pascal, e può misurare un’altitudine con una risoluzione di 0,3 metri (rispetto al BMP180 che può fare 0,17 m).
In questo caso il sensore è montato su un modulo realizzato dalla Adafruit codice 1893

MPL3115A2 barometro termometro altimetro

Il sensore MPL3115A2 ha alcuni vantaggi rispetto ai sensori BMP180/ BMP280 , come le uscite interupt per un consumo di energia ultra-basso, ed è anche molto più facile da leggere l’altitudine con un calcolo dell’altimetro incorporato, e non è richiesta nessuna lettura di calibrazione.

MPL3115A2 I2C Precision Altimeter


Come detto il chip MPL3115A2 oltre che come barometro e altimetro, può essere utilizzato come termometro con una precisione tipica di ± 1 ° C (± 3 ° C max).

MPL3115A2 barometro termometro altimetro MPL3115A2 barometro termometro altimetro

Circuito elettrico del modulo

Il chip richiede una tensione di 2-3,6 V sia per l’alimentazione e tensioni logiche, per questo motivo sulla  breakout è presente un regolatore a 3 V tipo MIC5225-3.3 e uno traslatore del livello logico realizzato tramite due MOSFET tipo BSS138.
Per qui risulta facile da interfacciare con qualsiasi Arduino o microcontrollore con funzionalità I2C.

Uso del sensore

L’ uso del sensore è semplice. Ad esempio, se si utilizza un Arduino, è sufficiente collegare il pin VDD al pin di tensione 5V, GND a terra, SCL a I2C Clock (pin A5 su un UNO) e SDA a I2C Data (A4 su un UNO).
Sarà poi necessario scarica la libreria Arduino MPL3115A2 e il codice di esempio per il calcolo della temperatura, della pressione e dell’altitudine di base.
Una volta installata la libreria e caricato lo sketch di esempi, sarà immediatamente possibile leggere i  dati di temperatura, pressione e altitudine stampati nella console seriale.

Caratteristiche del modulo

Dimensioni: 18 x 19 x 2 mm
Peso: 1,2 g
Vin: da 3 a 5,5 V CC
Logica: da 3 a 5 V.
Range di rilevamento della pressione: 50-110 kPa (fino a 10Km di altitudine)
Risoluzione 1,5 Pa / 0,3 m di altitudine
Questa scheda / chip utilizza l’indirizzo I2C a 7 bit 0x60

Libreria di gestione

Per la gestione del modulo sono disponibili varie librerie, una è quella fornita da Adafruit, ma quella utilizzata è quella realizzata dalla SparkFun, che produce un modulo simile, ma che non dispone del regolatore di tensione e del traslatore di livelli.
La libreria fornisce le seguenti funzioni:

  • begin() Gets sensor on the I2C bus.
  • readAltitude() Returns float with meters above sealevel. Ex: 1638.94
  • readAltitudeFt() Returns float with feet above sealevel. Ex: 5376.68
  • readPressure() Returns float with barometric pressure in Pa. Ex: 83351.25
  • readTemp() Returns float with current temperature in Celsius. Ex: 23.37
  • readTempF() Returns float with current temperature in Fahrenheit. Ex: 73.96
  • setModeBarometer() Puts the sensor into Pascal measurement mode.
  • setModeAltimeter() Puts the sensor into altimetery mode.
  • setModeStandy() Puts the sensor into Standby mode. Required when changing CTRL1 register.
  • setModeActive() Start taking measurements!
  • setOversampleRate(byte) Sets the # of samples from 1 to 128. See datasheet.
  • enableEventFlags() Sets the fundamental event flags. Required during setup.

Per caricare la libreria si utilizzerà la specifica funzione dell’IDE di Arduino, Gestione libreria. Sarà sufficiente ricercare “sparkfun MPL3115A2” e poi cliccare sul staso Installa.

Programma di test

Per il primo test sarà sufficiente collegare il modulo ad Arduino seguendo queste indicazioni:

  • 5V di Arduino al pin Vin del modulo
  • GND di Arduino con pin GND del modulo
  • Pin A5 di Arduino con pin SDA del modulo
  • A4 di Arduino con pin SCL del modulo

Si caricherà lo sketch sotto riportato e di attiverà il monito seriale dove sarà possibile leggere i valori letti dal sensore.

Scarica sketch 

[code lang=”arduino”]
#include <Wire.h>
#include "SparkFunMPL3115A2.h"

//Create an instance of the object
MPL3115A2 myPressure;

void setup()
{
Wire.begin(); // Join i2c bus
Serial.begin(9600); // Start serial for output
Serial.println("Test sensore MPL3115A2");

myPressure.begin(); // Get sensor online

//Configure the sensor
myPressure.setModeAltimeter(); // Measure altitude above sea level in meters

myPressure.setOversampleRate(7); // Set Oversample to the recommended 128
myPressure.enableEventFlags(); // Enable all three pressure and temp event flags
}

void loop()
{
float altitude = myPressure.readAltitude();
Serial.print("Altitudine(m):");
Serial.print(altitude, 2);

float pressure = myPressure.readPressure();
Serial.print(" Pressione(Pa):");
Serial.print(pressure, 2);

float temperature = myPressure.readTemp();
Serial.print(" Temp(C):");
Serial.print(temperature, 2);
Serial.println();
}
[/code]

Programma con utilizzo display OLE

Una versione più sofisticato del sensore è quello di mostrare i valori letti su un piccolo display OLED, per fare questo si è utilizzato il Multi test shield  le cui caratteristiche sono riportate nell’articolo Multi test shield per moduli e sensori compatibile Arduino.
Il display OLED utilizzato ha una diagonale di 0.95″, una risoluzione di 96×64 pixel, 65536 Colori ed è basato sul driver SSD1331 è dotato di interfaccia di comando SPI e può essere alimentato con una tensione compresa tra i 3.3V – 5V.

Sullo shield sono già presenti tutti i collegamenti per la connessione del display ed è presente il connettore JP15 su cui sono presenti i pin per il collegamento di un modulo con interfaccia I2C.
Lo schema da realizzarsi è quello riportato nell’immagine seguente

caricato il programma, i dati saranno visualizzati sul display e aggiornati ogni secondo.

Scarica sketch 

[code lang=”arduino”]
// Definizione dei pin di collegamento
#define sclk 13
#define mosi 11
#define cs 10
#define rst 9
#define dc 8

// Impostazione display OLED
#include <Adafruit_GFX.h>;
#include <Adafruit_SSD1331.h>;
#include <SPI.h>;
Adafruit_SSD1331 display = Adafruit_SSD1331(cs, dc, rst);

// Impostazione sensore MPL3115A2
#include <Wire.h>
#include "SparkFunMPL3115A2.h"
MPL3115A2 myPressure; //Create an instance of the object

// Definizione dei colori
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF

void setup() {
Serial.begin(9600);
display.begin();
Serial.println("Test sensore MPL3115A2");

Wire.begin(); // Attiva i2c bus
myPressure.begin(); // Attiva il sensore

//Configurazione sensore
myPressure.setModeAltimeter(); // Measure altitude above sea level in meters
myPressure.setOversampleRate(7); // Set Oversample to the recommended 128
myPressure.enableEventFlags(); // Enable all three pressure and temp event flags

// Messaggio iniziale
display.fillScreen(BLACK);
display.setTextSize(1);
display.setTextColor(BLUE);
display.setRotation(2); //Ruota display
display.setCursor(0, 0);
display.println("www.adrirobot.it");
display.println("");
display.setTextColor(GREEN);
display.println("Multitest shield");
display.println("");
display.println(" TEST SENSORE");
display.println("");
display.println(" MPL3115A2");
delay(3000);
}

void loop()
{
// Uscita su monitor seriale
float altitude = myPressure.readAltitude();
Serial.print("Altitudine(m):");
Serial.print(altitude, 2);

float pressure = myPressure.readPressure();
Serial.print(" Pressione(Pa):");
Serial.print(pressure, 2);

float temperature = myPressure.readTemp();
Serial.print(" Temp(C):");
Serial.print(temperature, 2);
Serial.println();

// Uscita su display OLED
display.fillScreen(BLACK);
display.setCursor(0, 0);
display.setTextSize(1);
display.setTextColor(MAGENTA);
display.println("VALORI MISURATI");
display.println("");

display.setTextColor(WHITE);
display.print("Altit.(m):");
display.setTextColor(RED);
display.println(altitude, 1);

display.println("");
display.setTextColor(WHITE);
display.print("Pres.(Pa):");
display.setTextColor(GREEN);
display.println(pressure, 1);

display.println("");
display.setTextColor(WHITE);
display.print("Temp. (C):");
display.setTextColor(YELLOW);
display.println(temperature, 1);

delay (1000); // Pausa di 1 secondo
}
[/code]

Filmato