Skip to Content

Sensor Ambiental BME680 com Arduino

Sensor Ambiental BME680 com Arduino

Aprenda a usar o BME680 Sensor Ambiental com Arduino. O BME680 é um sensor pequeno que pode medir temperatura, humidade, pressão e concentração de gases. Também suporta diferentes modos de energia, incluindo um modo ultra-baixo consumo, tornando-o adequado para projetos alimentados por bateria.

Peças Necessárias

A seguir encontrará as peças necessárias para este projeto. Além do sensor BME680, precisará de um microcontrolador. Eu escolhi um Arduino UNO, mas pode usar qualquer outro Arduino. Como o BME680 funciona com 5V e 3.3V, pode também usar um ESP32 ou ESP8622, por exemplo.

Sensor BME680

Arduino Uno

Dupont wire set

Conjunto de Fios Dupont

Half_breadboard56a

Protoboard

USB Data Sync cable Arduino

Cabo USB para Arduino UNO

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Visão Geral do Sensor BME680

O BME680 é um sensor pequeno (3x3x1 mm) que pode medir temperatura, humidade, pressão e a concentração de Compostos Orgânicos Voláteis (VOC) como Etanol, Álcool e Monóxido de Carbono. A imagem abaixo mostra o sensor com o pequeno orifício para troca de gases no topo:

BME680 Sensor
Sensor BME680

A comunicação com o sensor é feita via interface I2C ou SPI e é compatível com Arduino ou ESP32, por exemplo.

O chip BME680 tem uma tensão de funcionamento de 1.7V a 3.6V. Mas normalmente usa-se uma placa breakout com regulador de tensão que permite alimentar o sensor com 5V também. Falaremos mais sobre isso depois.

O consumo de corrente é cerca de 4µA para medições de humidade, pressão e temperatura, e até 12mA quando todos os sensores, incluindo o de gás, estão ativos. No entanto, pode colocar o sensor em modo de suspensão, onde consome apenas 0.15µA. Além disso, os sensores individuais de humidade, pressão e gás podem ser ativados ou desativados independentemente para gerir o consumo de energia.

Quanto à precisão, o sensor pode medir humidade com ±3% de precisão, pressão barométrica com ±1 hPa de precisão absoluta, e temperatura com ±1.0°C de precisão. Devido à precisão na pressão, o sensor pode ser usado para estimar altitude com ±1 metro.

SensorPrecisãoIntervalo
Temperatura± 1.0 ºC-40 a 85 ºC
Humidade± 3 %0 a 100 %
Pressão± 1 hPa300 a 1100 hPa

Sensor de Gás

O BME680 contém um sensor MOx (óxido metálico) com um aquecedor para medir a concentração de Compostos Orgânicos Voláteis (VOCs) no ar, especificamente Etano, Isopreno / 2-metil-1,3 Butadieno, Etanol, Acetona, Monóxido de Carbono. No entanto, não consegue distinguir entre esses VOCs. Em vez disso, fornece um valor de resistência proporcional à concentração de VOCs.

Note que o sensor de gás precisa de um tempo de queima (burn-in) de 5 a 30 minutos! Se quiser colocar o sensor (e o microcontrolador) em modo de suspensão entre medições, precisa armazenar o sensor state para reduzir esse tempo de queima do sensor de gás. Para medições de humidade, pressão e temperatura, isso não é necessário.

Para a especificação técnica completa, consulte o datasheet ligado abaixo:

Placa breakout para BME680

Como o chip BME680 é muito pequeno, normalmente usa-se uma placa breakout para ligar o sensor a um Arduino ou ESP32. A imagem abaixo mostra a frente e o verso de uma placa breakout típica para o BME680:

Front and back of  BME680 breakout board
Frente e verso da placa breakout BME680

Pinout do BME680

A placa breakout normalmente tem o XC6206 (662K) Regulador de Tensão low-dropout que permite alimentar o sensor com 3.3V ou 5V. O BME680 é a pequena caixa metálica quadrada, do lado direito na foto abaixo:

Pinout of BME680
Pinout do BME680

Do lado esquerdo estão os pinos para a interface I2C ou SPI, juntamente com as ligações de alimentação (VCC, GND). Para comunicação I2C, apenas os pinos SCL e SDA são necessários. Ao usar a interface SPI, o pino CS (Chip Select) permite que múltiplos sensores BME680 partilhem o mesmo barramento. Cada sensor pode ser controlado individualmente ligando o seu pino CS a um GPIO separado.

Com a interface I2C, o pino SDO determina o endereço I2C do sensor. Deixar o SDO desconectado define o endereço para 0x77, enquanto ligá-lo ao terra muda o endereço para 0x76. Esta configuração ajuda a evitar conflitos de endereço com outros dispositivos I2C e também permite que dois sensores BME680 operem no mesmo barramento I2C.

Ligação do BME680 via I2C

Ligar o BME680 via I2C é fácil. Ligue os pinos SCL e SDA do BME680 aos pinos correspondentes no Arduino UNO. O GND deve ser ligado ao GND, e o VCC pode ser ligado a 5V ou 3.3V. Veja a ligação completa abaixo:

Connecting the BME680 to Arduino UNO via I2C
Ligação do BME680 ao Arduino UNO via I2C

Se não souber quais são os pinos I2C de hardware para a sua placa, consulte o Find I2C and SPI default pins tutorial. Se usar uma placa de 3.3V, por exemplo um ESP32, certifique-se de ligar o VCC a 3.3V!

Código para medir Temperatura, Humidade, Pressão, Altitude e Gás

O código seguinte demonstra como medir Temperatura, Humidade, Pressão, Altitude e concentração de Gás com o BME680. Dê uma vista rápida ao código completo antes de discutirmos os detalhes:

#include "Adafruit_BME680.h"

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME680 bme;

void setup() {
  Serial.begin(115200);

  bme.begin();
  bme.setTemperatureOversampling(BME680_OS_8X);
  bme.setHumidityOversampling(BME680_OS_2X);
  bme.setPressureOversampling(BME680_OS_4X);
  bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
  bme.setGasHeater(320, 150);  // 320*C for 150 ms
}

void loop() {
  if (bme.performReading()) {
    Serial.print("Temperature = ");
    Serial.print(bme.temperature);
    Serial.println(" *C");

    Serial.print("Humidity = ");
    Serial.print(bme.humidity);
    Serial.println(" %");


    Serial.print("Pressure = ");
    Serial.print(bme.pressure / 100.0);
    Serial.println(" hPa");

    Serial.print("Altitude = ");
    Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
    Serial.println(" m");

    Serial.print("Gas = ");
    Serial.print(bme.gas_resistance / 1000.0);
    Serial.println(" KOhms");

    Serial.println();
    delay(2000);
  }
}

bibliotecas

Para começar, o código inclui a Adafruit BME680 library que fornece todas as funções essenciais para o sensor BME680. Esta biblioteca gere a comunicação via I2C ou SPI e simplifica as leituras do sensor.

#include "Adafruit_BME680.h"

Pode instalar esta biblioteca normalmente via LIBRARY MANAGER. Basta procurar por “bme680” e procurar a “Adafruit BME680 Library” como mostrado abaixo:

Adafruit BME680 library installed in LIBRARY MANAGER
Adafruit BME680 library instalada no LIBRARY MANAGER

constantes

De seguida, o código define uma constante para a pressão ao nível do mar em hectopascais (hPA). Este valor é importante para calcular a altitude. Pode ajustá-lo conforme a sua localização para melhorar a precisão. Este map pode ajudar.

#define SEALEVELPRESSURE_HPA (1013.25)

objetos

Aqui, o código cria uma instância da classe Adafruit_BME680. Este objeto permite aceder às leituras do sensor e configurar o sensor.

Adafruit_BME680 bme;

Se deixar o SDO desconectado e usar os pinos I2C padrão para o seu microcontrolador, este construtor deve funcionar como está. Caso contrário, pode especificar o endereço I2C via bme.begin(addr) na função setup:

bme.begin(uint8_t addr = BME68X_DEFAULT_ADDRESS);

ou pinos I2C diferentes via

Adafruit_BME680(TwoWire *theWire = &Wire);

ao construir o objeto do sensor.

setup

Dentro da função setup(), o código inicia a comunicação serial a 115200 baud. Isto é essencial para imprimir os dados do sensor no Monitor Serial.

Serial.begin(115200);

Depois inicializa o sensor BME680 chamando bme.begin(). Se o sensor estiver ligado corretamente e a biblioteca funcionar, iniciará a comunicação.

bme.begin();

Lembre-se que pode especificar um endereço I2C diferente chamando bme.begin(addr) em vez disso, se necessário.

A precisão do sensor depende muito das configurações de oversampling. Nesta linha, a medição de temperatura está configurada para oversampling 8 vezes, o que suaviza flutuações e melhora a fiabilidade.

bme.setTemperatureOversampling(BME680_OS_8X);

O BME680 suporta as seguintes configurações para oversampling:

  • BME680_OS_NONE
  • BME680_OS_1X
  • BME680_OS_2X
  • BME680_OS_4X
  • BME680_OS_8X
  • BME680_OS_16X

A humidade está configurada para oversampling 2 vezes. Isso é geralmente suficiente para a maioria das aplicações onde a humidade não muda rapidamente.

bme.setHumidityOversampling(BME680_OS_2X);

Para as leituras de pressão, o sensor usa oversampling 4x. A pressão atmosférica pode variar lentamente, por isso este nível oferece um bom equilíbrio entre velocidade e precisão.

bme.setPressureOversampling(BME680_OS_4X);

O código também aplica um filtro passa-baixo às leituras do sensor usando um filtro IIR (Resposta ao Impulso Infinito). Isto ajuda a eliminar ruído das leituras de pressão.

bme.setIIRFilterSize(BME680_FILTER_SIZE_3);

São suportados os seguintes tamanhos de filtro:

  • BME680_FILTER_SIZE_0
  • BME680_FILTER_SIZE_1
  • BME680_FILTER_SIZE_3
  • BME680_FILTER_SIZE_7
  • BME680_FILTER_SIZE_15
  • BME680_FILTER_SIZE_31
  • BME680_FILTER_SIZE_63
  • BME680_FILTER_SIZE_127

Finalmente, há uma configuração especial para o sensor de gás. Ele precisa aquecer antes de fazer uma leitura. Esta linha define o aquecedor para 320°C durante 150 milissegundos. Isto é crítico para medir compostos orgânicos voláteis (VOCs) no ar.

bme.setGasHeater(320, 150);  // 320*C for 150 ms

loop

Agora vejamos a função loop(), que corre continuamente. Começa por verificar se uma leitura do sensor está disponível usando bme.performReading(). Se a leitura for bem-sucedida, prossegue para imprimir os dados.

if (bme.performReading()) {

A temperatura é obtida de bme.temperature, e o valor é impresso no Monitor Serial em graus Celsius.

Serial.print("Temperature = ");
Serial.print(bme.temperature);
Serial.println(" *C");

De forma semelhante, a leitura de humidade é retirada de bme.humidity e impressa em percentagem.

Serial.print("Humidity = ");
Serial.print(bme.humidity);
Serial.println(" %");

A pressão atmosférica é acedida a partir de bme.pressure. O valor está em Pascal, por isso dividir por 100 converte para hPa (hectopascais), que é uma unidade padrão para pressão barométrica.

Serial.print("Pressure = ");
Serial.print(bme.pressure / 100.0);
Serial.println(" hPa");

A altitude não é medida diretamente — é calculada a partir da pressão usando a referência ao nível do mar. A função readAltitude() trata disso para si.

Serial.print("Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");

Finalmente, a resistência do gás (em Ohms) é impressa. Este valor dá uma ideia da qualidade do ar. O sensor não indica exatamente quais gases estão presentes, mas uma resistência alta geralmente significa ar mais limpo. Dividir por 1000 converte o valor para kilo-ohms para facilitar a leitura.

Serial.print("Gas = ");
Serial.print(bme.gas_resistance / 1000.0);
Serial.println(" KOhms");

O loop faz uma pausa de 2 segundos antes de repetir. Este atraso ajuda a ver a saída claramente no Monitor Serial. Deve ver a seguinte saída:

Output on Serial Monitor
Saída no Monitor Serial

É isso! Agora sabe como configurar e ler dados do BME680 ligado a uma placa Arduino via I2C. Na próxima secção, mostro rapidamente como usar a interface SPI em vez disso.

Ligação do BME680 via SPI

Em vez de I2C, pode também comunicar com o BME680 via SPI, que requer mais ligações mas permite medições mais rápidas.

Dependendo da placa do microcontrolador, os pinos para SPI de hardware diferem. Veja o Find I2C and SPI default pins tutorial, se precisar identificá-los. Para o Arduino UNO esses pinos são 13 (SCK), 12 (MISO/SDO), 11 (MOSI/SDA) e 10 (CS/SS). O diagrama abaixo mostra as ligações que deve fazer.

Connecting the BME680 to Arduino UNO via SPI
Ligação do BME680 ao Arduino UNO via SPI

Comparado com o código anterior, só precisa substituir a seguinte linha que cria o objeto do sensor

Adafruit_BME680 bme;

por esta linha, que especifica os pinos usados para ligar o BME680 via SPI:

#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10

Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);

Todo o resto do código pode permanecer exatamente igual.

Conclusão

Neste tutorial aprendeu a usar o BME680 Sensor Ambiental com um Arduino. O BME680 é um sensor muito pequeno que pode medir temperatura, humidade, pressão e concentrações de gás com precisão.

Em comparação com o muito semelhante BME280, o BME680 tem o sensor de gás adicional, mas isso também significa que precisa aquecer durante 5–20 minutos antes das leituras de gás serem fiáveis e consome mais energia. Se não precisar das medições de gás, opte pelo BME280, que é mais barato e menor. Veja o tutorial How To Use BME280 Pressure Sensor With Arduino para mais informações.

Note que existe também um BMP280, que é mais barato e consome menos energia, mas só mede temperatura e pressão. Se precisar apenas de temperatura e humidade, escolha o SI7021, que é ainda menor e mais preciso. Veja o Si7021 Temperature Sensor Arduino Tutorial.

Outros sensores comuns, mas menos precisos, a considerar são o LM35, o TMP36, o DS18B20 e o DHT11/ DHT22. Para mostrar dados do sensor, veja os tutoriais Weather Station on e-Paper Display e Temperature Plotter on e-Paper Display.

Finalmente, se quiser enviar dados ambientais a longas distâncias, além do alcance do Bluetooth ou Wi-Fi, a comunicação de longo alcance via LoRa pode ser do seu interesse: Send Environmental Data with LoRa.

Não falámos sobre a interpretação das medições de concentração de gás do BME680. Se quiser medir Qualidade do Ar, veja o tutorial Measure Air Quality with BME680, onde discutimos isso em detalhe.

Se tiver alguma dúvida, sinta-se à vontade para deixar nos comentários.

Boas experiências ; )