Sensor BMP280 com ESP32-S2 Franzininho

Posted by

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.

Diagrama esquemático, BMP280 com ESP32-S2 Franzininho
Diagrama esquemático, BMP280 com ESP32-S2 Franzininho
BMP280 conectado ao ESP32-S2 Franzininho WiFi
BMP280 conectado ao ESP32-S2 Franzininho WiFi

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.

Leituras do BMP280 na IDE do Arduino
Leituras do BMP280 na IDE do Arduino

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

O seu endereço de email não será publicado. Campos obrigatórios marcados com *