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:
Será necesario tener instalados en nuestro ordenador los siguientes componentes:
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:
- Arduino IDE: https://www.arduino.cc/en/Main/Software
- Librería SSD1306: https://github.com/adafruit/Adafruit_SSD1306
- Librería Adafruit GFX Library: https://github.com/adafruit/Adafruit-GFX-Library
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:
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); }
Comentarios