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

Conjunto de Fios Dupont

Protoboard

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:

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.
| Sensor | Precisão | Intervalo |
| Temperatura | ± 1.0 ºC | -40 a 85 ºC |
| Humidade | ± 3 % | 0 a 100 % |
| Pressão | ± 1 hPa | 300 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:

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:

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:

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:

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_NONEBME680_OS_1XBME680_OS_2XBME680_OS_4XBME680_OS_8XBME680_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_0BME680_FILTER_SIZE_1BME680_FILTER_SIZE_3BME680_FILTER_SIZE_7BME680_FILTER_SIZE_15BME680_FILTER_SIZE_31BME680_FILTER_SIZE_63BME680_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:

É 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.

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 ; )

