Симулятор BME680 онлайн — 4-в-1 датчик IoT
BME680 от Bosch это датчик четыре в одном: температура, влажность, давление и сопротивление нагретого газа. Один модуль на I2C закрывает почти все задачи мониторинга воздуха, и вместо трёх отдельных датчиков вы получаете один корпус и одну шину.
В симуляторе BME680 виртуальный: температура, влажность и VOC двигаются ползунками, а давление зафиксировано на 1013.25 гПа. Напишите код Adafruit_BME680 bme и bme.begin(), и виджет появится на стенде автоматически, а readTemperature вернёт значение с ползунка.
Сразу о главном ограничении: этот модуль не измеряет углекислый газ. Газовый канал реагирует на летучие органические соединения, то есть на краску, лак, растворители и спирт. Для контроля CO2 нужен другой датчик.
VOC: зачем газовый канал
Газовый сенсор в BME680 это нагретый оксид металла, в даташите он называется MOX. Нагреватель поднимает температуру элемента примерно до 300 градусов, молекулы летучих соединений адсорбируются на его поверхности и меняют сопротивление. Чем больше VOC в воздухе, тем сильнее падает сопротивление, поэтому в коде это значение читается как gasResistance в кОм и обратно пропорционально загрязнению.
Грабль: датчик нужно прогреть. MOX-сенсор стабилизируется 5-30 минут после включения, и только потом показания становятся осмысленными. Первые минуты газовый канал выдаёт случайные значения, и на это нельзя опираться. В реальном проекте это значит, что при включении нужно ждать и не выдавать показания как достоверные.
IAQ, то есть индекс качества воздуха от 0 до 500, считается сразу из всех четырёх параметров по фирменному алгоритму Bosch. Считать его умеет библиотека BSEC от Bosch Sensortec, она платная для коммерческого использования. Adafruit_BME680 такой индекс не считает: она даёт четыре сырых значения, и если нужен IAQ, формулу придётся реализовать самому. Для учебных задач обычно хватает показаний газового сопротивления.
Код: чтение 4 параметров
#include <Wire.h>#include <Adafruit_BME680.h>Adafruit_BME680 bme;void setup() { Serial.begin(9600); if (!bme.begin()) { Serial.println("BME680 не найден"); while(1); } bme.setTemperatureOversampling(2); bme.setHumidityOversampling(2); bme.setPressureOversampling(2); bme.setIIRFilterSize(BME680_FILTER_SIZE_3); bme.setGasHeater(320, 150);}void loop() { if (!bme.performReading()) return; Serial.print("T="); Serial.print(bme.readTemperature()); Serial.print(" H="); Serial.print(bme.readHumidity()); Serial.print(" P="); Serial.print(bme.readPressure()/100); Serial.print(" VOC="); Serial.println(bme.readGasResistance()); delay(2000);}Ключевая строка здесь это performReading(). Она запускает один цикл измерения всех каналов и возвращает true, если данные готовы. Только после неё имеют смысл вызовы readTemperature, readHumidity, readPressure и readGasResistance. Если читать значения без performReading, получите данные из прошлого замера, а в самом начале это будут нули или мусор.
Распиновка: VCC к 3.3 В, GND к GND, SDA к A4, SCL к A5. Сам чип BME680 работает от 1.71 до 3.6 В, но на платах-адаптерах обычно стоит стабилизатор, и тогда допустимо 5 В. Адрес на шине 0x76 по умолчанию, а если вывод SDO подтянут к питанию, адрес становится 0x77. Проверить адрес можно I2C-сканером, и это стоит делать до первого подключения, а не после.
| Параметр | Диапазон | Точность |
|---|---|---|
| Температура | -40..85 °C | ±1 °C |
| Влажность | 0-100 % RH | ±3 % |
| Давление | 300-1100 гПа | ±1 гПа |
| VOC (газ) | 0-500 кОм | ±10 % |
Что сначала не получилось
Первый скетч у меня печатал температуру 0.00 и влажность 0.00, и я почти час искал неисправность в пайке. Причина оказалась простой: я забыл вызвать performReading() перед чтением. Методы чтения только отдают результаты последнего замера, а замеров не было ни одного, поэтому и значения были нулевыми.
Второй затык был с газовым каналом: он сразу после включения выдавал скачущие цифры, и я решил, что модуль бракованный. На деле это нормальное поведение MOX-сенсора, который прогревается 5-30 минут. Я добавил в скетч счётчик секунд после старта и первые пять минут печатал отдельную строку «прогрев», а показания газа начинал выводить только потом.
Личный опыт: мониторинг в комнате
Первое применение у меня было бытовое: модуль в комнате, раз в минуту отправка четырёх значений на MQTT-брокер, а на графике отдельные линии для температуры, влажности и сопротивления газа. Проверял я это в симуляторе: ползунок температуры двигал от 20 до 26 градусов, влажность от 30 до 70 процентов, и в Serial значения менялись ровно так, как их показывали ползунки.
Отдельно я проверял пересчёт давления. readPressure() в библиотеке возвращает значение в паскалях, то есть 101325, а для удобства его делят на 100 и получают гПа, то есть 1013.25. Без деления на графике появлялось число в сто раз больше ожидаемого, и я полчаса искал ошибку в формуле. В симуляторе давление как раз и задано в гПа, поэтому там значение приходит уже в привычных единицах и совпадает с показаниями барометра в комнате, а разница обычно не превышает пары гПа.
BME680 против DHT22 и BMP280
DHT22 даёт температуру и влажность, но с посредственной точностью: заявленные плюс минус 0.5 градуса на практике означают погрешность до пары градусов, и датчик заметно реагирует на собственный нагрев. BMP280 даёт температуру и давление с хорошей точностью, но не влажность и не газ. BME680 объединяет всё это в одном корпусе, и при этом меряет влажность точнее, чем DHT22, потому что использует отдельный ёмкостный сенсор.
- DHT22: температура и влажность, дёшево, но точность ниже
- BMP280: температура и давление, одно I2C-устройство, есть компенсация
- BME680: температура, влажность, давление и VOC в одном корпусе
- BME688: тот же корпус с добавленным каналом CO2
- Выбор по числу параметров, а не по цене одного модуля
Для учебного проекта проще всего начать с BME280, у него нет газового канала и прогрева, поэтому показания стабильны с первой секунды. Переходить на BME680 имеет смысл, когда в задаче действительно нужен VOC: контроль после покраски, реакция на спирт или наличие растворителей в воздухе.
И ещё один практический момент: I2C-шина ограничена по числу устройств и по длине. Четыре датчика на одной шине уже требуют аккуратной разводки, а длинные провода от датчика до платы добавляют помехи. Если датчиков много, разнесите их по разным шинам I2C или используйте ESP32 с двумя контроллерами.
Авторская позиция: что взять новичку
BME680 стоит брать, когда в проекте нужны сразу несколько параметров воздуха: температура, влажность, давление и реакция на VOC в одном корпусе. Если хватает трёх параметров без газа, берите BME280, он дешевле и проще в прогреве. Не ждите от BME680 показаний CO2: это другой принцип и другой датчик, а CCS811 даёт лишь оценочный эквивалент. И всегда оставляйте время на прогрев: первые 5-30 минут газовый канал бесполезен, и если проект отправляет данные в облако, лучше не слать в этот период ничего, чем слабое мусорить.