Arduino и метеодатчик BME280/BMP280
Описание
BME280 – высокоточный метеодатчик, измеряющий такие параметры микроклимата как температура, влажность и атмосферное давление. В зависимости от модуля может подключаться к I2C и SPI шинами микроконтроллера и работать от 3-5V, если на плате есть стабилизатор, или 3V, если его нет.
На обратной стороне платы не просто так написано BME280/BMP280 – BMP является урезанной версией BME, в которой нет влажности. Как их различить, если недобросовестный китаец не поставил галочку? По корпусу датчика:
В наборе GyverKIT первых партий (все наборы 2021 года) шёл BME280 версии I2C 5V, но старт продаж набора совпал с мировым кризисом микросхем, из за которого датчик стал сильно дефицитным и китайцы начали хитрить. В наборах GyverKIT 000, 001 и 002 партий можно встретить:
- Рабочий BME280
- Рабочий BMP280
- Нерабочий BMP280
В партии 003 у нас рабочий BMP280. Для влажности используется другой датчик.
Мы приносим свои извинения за эту ситуацию, вы можете запросить возврат средств за модуль у магазина Giant4.
Подключение
Модуль подключается на шину I2C и питание, как и любой другой модуль такого типа:
- Arduino: SDA – A4, SCL – A5
- Wemos: SDA – D2, SCL – D1
Библиотеки
- Adafruit BME280 (для работы также нужна Adafruit Sensor) – самая известная библиотека для работы с BME280. Очень тяжёлая, часть настроек доступна только при ручном редактировании библиотеки.
- GyverBME280 – наша библиотека, более удобная и лёгкая. Также поддерживает датчики BMP280
В примерах на этом сайте мы будем использовать GyverBME280. Библиотека идёт в архиве к набору GyverKIT, а свежую версию всегда можно установить/обновить из встроенного менеджера библиотек Arduino по названию GyverBME280. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.
Примеры
Первым делом стоит удостовериться в работоспособности датчика и узнать его адрес, он может быть 0x77
и 0x76
. Загружаем следующий код:
#include <Wire.h> void setup() { Serial.begin(9600); Serial.println("Start scan"); } void loop() { for (uint8_t i = 1; i < 128; i++) { Wire.beginTransmission(i); if (!Wire.endTransmission()) Serial.println(i, HEX); } Serial.println("..."); delay(5000); }
Открываем монитор порта:
- Если вывелось только Start scan и ничего больше – датчик бракованный и не будет работать
- Если это рабочий BMP/BME – получим вывод такого вида:
Start scan
76
…
76
…
Значит датчик ответил по адресу 0x76. Может ответить по 0x77.
- Если вывод имеет вид
Start scan
…
…
Значит Ардуино не находит датчиков на линии. Либо датчик подключен неправильно, либо бракованный.
Далее откроем базовый пример из библиотеки, который опрашивает значения с датчика. В begin()
можно передать адрес, который мы узнали из предыдущего скетча-сканера (не забываем префикс 0x). Загружаем и открываем порт:
#include <GyverBME280.h> GyverBME280 bme; void setup() { Serial.begin(9600); Serial.println("Start"); // запуск датчика и проверка на работоспособность if (!bme.begin(0x76)) Serial.println("Error!"); } void loop() { // температура Serial.print("Temperature: "); Serial.println(bme.readTemperature()); // влажность Serial.print("Humidity: "); Serial.println(bme.readHumidity()); // давление Serial.print("Pressure: "); Serial.println(bme.readPressure()); Serial.println(); delay(1000); }
- Если выведется только слово Start – датчик бракованный и из-за этого программа зависла
- Если выведется Error! – датчик бракованный или адрес не соответствует, вернись к предыдущему пункту
- Корректно выводятся все три параметра
Start
Temperature: 24.78
Humidity: 41.69
Pressure: 99701.28
Датчик рабочий, и это BME280
- Выводится температура и давление, влажность – 0
Start
Temperature: 24.78
Humidity: 0
Pressure: 99701.28
Датчик рабочий, и это BMP280, т.е. без влажности.
15 Комментариев
Написано Версия 280BME P. Подал 5В потом 3,3 В. Думал сгорел,вышел из строй.На окно вывел -“St”-но ввел все скетчи и обрадовала работой.Только влажности нет.Сейчас разбираюсь вторым .
Второй не рабочий.
Смотрите тех данные модуля. Оба на температуру от -40 до +85 С.
В вашем районе может быть дни ниже 40 С.
Пробовал считать данные сдатчика BMP280, с помощью вашей библиотеки, но ничего не вышло. Попытка с читать адрес так же ничего не дала. Попробовал использовать другой код https://disk.yandex.ru/d/T3J7Azsfh7IZ5g. Он показал что адрес устройства 0x76. Указал адрес в скетче также нет результата. Загрузил библиотеку Adafruit, указал что адрес 0x76, работает. Начал разбираться в чём дело. Оказалось что в библиотеке Adafruit при инициализации указывается также CHIPID, по умолчанию он стоит 0x58. Стал искать где в вашей библиотеке указан данный параметр. Это оказался файл GyverBME280.cpp строка 33:
if(GyverBME280::readRegister(0xD0) != 0x60) return false; // Check chip ID.
Изменил 0x60 на 0x58 и всё заработало.
Думаю что в вашу библиотеку также стоит внести возможность указать CHIPID при инициализации.
вижу комментарий ниже – да, в 1.5 добавили поддержку BMP280, у него ID 0x58
Оказывается я использовал библиотеку версии 1.4. В версии 1.5 всё работает.
Хороший урок, но я бы еще добавил то, что эти датчики для начала лучше бы иметь с припаянными ножками, так как в моем случае без них очень легко теряется сигнал и все тесты теряют смысл
подключил датчик по схеме , но при подключении в порт usb ноута мне пишет что порту не хватает электропитания , что делать ?
где то ошибка в подключении
Есть ли инструкция как в проекте с метеостанцией запустить BMP280, прислали не тот к сожалению китайцы
Выдаёт все значения нулевые.?
Определил адрес как 76.
запустил скетч,и он выдал все по 0.00
“Temperature: 0.00
Humidity: 0.00
Pressure: 0.00”
Датчик не рабочий?
Хочу купить bmp280
Как получить bme280
Купил у китайцев один такой датчик BMP280, ответил по адресу 0x76, тут вопросов нет, видно что рабочий датчик, влажность не показывает, но это я сразу знал когда заказывал. Температуру вроде бы как корректно показывает. А вот давление выводит очень высокое, 1244 мм рт ст.
Температура: 25.89
Давление: 165914.21
Температура: 25.88
Давление: 165912.82
Температура: 25.89
Давление: 165915.54
можно ли как-то откалибровать датчик или может есть другая причина?
Все работает. Спасибо! А можно в мм.рт.ст. и ОЛЕД 128+64