Presentar el sensor BMP280
És un sensor de pressió / Altitud i temperatura.
Estima l'altitud com a variació de la pressió atmosfèrica.
El sensor BMP280 és el successor del molt conegut BMP180 amb una posada al dia i millora de prestacions que el converteixen en un element molt interessant per als nostres projectes amb Arduino i similars.
Bàsicament mesura pressió atmosfèrica i temperatura (I opcionalment humitat) i com que té una magnífica precisió pot convertir la pressió baromètrica a altitud amb un error de ± 1m. Unit a la seva petita grandària i baix consum es converteix en un element ideal per a drones i similars o simplement com a estació meteorològica de baix cost.
Especificacions generals:
Rang pressió: 300 ~ 1100 hPa
Rang temperatura: -40 ~ 85ºC
Pressió de l'aire: ±1 hPa
Precisió de temperatura: ± 1.0ºC
Nivell Lògic: 3.3V
Consum: 2.7μA
Interfície: I2C, SPI
Una cosa bona d'aquest sensor és que a més es pot llegir mitjançant I2C o SPI el que el torna molt versàtil per fer servir amb els nostres micros i com últimament tothom sembla voler mesurar temperatura i pressió veurem si fem un petit exemple de com fer servir el BMP280 amb el nostre Arduino .
Per aquest exemple farem servir el port I2C per comoditat, però convé dir abans de començar que, malgrat el seu bondadós aspecte, aquest petit sensor m'ha estat marejant uns quants dies per la qüestió de la direcció I2C i perquè en té un parell de manies que convé que destaquem aquí per evitar maldecaps innecessaris.
Normalment, tots els diagrames de connexió que he anat veient per aquí mostren un esquema com aquest de connexió:
Però a la pràctica si uses aquest esquema i descarregues les llibreries d'Adafruit, la resposta ( Almenys amb el meu model de BMP280 ) el resultat ha estat invariablement un missatge que no hi ha sensor a la vista i que revisis cables.
M'havia estat marejant tant que vaig decidir fer servir el programa que ja vam veure en altres ocasions I2C scanner que t'informa de la direcció dels elements tens al bus i tranquil·lament et diu que hi ha alguna cosa a la 0x76, però la llibreria d'Adafruit no ho veia .
Pel que sembla la llibreria d'Adafruit espera que el sensor estigui a la direcció 0x77 i no a la 0x76 pel que sembla que cal anar a la llibreria a tocar a mà aquesta direcció, i com cada vegada que hem de modificar la llibreria les desercions augmenten en massa, he preferit buscar una altra solució.
Vaig intentar instanciar l'objecte passant-li l'adreça 0x76, però ni cas. Cal canviar la direcció per defecte a la pròpia llibreria. perfo llegint per aquí vaig trobar que podem canviar la direcció de base I2c del mòdul amb el pin SDO:
Per aquest motiu provarem de connectar el nostre mòdul, amb el pin SD0 a GND així:
Amb aquest esquema seguim mantenint la direcció per defecte del sensor en 0x76, i encara que podríem canviar la direcció del mòdul perquè funcionés amb les llibreries d'Adafruit, això seria massa fàcil i llavors ja havia trobat una altra llibreria que em va funcionar a la primera i tenia llestos els programes ( I a més podem fer servir la llibreria d'Adafruit en el proper tuto que tinc una idea per fer-ho amb l'ESP32 ), així que de seguida tornarem a això.
Com és habitual, comencem descarregant la llibreria que em va agradar per gestionar el BMP280: BMP280_DEV , La instal·lem com sempre i comencem amb el programa:
#include <BMP280_DEV.h>
float temperature, pressure, altitude;
BMP280_DEV bmp280;
Comencem amb un include de la llibreria i després definim 3 variables globals per a pressió, temperatura i altitud. I al setup, tampoc hi ha gaire molla:
void setup()
{ Serial.begin(115200);
bmp280.begin(BMP280_I2C_ALT_ADDR);
bmp280.setTimeStandby(TIME_STANDBY_2000MS); // Mesurar cada 2 segons
}
La primera línia fixa la velocitat de comunicació amb la consola a 115.200 i la segona crea una instància del sensor a la direcció alterna de 0x76 ( La nostra, i problema arreglat ). La línia següent programa una lectura del sensor cada 2 segons (2000MS), però opcionalment podem variar el temps de mostreig a valors prefixats per la llibreria. Les opcions són:
TIME_STANDBY_XXX, on els valors de XXX poden ser 05MS, 62MS,125MS, 250MS, 500MS, 1000MS, 2000MS i 400MS depenent de cada quant de temps vulguem fer la mesura. Finalment:
bmp280.startNormalConversion();
Inicia les lectures en mode continu amb la cadència indicada a la línia anterior. També aquí hi ha diverses opcions:
La resta ja és gimnàstica de programació:
if (bmp280.getMeasurements(temperature, pressure, altitude))
{ Serial.print(temperature);
Serial.print(F("*C "));
Serial.print(pressure);
Serial.print(F("hPa "));
Serial.print(altitude);
Serial.println(F("m"));
}
El resultat és si fa no fa així en el meu cas:
Com de debò, la pressió atmosfèrica es mesura en hecte Pascales, que si bé és la norma en el sistema mètric europeu, és molt probable que no n'hagis sentit parlar perquè a Espanya és molt més freqüent que a la tele donin la pressió en bars i mil·libars.
1 Bar = 100.000 Pascals
Recorda que la definició d'1 bar és la pressió baromètrica a nivell del mar i com jo visc a Bilbao (Quatre que podem ) la pressió ambient és més o menys la del nivell del mar.
Els que vénen a per nota podrien argumentar, que atès que a les meves lectures estic a 64 m sobre el mar, la pressió hauria de ser inferior 1.000 hPa i no lleugerament superior com es mostra. Però també cal tenir en compte que la pressió ambient depèn sensiblement de la humitat relativa i que per tant si vols utilitzar-lo amb certa seguretat hauries de calibrar el teu sensor depenent de la humitat ambient, contra una dada de referència, com una altitud per GPS.
Podeu descarregar el programa sencer dels exemples de la llibreria, al menú:
\\Fitxer\Exemples\BMP280_DEV\BMP280_I2C_Alt_Normal