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.

homotix

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 

#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();
}

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 

// 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 &lt;Wire.h&gt;
#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
}

Filmato

Lascia un commento

Your email address will not be published.