Bme680: https://alii.pub/70f40a?erid=2SDnjdivSUA
ESP32: https://alii.pub/70f419?erid=2SDnje7AFhL
Прежде чем приступить к материалу, я Вас попрошу, если нравится то, что я делаю и хотите следить за моей деятельностью, то рекомендую подписаться на мой телеграмм канал: https://t.me/ypavla
Там я публикую новости о вышедших видео, статьях и разные устройства для умного дома и не только показываю.
Спасибо за внимание, теперь продолжим.
BME680 — это цифровой датчик окружающей среды, который измеряет газ, давление, влажность и температуру. В этом руководстве вы узнаете, как использовать модуль датчика BME680 с платой ESP32 с использованием Arduino IDE. Датчик взаимодействует с микроконтроллером с помощью протоколов связи I2C или SPI.
А так-же добавим датчик в ESPHome.
BME680 — это датчик окружающей среды, который объединяет датчики газа, давления, влажности и температуры. Датчик газа может обнаруживать летучие органические соединения (VOC). По этой причине BME680 можно использовать для контроля качества воздуха в помещении.
Измерения BME680
BME680 — это цифровой датчик «4 в 1», который измеряет:
- Температура
- Влажность
- Барометрическое давление
- Газ: Летучие органические соединения (VOC), такие как этанол и оксид углерода.
Датчик газа
BME680 содержит датчик MOX (металлооксидный), который обнаруживает VOC в воздухе. Этот датчик дает вам качественное представление о сумме VOC в воздухе.
Датчик MOX обнаруживает VOC путем адсорбции молекул кислорода на своем чувствительном слое. BME680 реагирует на большинство VOC, загрязняющих воздух в помещении (кроме CO2).
Когда датчик вступает в контакт с восстановительными газами, молекулы кислорода реагируют и увеличивают проводимость на поверхности. В качестве необработанного сигнала BME680 выводит значения сопротивления. Эти значения изменяются из-за изменений в концентрациях VOC:
Зависимость такая:
- Более высокая концентрация VOC » Более низкое сопротивление
- Более низкая концентрация VOC » Более высокое сопротивление
Реакции, происходящие на поверхности датчика (и, соответственно, сопротивление), зависят от других параметров, помимо концентрации VOC, таких как температура и влажность.
Точность BME680
Вот точность датчиков температуры, влажности и давления BME680:
Датчик | Точность |
Температура | +/- 1,0ºС |
Влажность | +/- 3% |
Давление | +/- 1 гПа |
Рабочий диапазон BME680
В следующей таблице показан рабочий диапазон датчиков температуры, влажности и давления для BME680.
Датчик | Диапазон действия |
Температура | от -40 до 85 ºС |
Влажность | от 0 до 100 % |
Давление | от 300 до 1100 гПа |
Распиновка BME680
Вот распиновка BME680:
VCC | Питание датчика |
GND | Общий GND |
SCL | Вывод SCL для связи по I2C Вывод SCK для связи по SPI |
SDA | Вывод SDA для связи по I2C Вывод SDI (MOSI) для связи по SPI |
SDO | Вывод SDO (MISO) для связи по SPI |
CS | Вывод выбора микросхемы для связи по SPI |
Датчик можно подключать как по шине i2c, так и по шине spi на выбор. Я конечно люблю больше шину i2c, так как там проводов меньше используется, но тут как говорится каждому своё.
Для подключения датчика BME680 по I2c к ESP32 используйте вот эту таблицу:
BME680 | ESP32 |
SCL | GPIO22 |
SDA | GPIO 21 |
Для подключения датчика BME680 по SPI к ESP32 используйте вот эту таблицу:
BME680 | ESP32 |
SCL (SCK SPI Clock) | GPIO 18 |
SDA (SDI MOSI) | GPIO 23 |
SDO (MISO) | GPIO 19 |
CS (Chip Select) | GPIO 5 |
Схема подключения ESP32 и BME680:
Схема подключения по шине i2c:
Ну а вот так выглядит подключение по шине SPI:
Теперь давайте перейдём к скетчу для работы с данным датчиком. Но для начала нам нужно подготовить программу Arduino IDE для того, чтоб она умела прошивать микроконтроллеры ESP32.
Как это сделать, я описал вот в этой статье:
Вам также необходимо установить библиотеку Adafruit BME680 и библиотеку Adafruit Unified Sensor.
Для получения показаний с модуля датчика BME680 мы будем использовать библиотеку Adafruit_BME680 . Выполните следующие шаги, чтобы установить библиотеку в Arduino IDE:
Откройте Arduino IDE и перейдите в Скетч > Подключить библиотеку > управление библиотеками . Должен открыться менеджер библиотек.
Введите « adafruit bme680 » в поле поиска и установите библиотеку.
Так-же нужно установить еще одну библиотеку под названием Adafruit Unified Sensor.
перейдите в Скетч > Подключить библиотеку > управление библиотеками . Должен открыться менеджер библиотек.
Введите « Adafruit Unified Sensor » в поле поиска и установите библиотеку.
После установки библиотек перезапустите Arduino IDE.
Ну и вот тестовый код, который будет считывать с датчика bme680 Температуру, влажность, давление и VOC и отправлять его в монитор порта:
#include
#include
#include
#include "Adafruit_BME680.h"
/*#define BME_SCK 18
#define BME_MISO 19
#define BME_MOSI 23
#define BME_CS 5*/
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME680 bme; // I2C
//Adafruit_BME680 bme(BME_CS); // hardware SPI
//Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println(F("BME680 async test"));
if (!bme.begin()) {
Serial.println(F("Could not find a valid BME680 sensor, check wiring!"));
while (1);
}
// Set up oversampling and filter initialization
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() {
// Tell BME680 to begin measurement.
unsigned long endTime = bme.beginReading();
if (endTime == 0) {
Serial.println(F("Failed to begin reading :("));
return;
}
Serial.print(F("Reading started at "));
Serial.print(millis());
Serial.print(F(" and will finish at "));
Serial.println(endTime);
Serial.println(F("You can do other work during BME680 measurement."));
delay(50); // This represents parallel work.
// There's no need to delay() until millis() >= endTime: bme.endReading()
// takes care of that. It's okay for parallel work to take longer than
// BME680's measurement time.
// Obtain measurement results from BME680. Note that this operation isn't
// instantaneous even if milli() >= endTime due to I2C/SPI latency.
if (!bme.endReading()) {
Serial.println(F("Failed to complete reading :("));
return;
}
Serial.print(F("Reading completed at "));
Serial.println(millis());
Serial.print(F("Temperature = "));
Serial.print(bme.temperature);
Serial.println(F(" *C"));
Serial.print(F("Pressure = "));
Serial.print(bme.pressure / 100.0);
Serial.println(F(" hPa"));
Serial.print(F("Humidity = "));
Serial.print(bme.humidity);
Serial.println(F(" %"));
Serial.print(F("Gas = "));
Serial.print(bme.gas_resistance / 1000.0);
Serial.println(F(" KOhms"));
Serial.print(F("Approx. Altitude = "));
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(F(" m"));
Serial.println();
delay(2000);
}
Компилируем код и загружаем в плату. После чего открываем монитор порта на скорости 115200 и нажмём кнопку RST на плате, чтоб перезагрузить микроконтроллер.
На основе этого кода можно пойти дальше и все эти показания вывести в WEB интерфейс устройства, а не в монитор порта. И потом со смартфона например смотреть показания с датчика.
Веб-сервер ESP32 с BME680:
Для работы WEB сервера нам нужно установить еще несколько библиотек:
Эти библиотеки скачиваются в .zip формате и чтоб их установить в arduino ide, нужно зайти в Скетч-> подключить библиотеку -> Добавить .ZIP библиотеку.
После этого загрузить следующий код в микроконтроллер. Код к сожалению выложить не получается на сайт в виде самого кода, так как там стили web и мой сайт попросту их сразу форматирует в стили. ПО этому оставлю ссылку на скачивание кода: https://disk.yandex.ru/d/EFqLCGHX9CJ-cA
По итогу после загрузки скетча и подключении к нему по ip адресу через веб браузер, мы увидим вот такой красивый web интерфейс с показаниями с датчика BME280:
ESPHome BME680:
Ну а в ESPHome все добавляется буквально парой строчек кода.
sensor:
- platform: bme680
temperature:
name: "BME680 Temperature"
oversampling: 16x
pressure:
name: "BME680 Pressure"
humidity:
name: "BME680 Humidity"
gas_resistance:
name: "BME680 Gas Resistance"
address: 0x77
update_interval: 60s
И на выходе, когда добавим это все дело в Home Assistant мы получим вот такой вид датчиков:
Так-же есть более расширенный пример, в котором добавлены функции рассчета газа VOC и создаётся текстовый сенсор с именем “BME680 IAQ Classification”, который и будет писать превышена ли норма VOC или нет.
ПРимер выглядит следующим образом:
sensor:
- platform: bme680
temperature:
name: "BME680 Temperature"
oversampling: 16x
pressure:
name: "BME680 Pressure"
humidity:
id: "humidity"
name: "BME680 Humidity"
gas_resistance:
id: "gas_resistance"
name: "BME680 Gas Resistance"
address: 0x77
update_interval: 60s
- platform: template
name: "BME680 Indoor Air Quality"
id: iaq
icon: "mdi:gauge"
# calculation: comp_gas = log(R_gas[ohm]) + 0.04 log(Ohm)/%rh * hum[%rh]
lambda: |-
return log(id(gas_resistance).state) + 0.04 * id(humidity).state;
state_class: "measurement"
text_sensor:
- platform: template
name: "BME680 IAQ Classification"
icon: "mdi:checkbox-marked-circle-outline"
lambda: |-
if (int(id(iaq).state) <= 50) {
return {"Excellent"};
}
else if (int(id(iaq).state) <= 100) {
return {"Good"};
}
else if (int(id(iaq).state) <= 150) {
return {"Lightly polluted"};
}
else if (int(id(iaq).state) <= 200) {
return {"Moderately polluted"};
}
else if (int(id(iaq).state) <= 250) {
return {"Heavily polluted"};
}
else if (int(id(iaq).state) <= 350) {
return {"Severely polluted"};
}
else if (int(id(iaq).state) <= 500) {
return {"Extremely polluted"};
}
else {
return {"unknown"};
}
Вывод:
Датчик BME680 своей возможностью измерения VOC MOX частиц, становится дополнением к огромному количеству разных датчиков. Ну а в совокупности с тем, что он еще измеряет температуру, влажность и давление – то это вполне себе датчик качества воздуха.
Ну и в конце по агетирую Вас подписаться на мой телеграм канал: https://t.me/ypavla