BMP280 BME280

¡Hola!

Hoy quería contaros un poco sobre este sensor. Se trata de un circuito integrado que vamos a encontrar en modulitos, como se hace todo ahora, para tener el acceso fácil. Vamos a dejar primero una cosa clara para que no os equivoquéis como yo:

- BMP280: sensor de temperatura y presión
- BME280: sensor de temperatura, humedad y presión

Los más baratos los encontraréis a 3.3V, y la diferencia con los más caros es, no nos engañemos, que estos últimos llevan un pequeño regulador de tensión y puedes conectarlo a 5V. Y luego están los muy caros que llevan adaptadores de nivel de tensión para que el módulo no sufra, lo cual es lo más indicado.

Aunque sea de 3.3V, se puede conectar con un puerto digital con un máximo de 5V, mientras alimentas la patita Vcc con 3.3V. Pero no es lo más recomendable. Se puede usar un Arduino Pro Mini o Due, o algún otro modelo que funcione a 3.3V.

Aquí uno caro con reguladores de Adafruit

¿Qué puedes hacer con estos sensores?
Lo que he hecho yo ha sido poner un módulo BMP280 conectado a la Raspberry Pi 3. Cada cierto tiempo, 5 minutos, hago que se lean los valores del sensor, se guarden los valores en un archivo de datos (dos archivos de datos distintos, de hecho, uno del día y otro de las últimas 24 horas) y mediante un extenso código creo una gráfica, que luego puedo visualizar en el navegador mediante un poco de código php y html. Aquí un resultado:

A ver, la temperatura está demasiado elevada, esto es porque está en un lugar bastante cerrado junto a la raspberry que suelta algo de calor (el procesador se pasa el día sobre los 50ºC). Hay picos de temperatura cuando encendemos el ventilador, lo cual es muy curioso. La presión tampoco es correcta y ahí ya no sé qué decir, pero la evolución, comparada con un sensor calibrado no muy lejos de aquí, es la misma.

Este es el comienzo de un proyecto mayor que tengo entre manos y aunque el resultado no parezca muy correcto, ya he conseguido tener algunas pinceladas del software y de paso ver cómo se comporta la temperatura de la habitación ante determinados eventos.

Otras cosas que se pueden hacer: antes de la raspberry probé el módulo con Arduino y daba valores bastante realistas tanto de temperatura como de presión. Conociendo la presión atmosférica a nivel del mar y la que da el sensor, puedes aproximar la altitud a la que te encuentras. Esto viene en el código de ejemplo de Arduino IDE con la librería Adafruit_BMP280.

Y si te compras el BME280, puedes medir la humedad y ya tienes un sensor ambiental completo.

Estos módulos se comunican mediante I2C, lo cual requiere dos cables de comunicación. Por ejemplo en el Arduino Uno R3 se conecta:

  • Pin SDI del módulo al pin A4 (analógico 4) del Arduino
  • Pin SCK del módulo al pin A5 (analógico 5) del Arduino

Debido a que el módulo ya contiene unas resistencias de pull-up, no es necesario preocuparse de nada más, sólo requiere la alimentación (recordad, Vcc a 3.3V) y GND.

Para el resto de placas y microcontroladores (Raspberry, STM32, ...) hay librerías, así que su uso sigue siendo igual de sencillo.

He generalizado mucho para el BMP280, porque el BME no lo he probado, pero las librerías se encuentran fácilmente poniendo en Google por ejemplo: Arduino bme280 library.

Mucho ánimo y espero que se os ocurran cosas geniales con este módulo.

Mando a distancia (IR)

Hace mucho me puse a trabajar en ésto, pero por errores que me daba la librería, la versión del IDE, y tras probar mil veces, lo dejé pasar. Pero ahora he encontrado la forma de que funcione. Vamos a manejar el arduino con un mando a distancia.

Para demostrar cómo funciona (las aplicaciones las dejamos a vuestra imaginación) usaremos unos LEDs.

En primer lugar, es necesario tener la librería. Hay varias, una llamada NECIRrcv (con el protocolo NEC), y otra que es IRremote, al parecer sin ningún tipo de descodificación. Ésta última es la que usaremos, la única que he conseguido que funcione. Podréis descargarla aquí. Tenéis que descomprimirla y pegar la carpeta IRremote en el directorio Program Files (Archivos de programa) / Arduino / libraries. Tras hacer ésto y abrir el Arduino IDE, aparecerá en Ejemplos.

Ahora vamos a proceder a conocer nuestro mando a distancia. Con mi pack de Arduino recibí uno como éstos:

Que venía acompañado por un receptor de IR:

Lo que nos interesa ahora es, cuando pulsamos un botón del mando ¿Qué código envía al receptor? Para ello utilizaremos un simple circuito de 3 cables y un programa que lea lo que recibe y lo envíe mediante puerto Serial al Monitor Serial.

Visto desde ésta perspectiva el receptor, la patilla de la izquierda es la transmisora de datos, la central es GND y la derecha del todo la de alimentación. Dicho con Paint:

receptorir

 

Simplemente hay que hacer  la conexión debida de alimentación (no necesita resistencia) y poner Datos en un pin de arduino que podamos configurar como entrada, en mi caso está en el pin 11.

Ahora cargamos el sketch:

 

#include 
int IRpin = 11
IRrecv irrecv(IRpin);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  
}

void loop() 
{
  if (irrecv.decode(&results)) 
    {
      Serial.println(results.value); // Print the Serial 'results.value'
      irrecv.resume();   // Receive the next value
    }  
}

Cuando se cargue el programa, abrís el Monitor Serial y apretáis botones del mando. Veréis que para cada botón corresponde un número diferente, anotadlo. Por ejemplo, mis números son:

 

// 1 = 16724175
// 2 = 16718055
// 3 = 16743045
// - = 16754775
// + = 16748655
// ON/OFF = 16753245

Otros mandos, como los de Sony, tienen números "más amigables", del orden de 1000-4000. Ahora que ya tenéis los códigos, sólo es necesario modificar el programa inicial para que lleve a cabo unas acciones, por ejemplo, encender y apagar unos LED:

 

#include 
// 1 = 16724175
// 2 = 16718055
// 3 = 16743045
// - = 16754775
// + = 16748655
// ON/OFF = 16753245
int IRpin = 11, L1 = 3, L2= 4, L3=5;
IRrecv irrecv(IRpin);
decode_results results;

void setup()
{
  Serial.begin(9600);
  pinMode(L1,OUTPUT);
  pinMode(L2,OUTPUT);
  pinMode(L3,OUTPUT);
  irrecv.enableIRIn(); // Start the receiver
  
}

void digitalSwitch(char PIN){
  if(digitalRead(PIN)==1) digitalWrite(PIN,LOW);
  else digitalWrite(PIN,HIGH);
}

void loop() 
{
  if (irrecv.decode(&results)) 
    {
      if(results.value==16724175) digitalSwitch(L1);
      if(results.value==16718055) digitalSwitch(L2);
      if(results.value==16743045) digitalSwitch(L3);
      if(results.value==16748655) i=i+15;
      if(results.value==16753245){
        digitalSwitch(L1);
        digitalSwitch(L2);
        digitalSwitch(L3);
      }
      Serial.println(results.value); // Print the Serial 'results.value'
      irrecv.resume();   // Receive the next value
    }  
}