sábado, 6 de abril de 2019

Sensor de Presión y temperatura BMP180

De sus siglas BaroMetric Pression, este sensor es un extraordinario elemento electrónico nos ofrece la presión base, la presión atmosférica, la altura y también dispone en su interior de un transistor que nos permite conocer la temperatura.

El BMP180 es la evolución del famoso BMP085, ambos son elementos altamente resistentes y eficaces.


El GY-68 se corresponde al BMP180 y el GY-65 al BMP085,  su precio ronda los 3€ y podemos encontrarlos Aliexpress, en Banggood o en Amazon por ejemplo.

Si hacemos uso del segundo solamente emplearemos los pines con el mismo nombre del BMP180 SDA-SCL-GND-VIN ó VCC. Personalmente recomiendo el uso del GY-68 ya que la librería diseñada para su uso es mas resultona y nos ahorra muchísimo código. Hay que descargarla!!!

El diagrama de conexión se queda así: (no he encontrado icono para BMP180 en fritzing!!!, sorry)


A continuación veremos el código mas elemental para ver su funcionamiento a través de la consola:

/* ESQUEMA DE CONEXIONES, Compilación Arduino 1.8.1 14/03/2019
         
                      7-14v.                  +-----+
                  ____[PWR]___________________| USB |__
                 |                            +-----+  |
                 |         GND/RST2  [ ][ ]            |
                 |       MOSI2/SCK2  [ ][ ]  A5/SCL[ ] | <---- SCL del sensor
                 |          5V/MISO2 [ ][ ]  A4/SDA[ ] | <---- SDA del sensor
                 |                             AREF[ ] |
                 |                              GND[ ] |
                 | [ ]N/C                    SCK/13[ ] |
                 | [ ]IOREF                 MISO/12[ ] |
                 | [ ]RST                   MOSI/11[ ]~| 
                 | [ ]3V3    +---+               10[ ]~|      
VCC BMP180 ----> | [ ]5v    -| A |-               9[ ]~| 
GND BMP180 ----> | [ ]GND   -| R |-               8[ ] |  
                 | [ ]GND   -| D |-                    |
                 | [ ]Vin   -| U |-               7[ ] |
                 |          -| I |-               6[ ]~|   
                 | [ ]A0    -| N |-               5[ ]~|   
                 | [ ]A1    -| 0 |-               4[ ] |                  
                 | [ ]A2     +---+           INT1/3[ ]~| 
                 | [ ]A3                     INT0/2[ ] |
                 | [ ]A4/SDA  RST SCK MISO     TX>1[ ] |   
                 | [ ]A5/SCL  [ ] [ ] [ ]      RX<0[ ] |   
                 |            [ ] [ ] [ ]              |
                 |  UNO_R3    GND MOSI 5V  ____________/
                  \_______________________/
*/
#include <SFE_BMP180.h>// importamos la libreria para su uso 
#include <Wire.h>// la libreria Wire es necesaria para la gestion de su direccion y envio de datos
SFE_BMP180 pressure;
double Presion = 0;
double PresionBase=0;
double Temperatura = 0;
char status;
void setup(){
  Serial.begin(9600);
  SensorStart();// inicializa el sensor
}
void loop(){
  ReadSensor(); // Leemos el sensor
  Serial.print("Temperatura: ");Serial.print(Temperatura);Serial.println(" grados C");//imprimimos la temperatura
  Serial.print("Presion: ");Serial.print(Presion);Serial.println(" milibares");//imprimimos la presion atmosferica
  Serial.println();
  delay(500);
}

void SensorStart(){  //Secuencia de inicio del sensor
  if (pressure.begin()){
    Serial.println("BMP180 Conexion exitosa");
  }else{
    Serial.println("BMP180 fallo de conexion (desconectado?)\n\n");
    while (1);
    }
  status = pressure.startTemperature();  //Se inicia la lectura de temperatura
  if (status !=0 ){
     delay(status);
     status = pressure.getTemperature(Temperatura);//Se lee una temperatura inicial
  }
  if (status !=0 ){
     status = pressure.startPressure(3);//Se inicia la lectura de presiones
  }
  if(status !=0 ){
     delay(status);
     status = pressure.getPressure(PresionBase, Temperatura); //Se lee la presión inicial incidente sobre el sensor en la primera ejecución
  }

} // cierra SensorStart

void ReadSensor() {//En este método se hacen las lecturas de presión y temperatura
    status = pressure.startTemperature(); // Se inicia la lectura de temperatura
    if (status != 0){
        delay(status);
        status = pressure.getTemperature(Temperatura);
    }
    if (status != 0){
       status = pressure.startPressure(3);
    }
    if (status != 0){
      delay(status);
      status = pressure.getPressure(Presion, Temperatura);
    }
}

El resultado debería ser algo así:


y la conexión: (la foto ha quedado un poco fea, lo sé)


Como vemos es bastante sencillo, ahora quizás vamos a crear un código para que nos muestre los resultados por el LCD que además emplea los mismos pines, (SCL, SDA) con lo que comprobaremos la utilidad de la librería Wire al gestionar ella misma las direcciones:

/* ESQUEMA DE CONEXIONES, Compilación Arduino 1.8.1 14/03/2019
                      7-14v.                  +-----+
                  ____[PWR]___________________| USB |__
                 |                            +-----+  |
                 |         GND/RST2  [ ][ ]            |
                 |       MOSI2/SCK2  [ ][ ]  A5/SCL[ ] | <---- SCL del LCD
                 |          5V/MISO2 [ ][ ]  A4/SDA[ ] | <---- SDA del LCD
                 |                             AREF[ ] |
                 |                              GND[ ] |
                 | [ ]N/C                    SCK/13[ ] |
                 | [ ]IOREF                 MISO/12[ ] |
                 | [ ]RST                   MOSI/11[ ]~| 
                 | [ ]3V3    +---+               10[ ]~|      
VCC BMP180,LCD-> | [ ]5v    -| A |-               9[ ]~| 
GND BMP180,LCD-> | [ ]GND   -| R |-               8[ ] |  
                 | [ ]GND   -| D |-                    |
                 | [ ]Vin   -| U |-               7[ ] |
                 |          -| I |-               6[ ]~|   
                 | [ ]A0    -| N |-               5[ ]~|   
                 | [ ]A1    -| 0 |-               4[ ] |                  
                 | [ ]A2     +---+           INT1/3[ ]~| 
                 | [ ]A3                     INT0/2[ ] |
 SDA BMP180 ---> | [ ]A4/SDA  RST SCK MISO     TX>1[ ] |   
 SCL BMP180 ---> | [ ]A5/SCL  [ ] [ ] [ ]      RX<0[ ] |   
                 |            [ ] [ ] [ ]              |
                 |  UNO_R3    GND MOSI 5V  ____________/
                  \_______________________/
*/

#include <LiquidCrystal_I2C.h> // Cargamos la libreria LiquidCrystal_I2C
LiquidCrystal_I2C miLCD(0x27,16,2);//Declaramos nuestra variable "miLCD" y le pasamos los parametros (direccion I2C, nºColumnas, nºfilas)
#include <SFE_BMP180.h>// importamos la libreria para su uso 
#include <Wire.h>// la libreria Wire es necesaria para la gestion de su direccion y envio de datos
SFE_BMP180 pressure;
double Presion = 0;
double PresionBase=0;
double Temperatura = 0;
char status;

void setup(){
  miLCD.init();// Inicializa el LCD
  miLCD.backlight();// Enciende la iluminacion del LCD
  miLCD.print("Iniciando"); // Imprime (por defecto en el primer espacio disponible)
  delay(500);// espera 1/2 segundo
  miLCD.clear();// Limpia el LCD
  SensorStart();// inicializa el sensor BMP180
}

void loop(){
  ReadSensor(); // Leemos el sensor
  miLCD.setCursor(0,0);miLCD.print("Temp: ");miLCD.print(Temperatura);miLCD.print(" C");//imprimimos la temperatura
  miLCD.setCursor(0,1);miLCD.print("Presion: ");miLCD.print(Presion);miLCD.print(" mb");//imprimimos la presion atmosferica
  delay(500);
}
void SensorStart(){  //Secuencia de inicio del sensor
  if (pressure.begin()){
    Serial.println("BMP180 Conexion exitosa");
  }else{
    Serial.println("BMP180 fallo de conexion (desconectado?)\n\n");
    while (1);
    }
  status = pressure.startTemperature();  //Se inicia la lectura de temperatura
  if (status !=0 ){
     delay(status);
     status = pressure.getTemperature(Temperatura);//Se lee una temperatura inicial
  }
  if (status !=0 ){
     status = pressure.startPressure(3);//Se inicia la lectura de presiones
  }
  if(status !=0 ){
     delay(status);
     status = pressure.getPressure(PresionBase, Temperatura); //Se lee la presión inicial incidente sobre el sensor en la primera ejecución
  }

} // cierra SensorStart

void ReadSensor() {//En este método se hacen las lecturas de presión y temperatura
    status = pressure.startTemperature(); // Se inicia la lectura de temperatura
    if (status != 0){
        delay(status);
        status = pressure.getTemperature(Temperatura);
    }
    if (status != 0){
       status = pressure.startPressure(3);
    }
    if (status != 0){
      delay(status);
      status = pressure.getPressure(Presion, Temperatura);
    }
}

Lo bueno es que no necesitamos hacer nada, el protocolo I2C integrado en nuestra Arduino se encarga de todo. Para saber más acerca del BUS I2C os recomiendo esta entrada de Luis Llamas.

La conexión se queda así:


Por cierto, el shield que estáis viendo es donde tengo conectados todos los sensores de mi Estación Meteorológica 1.0, es una plaqueta exclusiva para que te puedas hacer tus propias virguerías con tu Arduino:


Me costo muy mucho encontrarlo, Aquí mismo os dejo un enlace al sitio:


Bueno, con este ya casi hemos tratado con todos los elementos para crear nuestra EstMet, solo falta por tratar dos elementos más, El Anemómetro y el Pluviómetro. Estas serán las próximas entregas antes de crear nuestro cocktail Meteorológico.