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)
/* 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.