• Skip to primary navigation
  • Skip to main content
  • Skip to primary sidebar
  • Skip to secondary sidebar
  • Skip to footer

У Павла!

  • Контроллеры
    • Arduino
      • Приборы
      • Музыка
      • Проекты Arduino
      • Уроки Arduino
      • Игры на Arduino
      • Роботы на Ардуино
      • FLProg
    • Одноплатные ПК
      • Orange pi
      • Raspberry pi
        • Raspberry pi pico
        • Raspberry pi server
        • Проекты Raspberry pi
    • ESP
      • ESP8266
        • NodeMCU
      • ESP32
      • M5stack
    • Другие контроллеры
      • STM32
  • Умный дом
    • Home Assistant
      • Автоматизации
    • Tuya
    • Bluetooth
    • ESPHome
    • Frigate
    • Telegram
    • Яндекс
  • ЧПУ
  • 3d печать
  • Об авторе

ESP32: датчик Температуры, влажности, давления и газа BME680. Работа с ним в Arduino ide и ESPHome.

4 августа, 2024

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.

Как это сделать, я описал вот в этой статье:

Прошивка контроллера ESP32 через arduino ide.

Вам также необходимо установить библиотеку 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 сервера нам нужно установить еще несколько библиотек:

  • ESPAsyncWebServer
  • AsyncTCP

Эти библиотеки скачиваются в .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

Primary Sidebar

Поиск

Новые записи

  • Автоматизация перезагрузки устройства по команде Ping.
  • Разблокирование и добавление шлюза Xiaomi gateway 3 в Home Assistant для управления Bluetooth устройствами из экосистемы Xiaomi Home (mihome)
  • Интеграция для локального управления (без интернета) ик пультом Tuya работающим по wifi из Home Assistant
  • Транслируем показания с Уличного Bluetooth Датчика температуры по BTHome на дисплей датчика температуры XIaomi LYWSD03MMC
  • Заставляем Bluetooth датчики температуры tuya и xiaomi отправлять данные по Zigbee в Home Assistant.

Официальный YouTube Канал M5Stack:

Подписывайтесь на Телеграм канал

https://t.me/ypavla

Подписаться на YouTube!

Secondary Sidebar




Подписывайтесь на Telegram Канал!

У Павла!

Footer

Copyright_У Павла! © 2025 ·