Mostrar datos BMP180 mediante un OLED I2c LED LCD Display con Arduino Nano

En esta entrada vamos a mostrar los datos de temperatura y presión atmosférica mediante un sensor barométrico de presión, el BMP180 y como poder verlos a través de una pantalla OLED I2c LED LCD usando un Arduino Nano.

Para ello vamos a usar los siguientes componentes:

  • Arduino Nano


  • Sensor de presión barométrica BMP180


  • Display 128X64 OLED I2c IIC Serial LED LCD




Será necesario tener instalados en nuestro ordenador los siguientes componentes:


Una vez tengamos todo descargado e instalado procederemos a conectar todos los componentes en una breadboard. Empezaremos con todas las placas:




Antes de ponernos con el cableado hay que tener claro que pines vamos a usar y cual es su finalidad, os dejo unas imágenes para que podáis ver en cada caso que pin se usa y cual es su tipo de datos:

  • Arduino Nano:



  • Sensor de presión barométrica BMP180:



  • Display 128X64 OLED I2c IIC Serial LED LCD:



Una vez repasados todos los conectores es importante tener en cuenta que la pantalla se alimenta con 3.3V-5V y el sensor con 3,3V. Os puedo asegurar que aunque conectéis el sensor a 5V no lo vais a quemar pero eso si, no os va a funcionar.

Como veis tanto la pantalla como el sensor funcionan mediante el protocolo I2C, con lo que es necesario conectar todos los pins SDA juntos y todos los SCL juntos, el protocolo ya se encargará de recibir y enviar datos a cada uno de los dispositivos. La librería del sensor ya tiene definida la dirección de hardware en las librerías y para la pantalla se usa la dirección por defecto de muchos modelos (0x3C).

Ya estamos listos para cablear nuestro sistema. Las conexiones SDA irán todas conecatads juntas en grupos al igual que las SCL y todos los GND's. De la placa Arduino tendremos por una parte la alimentación a 5v o el conector VIN ya que alimentamos el sistema mediante el cable USB que va al ordenador y para finalizar la salida de 3,3V del Arduino Nano irá a la alimentación VIN del sensor BMP180.

Debería quedar algo parecido a lo que se aprecia en la siguiente imagen:




Os dejo también un foto desde el otro lado para que podáis ver mejor las conexiones del sensor:




Una vez cableado procederemos a cargar el sketch de Arduino mediante el ordenador. Será necesario tener el programa Arduino IDE y las librerías anteriormente listadas añadidas a nuestra carpeta local de recurso de Arduino, en mi caso la carpeta destino de estas librerías está en la carpeta:
"C:\Program Files (x86)\Arduino\libraries"

Solo hay que descomprimir los archivos descargados en esta ruta y ya podremos empezar a codificar nuestro programa mediante Arduino IDE.

Aquí os dejo el código del sketch para hacer funcionar el sistema:

#include <SPI.h>
#include <Wire.h>
#include <SFE_BMP180.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define NUMFLAKES     10 // Number of snowflakes in the animation example

//Adafruit logo definition
#define LOGO_HEIGHT   16
#define LOGO_WIDTH    16
static const unsigned char PROGMEM logo_bmp[] =
{ B00000000, B11000000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000011, B11100000,
  B11110011, B11100000,
  B11111110, B11111000,
  B01111110, B11111111,
  B00110011, B10011111,
  B00011111, B11111100,
  B00001101, B01110000,
  B00011011, B10100000,
  B00111111, B11100000,
  B00111111, B11110000,
  B01111100, B11110000,
  B01110000, B01110000,
  B00000000, B00110000 };

  SFE_BMP180 pressure;

#define ALTITUDE 1655.0 // Add here your altitude

void setup() {
  //Serial port start to see if we get some error while initializing our components
  Serial.begin(9600);

  //Check if the dipslay starts correctly
  if (display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
    Serial.println("SSD1306 allocation done!");
  else
  { 
    Serial.println("init fail\n\n");
  } 
  //logo display
  display.display();   

  //Check if sensor starts correctly
  if (pressure.begin())
    Serial.println("BMP180 init success");
  else
  {  
    Serial.println("BMP180 init fail\n\n");
  }
  delay(2000);
}

void loop() {
  //loop data definition
  String screenText;
  char status;
  double T,P,p0,a;

  //display data definition
  display.clearDisplay();
  display.setTextSize(1);             // Normal 1:1 pixel scale
  display.setTextColor(WHITE);        // Draw white text
  display.setCursor(0,0);             // Start at top-left corner

  //start temperature data retriving
  status = pressure.startTemperature();

  if (status != 0)
  {
    delay(status);
    status = pressure.getTemperature(T);
    display.print("temp: ");
    display.print(T,2);
    display.println(" deg C");
  }

  //start pressure data retriving
  status = pressure.startPressure(3);
  
  if (status != 0)
  {    
    //get pressure data
    delay(status);
    status = pressure.getPressure(P,T);
    display.print("abs p.: ");
    display.print(P);
    display.print(" mb ");
    display.print("\n");

    //get sea level pressure data
    p0 = pressure.sealevel(P,ALTITUDE); // we're at 1655 meters (Boulder, CO)
    display.print("rel p.: ");
    display.print(p0,2);
    display.print(" mb ");
    display.print("\n");
    
    //get altitude data
    a = pressure.altitude(P,p0);
    display.print("alt: ");
    display.print(a,0);
    display.print(" meters ");
    display.print("\n");
  }
  
  display.print("\n");
  
  display.display();

  //wait 1 second until next loop
  delay(1000);   
}


Os dejo una imagen del resultado que podréis ver si todo ha ido correctamente:


Y aquí os dejo también un pequeño vídeo con el resultado:

Comentarios

Unknown ha dicho que…
Hola buenas, hay librerias que no has mencionado anteriormente como la SFE_BMP180, dónde las puedo coseguir?
garrigueta ha dicho que…
SFE_BMP_180 : https://github.com/roscansat/SFE_BMP180

Entradas populares de este blog

Desarrollo de aplicaciones para dispositivos de muñeca Garmin con Connect IQ

7 Segment Display conectado a Arduino Mini Pro