Hoje vamos falar sobre o Sensor BMP280 com ESP32-S2 Franzininho. BMP280 é um sensor de pressão atmosférica e temperatura baseado na tecnologia de membrana de silício MEMS, fabricado pela Bosch.
Seu sensor de temperatura mede entre -40ºC e +85ºC, enquanto o sensor de pressão mede entre 300hPa e 1100hPa. Um hPa é igual a 100 Pascal (10,19 Kgf/m2). A pressão atmosférica média ao nível do mar é 1013hPa.
Este sensor comunica com microcontroladores através de i2c ou SPI, neste artigo vamos ver exemplo com comunicação i2c. Seguiremos bastante informação deste tutorial.
Seguindo a pinagem da Franzininho WiFi e do sensor BMP280, chegamos nas ligações abaixo. O circuito todo funciona com 3,3V além de apenas os dois pinos i2c, com GND.
Para que possamos programar o exemplo via IDE do Arduino, é necessário apenas instalar uma biblioteca. Na IDE do Arduino vá em “Rascunho > Incluir biblioteca > Gerenciar bibliotecas” e digite “BMP280”. A biblioteca correta a se instalar é a da Adafruit.
O código
O sketch/código utilizado foi o bmp280test que vem com a biblioteca que instalamos acima. Para acessa-lo vá em “Arquivo > Exemplos > Adafruit BMP280 Library” e abra ‘”BME280test”.
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
#define BMP_SCK (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS (10)
Adafruit_BMP280 bmp; // I2C
//Adafruit_BMP280 bmp(BMP_CS); // hardware SPI
//Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);
void setup() {
Serial.begin(9600);
while ( !Serial ) delay(100); // wait for native usb
Serial.println(F("BMP280 test"));
unsigned status;
status = bmp.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID);
//status = bmp.begin();
if (!status) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring or "
"try a different address!"));
Serial.print("SensorID was: 0x"); Serial.println(bmp.sensorID(),16);
Serial.print(" ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
Serial.print(" ID of 0x56-0x58 represents a BMP 280,\n");
Serial.print(" ID of 0x60 represents a BME 280.\n");
Serial.print(" ID of 0x61 represents a BME 680.\n");
while (1) delay(10);
}
/* Default settings from datasheet. */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */
Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */
Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */
Adafruit_BMP280::FILTER_X16, /* Filtering. */
Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
}
void loop() {
Serial.print(F("Temperature = "));
Serial.print(bmp.readTemperature());
Serial.println(" *C");
Serial.print(F("Pressure = "));
Serial.print(bmp.readPressure());
Serial.println(" Pa");
Serial.print(F("Approx altitude = "));
Serial.print(bmp.readAltitude(1020)); /* Adjusted to local forecast! */
Serial.println(" m");
Serial.println();
delay(2000);
}
Veja que no código acima nós habilitamos a i2c e desabilitamos a SPI:
Adafruit_BMP280 bmp; // I2C
//Adafruit_BMP280 bmp(BMP_CS); // hardware SPI
//Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);
Ao compilar e descarregar o código da IDE do Arduino para a Franzininho WiFi, tive que usar um código scanner de i2c. Isto pois o meu dispositivo estava no endereço 0x76, não conectava ao sketch. Tive que alterar uma parte do código para ficar igual às duas linhas abaixo:
status = bmp.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID);
//status = bmp.begin();
Originalmente/anteriormente estava:
//status = bmp.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID);
status = bmp.begin();
Isso porque neste link fala que o 0x76 é um endereço alternativo. Após isso foi baixar o código “BME280test” conforme já comentado acima, e observar o monitor serial. O mesmo está na parte inferior da tela (nas IDEs versão 2.0 ou superior) ou em “Ferramentas > Monitor Serial” nas IDEs mais antigas.
Na imagem acima já está tudo correto, porém na primeira vez que eu liguei o circuito a altitude estava dando negativa. Isso porque segundo este documento da Adafruit você precisa saber a pressão à nível do mar mais próximo do seu local, e em tempo real. Serve para ter uma altitude mais precisa.
Foi na linha abaixo que eu fiz a alteração, inseri 1020 que era a pressão aproximada à nível do mar próximo á minha cidade no momento da escrita do artigo. Para descobrir essa pressão e inserir na linha abaixo, vá ao Google e digite “pressão atmosférica em NOMEDACIDADE”. Lembrando que a cidade tem que ser litorânea (ou ao nível do mar) o mais próximo da sua cidade possível.
Serial.print(bmp.readAltitude(1020)); /* Adjusted to local forecast! */
Considerações finais
Fora isso a pressão atmosférica é mostrada em Pa (Pascal) e a temperatura em graus Celsius. Por agora é só o que tenho para passar, se quiser conhecer outro sensor de temperatura, veja meu artigo sobre o DHT11.
Deixe um comentário