Mesura de la pressió amb Arduino i el sensor BME280

Disposar d’un sensor que mesuri la pressió atmosfèrica ajuda a construir una petita estació meteorològica, i si a més el sensor mesura la temperatura i la humitat ja casi la tenim. A Física, però, un sensor de pressió permet fer experiments relacionats amb els gasos en mesurar la pressió dins un recipient o la pressió atmosfèrica a diferents altures.

Experiments d’aquest tipus ja es podien fer si es disposava d’un equip de pressa de dades i el sensor de pressió corresponent, o d’un telèfon mòbil que incorporés un baròmetre, però malauradament moltes vegades no es disposa d’ells. Per exemple podeu mirar el protocol d’Aparicio i Lozano ¿Quins efectes tenen les variacions de temperatura sobre la pressió d’un gas? I la guia pel professorat, a realitzar amb el Multilog i el Multilab. També podeu llegir els meus La pressió a l’interior d’un globus o Variació de la pressió amb l’altura en un ascensor, on els experiments es realitzen amb un telèfon que incorpora un sensor de pressió.

Ara, però, és possible disposar d’un sensor de pressió per molts pocs diners si es connecta el sensor BME280 a una placa Arduino o Wemos (esp32).

El sensor BME280

El sensor BME280 a més de la pressió atmosfèrica, mesura la temperatura i la humitat, mentre que el sensor BMP280 només mesura la pressió i la temperatura. Tots dos són l’evolució millorada del sensor BMP180, així que, encara que hi veieu referències a la web d’aquestos dos últims sensors, quasi pel mateix preu el sensor a comprar és el BME280. És un sensor bo, barat (3 €) i de dimensions reduïdes, el que permet introduir-lo amb facilitat pel coll d’una botella, d’un matràs o d’un globus, per exemple.

Característiques

El sensor BME280 es pot utilitzar tant amb el protocol de comunicació I2C i com amb l’SPI

Dimensions: 15×12 mm
Voltatge: 1,8 a 5 Vcc CC; 3,3 Vcc
Interfase: I2C (a 3,4 MHz), SPI (a 10 MHz)
Temperatura: -40 a + 85 °C (resolució 0,01 °C, precisió +-1 °C)
Humitat: 0-100% (resolució 0.008%, precisió +-3%)
Pressió: 300-1100 hPa (resolució 0,18 Pa, precisió +-1 Pa)
Direcció I2C: SDO baix 0x76, SDO alt 0x77

Disposa de sis connexions de sortida, de les que utilitzarem les quatre primeres:

VCC/VIN: 5 Volt d’entrada
GND: Connexió a terra
SCL/SCK: Rellotge Sèrie
SDA/SDI: Sortida de dades pel port sèrie
CSB: Entrada de dades del port sèrie
SDO: Selecció direcció I2C (si no es connecta, per defecte la direcció de l’I2C és 0x77. Si es connecta SDO a GND llavors la direcció canvia a 0x76)

El sensor el venen amb els connectors sense soldar. Els companys de tecnologia sempre disposen d’un soldador que ens podran deixar. Per soldar els connectors el més fàcil és punxar-los en una protoboard i col·locar la plaqueta del sensor damunt, com l’expliquen els tècnics d’Adafruit.

La connexió a la placa

Si el sensor es connecta a una placa Arduino Uno les connexions són: Vcc a 5V, GND a GND (terra), SCL a pin A5 i SDA a pin A4, com es veu al dibuix i la fotografia de sota.

Si el sensor es connecta a una placa Wemos D1 R32 les connexions són: Vcc a 5V, GND a GND (terra), SCL a pin ASCL i SDA a pin SDA, com es veu al dibuix i la fotografia de sota.

Aquesta segona placa és la Wemos D1 R32, que incorpora el microprocessador esp32, per la qual cosa s’han d’instal·lar els controladors de l’esp32, si no l’estan encara. Per instal·lar-los s’ha d’anar a l’IDE de Arduino i en Archivo/Preferencias, a la pestanya d’Ajustes s’enganxa la direcció https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json en el Gestor de URLs Adicionales de Tarjetas.

Després a Herramientas/Placa/Gestor de tarjetas apareixerà esp32 by Espressif Systems. Es pitja en More info y després en el botó Instalar. Trigarà una mica mentre indica Descargardo definiciones de tarjetas.

Quan s’hagi descarregat se busca la placa en Herramientas/Placa, es selecciona DOIT ESP32 DEVKIT V1 i ja està preparat l’IDE per a funcionar amb la tarja Wemos D1 R32. També funciona la placa si es selecciona el mòdul ESP 32 Dev.

El projecte

El sensor BME280 utilitza diferents llibreries en funció del projecte que es disseny i del protocol (I2C o SPI) que es vulgui utilitzar. El projecte que proposo usa el protocol I2C i està basat en un exemple de Lambort de Seeedstudio. La llibreria del sensor (Grove_BME280-master.zip) se ha de baixar de Github. Es clica en Clone or download i es baixa el ZIP. Si en lloc del protocol I2C es vol utilitzar el SPI, es pot consultar la pàgina de Enrique Latorres.

També es necessita la llibreria Wire para I2C que ja està inclosa de sèrie en l’IDE d’Arduino, i la llibreria del Bluetooth (BluetoothSerial.zip) la podeu descarregar d’aquí, si voleu veure les dades pel mòbil.

Per a installar les llibreries s’ha d’anar a l’IDE d’Arduino i en la pestanya Programa/Incluir librería es selecciona Añadir bilblioteca.ZIP.

Com he comentat el sensor és capaç de mesurar la pressió atmosfèrica, la temperatura i la humitat, i a més el projecte indica aproximadament l’altura sobre el nivell del mar basant-se en el valor de la pressió atmosfèrica.

Si connecteu el sensor a un Arduino el projecte a descarregar és sketch_Presion_Temp_Hum_BME280.ino, o bé podeu copiar el següent codi a l’IDE d’Arduino:

/*Medida de la presión atmosférica, la temperatura, la humedad 
 * y la altura sobre el nivel del mar con el sensor BMP280 y Arduino Uno
 *El projecto está basado en un ejemplo de Lambort
 * Copyright (c) 2016 seeed technology inc.
 * Website: www.seeedstudio.com
 *Al final del código se incluye la licencia del MIT
 */
/*La libreria del sensor se ha de bajar de
 * https://github.com/Seeed-Studio/Grove_BME280
 * Wire para I2C ya está incluida de serie en el IDE de Arduino
 */
/*Los datos se pueden visualizar en el monitor serie del IDE de Arduino 
 * y con el programa para ordenador RealTerm, https://sourceforge.net/projects/realterm/
*/
/*Conexiones: Vcc a 5V, GND a Gnd, SCL a A5, SDA a A4
*/
 
#include "Seeed_BME280.h"
#include <Wire.h>

BME280 bme280;

void setup()
{
  Serial.begin(9600);
  if(!bme280.init()){
    Serial.println("Device error!");
  }
}

void loop()
{
  float pressure;
  
  //Conseguir y imprimir temperaturas
  Serial.print("Temp: ");
  Serial.print(bme280.getTemperature());
  Serial.println("C");//Unidad para grados Celsius
  
  //Conseguir y imprimir la presión atmosférica
  Serial.print("Pressure: ");
  Serial.print(pressure = bme280.getPressure());
  Serial.println("Pa"); //Presion en pascales

  //Conseguir y imprimir la altura sobre el nivel del mar a una presión de 101300 Pa
  Serial.print("Altura: ");
  Serial.print(bme280.calcAltitude(pressure));
  Serial.println("m");

  //Conseguir y imprimir la humedad
  Serial.print("Humidity: ");
  Serial.print(bme280.getHumidity());
  Serial.println("%");

  delay(1000);
}


Si connecteu el sensor a un esp32, com és el Wemos D1 R32, que disposa de wifi i bluetooth, podeu descarregar sketch_Presion_Temp_Hum_BME280_BT.ino, o bé copiar el següent codi:

/*Medida de la presión atmosférica, la temperatura, la humedad 
 * y la altura sobre el nivel del mar con el sensor BMP280 y Wemos D1 R32 con esp32 y BT
 *El projecto está basado en un ejemplo de Lambort
 * Copyright (c) 2016 seeed technology inc.
 * Website: www.seeedstudio.com
 *Al final del código se incluye la licencia del MIT
 */
/*La libreria del sensor se ha de bajar de
 * https://github.com/Seeed-Studio/Grove_BME280
 * Wire para I2C ya está incluida de serie en el IDE de Arduino
 * La libreria del Bluetooth, BluetoothSerial.zip la podeu descarregar de
 * https://drive.google.com/file/d/1x9lGsHZMrLFvfPWDzup8iz5v1g4Bbk6O/view?usp=sharing
 */
/*Los datos se pueden visualizar en el monitor serie del IDE de Arduino 
 * y con el programa para ordenador RealTerm, https://sourceforge.net/projects/realterm/
 * Los datos también se pueden visualizar en el teléfono móvil o la tableta 
 * gracias a la app Serial Bluetooth Terminal para Android
 * https://play.google.com/store/apps/details?id=de.kai_morich.serial_bluetooth_terminal&hl=ca 
 * o a la app HM10 Bluetooth Serial Lite para iOS
 * https://apps.apple.com/us/app/hm10-bluetooth-serial-lite/id1030454675
*/
/*Conexiones: Vcc a 5V, GND a Gnd, SCL a pin SCL, SDA a pin SDA
*/

#include "Seeed_BME280.h"
#include <Wire.h>
#include "BluetoothSerial.h" //Se carga la libreria del Bluetooth

BME280 bme280;
BluetoothSerial SerialBT;

void setup()
{
  Serial.begin(9600);
  if(!bme280.init()){
    Serial.println("Device error!");
  }
  SerialBT.begin("Wemos_P"); //Se inicia el Bluetooth con el nombre Wemos_P
}

void loop()
{
  float pressure;
  
  //Conseguir y imprimir temperaturas
  Serial.print("Temperatura: ");
  Serial.print(bme280.getTemperature());
  Serial.println("C");//Unidad para grados Celsius
  //Conseguir y imprimir temperaturas por Bluetooth
  SerialBT.print("Temperatura: ");
  SerialBT.print(bme280.getTemperature());
  SerialBT.println("C");//Unidad para grados Celsius
  
  //Conseguir y imprimir la presión atmosférica
  Serial.print("Presión: ");
  Serial.print(pressure = bme280.getPressure());
  Serial.println("Pa"); //Presion en pascales
  //Conseguir y imprimir la presión atmosférica por Bluetooth
  SerialBT.print("Presión: ");
  SerialBT.print(pressure = bme280.getPressure());
  SerialBT.println("Pa"); //Presion en pascales
   
  //Conseguir y imprimir la altura sobre el nivel del mar a una presión de 101300 Pa
  Serial.print("Altura: ");
  Serial.print(bme280.calcAltitude(pressure));
  Serial.println("m");
  //Conseguir y imprimir la altura sobre el nivel del mar por Bluetooth
  SerialBT.print("Altura: ");
  SerialBT.print(bme280.calcAltitude(pressure));
  SerialBT.println("m");

  //Conseguir y imprimir la humedad
  Serial.print("Humedad: ");
  Serial.print(bme280.getHumidity());
  Serial.println("%");
  //Conseguir y imprimir la humedad por Bluetooth
  SerialBT.print("Humedad: ");
  SerialBT.print(bme280.getHumidity());
  SerialBT.println("%");

  delay(1000);
}

La mesura de la pressió, la temperatura i la humitat (i l’altura)

Les dades se poden visualitzar en el monitor sèrie de l’IDE d’Arduino i amb el programa per ordinador RealTerm. Si la placa que s’utilitza disposa de bluetooth també es poden visualitzar en el telèfon mòbil o la tauleta gràcies a l’app Serial Bluetooth Terminal per Android o a l’app HM10 Bluetooth Serial Lite per iOS.

En la captura de pantalla del costat es veuen les dades que apareixen en el Serial Bluetooth Terminal, on es pot destacar la pressió tant baixa que teníem a Lleida (92115 Pa) i l’altura tant desbaratada que proposa (796 m) per la ciutat, quan hauria d’haver indicat uns 175 m. No ens hem de fiar, doncs, de l’atura que dóna ja que depèn del temps atmosfèric, però si de la diferència d’altures quan pugem o baixem en un ascensor, per exemple.

La mesura de la pressió en funció del temps

Quan interessa estudiar com varia la pressió en funció del temps i no només mesurar-la en situacions concretes, s’ha de modificar el projecte per incloure expressament el temps i eliminar la “literatura” per tal que sigui més fàcil tractar després les dades i graficar-les. La separació entre variables és millor realitzar-les amb un punt i coma, per a distingir-lo dels signes de separació decimal, que en Arduino és el punt, mentre que en el programari en català o castellà és la coma.

A continuació teniu el projecte modificat per obtenir la pressió en funció del temps, que també el podeu baixar d’aquí sketch_Presion_Tiempo_BME280_BT.ino.

/*Medida de la presión atmosférica frente al tiempo
 * con el sensor BMP280 y Wemos D1 R32 con esp32 y BT
 *El projecto está basado en un ejemplo de Lambort
 * Copyright (c) 2016 seeed technology inc.
 * Website: www.seeedstudio.com
 *Al final del código se incluye la licencia del MIT
 */
/*La libreria del sensor se ha de bajar de
 * https://github.com/Seeed-Studio/Grove_BME280
 * Wire para I2C ya está incluida de serie en el IDE de Arduino
 * La libreria del Bluetooth, BluetoothSerial.zip la podeu descarregar de
 * https://drive.google.com/file/d/1x9lGsHZMrLFvfPWDzup8iz5v1g4Bbk6O/view?usp=sharing
 */
/*Los datos se pueden visualizar en el monitor serie del IDE de Arduino 
 * y con el programa para ordenador RealTerm, https://sourceforge.net/projects/realterm/
 * Los datos también se pueden visualizar en el teléfono móvil o la tableta 
 * gracias a la app Serial Bluetooth Terminal para Android
 * https://play.google.com/store/apps/details?id=de.kai_morich.serial_bluetooth_terminal&hl=ca 
 * o a la app HM10 Bluetooth Serial Lite para iOS
 * https://apps.apple.com/us/app/hm10-bluetooth-serial-lite/id1030454675
*/
/*Conexiones: Vcc a 5V, GND a Gnd, SCL a pin SCL, SDA a pin SDA
*/

#include "Seeed_BME280.h"
#include <Wire.h>
#include "BluetoothSerial.h" //Se carga la libreria del Bluetooth

BME280 bme280;
BluetoothSerial SerialBT;

float tiempo; // Se define el tiempo como numero con decimales
float tiempoSegundos; // Se define el tiempo en segundos como número con decimales

void setup()
{
  Serial.begin(9600);
  if(!bme280.init()){
    Serial.println("Device error!");
  }
  SerialBT.begin("Wemos_P"); //Se inicia el Bluetooth con el nombre Wemos_P
  tiempo = millis(); //mide el tiempo en milisegundos desde que se pone en marcha Arduino
}

void loop()
{
  float pressure;
  tiempo = millis(); //Actualiza el tiempo actual
  tiempoSegundos = tiempo/1000; //cambia los milisegundos a segundos
  
  //Conseguir y imprimir el tiempo en segundos 
  //y la presión atmosférica en pascales sin imprimir las unidades
  Serial.print(tiempoSegundos,3); //Escribe el tiempo en segundos con tres decimales
  Serial.print("; ");
  Serial.println(pressure = bme280.getPressure());
 

  //Conseguir y imprimir por Bluetooth el tiempo en segundos 
  //y la presión atmosférica en pascales sin imprimir las unidades
  SerialBT.print(tiempoSegundos,3); //Escribe el tiempo en segundos con tres decimales
  SerialBT.print("; ");
  SerialBT.println(pressure = bme280.getPressure());
 
  delay(100);
}


Hi ha 2 comentaris

Deixa un comentari

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.