Взаимодействие BME280, датчика температуры, влажности и давления, с Arduino

Добавлено 3 февраля 2020 в 00:59

Добавьте в свой следующий проект на Arduino возможность отслеживать состояние окружающей среды с помощью датчика BME280. Эти датчики довольно просты в использовании, предварительно откалиброваны и не требуют дополнительных компонентов. Поэтому вы можете начать измерение относительной влажности, температуры, атмосферного давления и приблизительного значения высоты в самые кратчайшие сроки.

Взаимодействие BME280, датчика температуры, влажности и давления, с Arduino
Взаимодействие BME280, датчика температуры, влажности и давления, с Arduino

BME280, датчик температуры, относительной влажности и атмосферного давления

В основе модуля находится цифровой датчик температуры, влажности и давления нового поколения производства Bosch – BME280. Он является преемником таких датчиков, как BMP180, BMP085 или BMP183.

Рисунок 1 Чип BME280 на модуле
Рисунок 1 – Чип BME280 на модуле

Этот прецизионный датчик может измерять относительную влажность воздуха от 0 до 100% с точностью ±3%, атмосферное давление от 300 гПа до 1100 гПа с абсолютной точностью ± 1 гПа, и температуру от -40°C до 85°C с точностью ±1,0°C.

Измерения давления настолько точны, что вы даже можете использовать его в качестве альтиметра (высотомера) с точностью ±1 метр.

Рисунок 2 Диапазоны измерений датчика BME280
Рисунок 2 – Диапазоны измерений датчика BME280

Требования к питанию

Модуль поставляется с встроенным стабилизатором напряжения 3,3 В LM6206 и преобразователем уровней напряжения на шине I2C, поэтому вы можете без проблем использовать его с микроконтроллером, работающим с логическими уровнями 3,3 В или 5 В, таким как Arduino.

Рисунок 3 Модуль BME280. Преобразователь уровней на шине I2C и стабилизатор напряжения 3,3 В
Рисунок 3 – Модуль BME280. Преобразователь уровней на шине I2C и стабилизатор напряжения 3,3 В

Во время измерений BME280 потребляет менее 1 мА и только 5 мкА в режиме ожидания. Такое низкое энергопотребление позволяет использовать его в устройствах с батарейным питанием, таких как телефоны, модули GPS или часы.

Интерфейс I2C

Модуль использует простой двухпроводной интерфейс I2C, который можно легко подключить к любому микроконтроллеру.

Адрес I2C по умолчанию для модуля BME280 равен 0x76HEX и может быть легко изменен на 0x77HEX с помощью перемычки из припоя, устанавливаемой между площадками рядом с микросхемой.

Рисунок 4 Модуль BME280. Площадки для напайки перемычки для выбора адреса I2C
Рисунок 4 – Модуль BME280. Площадки для напайки перемычки для выбора адреса I2C

Процедура изменения адреса I2C

  • Найдите перемычку из припоя рядом с чипом. По умолчанию средняя медная площадка подключена к левой площадке.
  • Перережьте ножом соединение между средней и левой медными площадками.
  • Добавьте каплю припоя между средней и правой медными площадками, чтобы установить между ними электрическое соединение. Это сменит адрес I2C на 0x77HEX.
Рисунок 5 Установка перемычки для выбора адреса I2C датчика BME280
Рисунок 5 – Установка перемычки для выбора адреса I2C датчика BME280

Распиновка датчика BME280

Для связи с внешним миром у модуля BME280 есть только 4 контакта. Их назначение показано на рисунке ниже.

Рисунок 6 Распиновка BME280, датчика атмосферного давления, температуры и влажности
Рисунок 6 – Распиновка BME280, датчика атмосферного давления, температуры и влажности

VIN – вывод для подключения источника питания для модуля, напряжение питания может находиться в диапазоне от 3,3 до 5 В.

GND подключается к выводу земля на Arduino

SCL – это вывод синхронизации для интерфейса I2C.

SDA – вывод данных для интерфейса I2C.

Подключение модуля BME280 к Arduino UNO

Давайте подключим модуль BME280 к Arduino.

Подключение довольно простое. Начните с соединения выводов GND на модуле и на плате Arduino, затем подключите вывод VIN к выводу 5V на Arduino.

Теперь остаются выводы, которые используются для связи I2C. Обратите внимание, что у разных плат Arduino для I2C используются разные выводы. На платах Arduino с разводкой R3 SDA (линия передачи данных) и SCL (линия синхронизации) находятся на разъеме выводов рядом с выводом AREF. Они также известны как A5 (SCL) и A4 (SDA).

Если у вас Arduino Mega, выводы будут отличаться! Вам необходимо использовать цифровые выводы 21 (SCL) и 20 (SDA). В таблице ниже приведены выводы, использующиеся для I2C на разных платах Arduino.

Выводы шины I2C на разных платах Arduino
 SCLSDA
Arduino UnoA5A4
Arduino NanoA5A4
Arduino Mega2120
Leonardo/Micro32

Следующая диаграмма показывает, как всё подключить.

Рисунок 7 Схема подключения модуля BME280 к Arduino
Рисунок 7 – Схема подключения модуля BME280 к Arduino

Установка необходимых библиотек

Для связи с модулем BME280 необходимо выполнить кучу работы. К счастью, чтобы скрыть все сложности, была написана библиотека Adafruit BME280, чтобы мы могли выполнять простые команды для считывания данных о температуре, относительной влажности и атмосферном давлении.

Чтобы установить библиотеку, перейдите в раздел «Скетч»→ «Подключить библиотеку» → «Управлять библиотеками…». Подождите, пока менеджер библиотек загрузит индекс библиотек и обновит список установленных библиотек.

Рисунок 8 Установка библиотеки Arduino – выбор управления библиотеками в Arduino IDE
Рисунок 8 – Установка библиотеки Arduino – выбор управления библиотеками в Arduino IDE

Отфильтруйте результаты поиска, набрав «bme280». Там должно быть пара записей. Ищите библиотеку Adafruit BME280 by Adafruit. Нажмите на эту запись, а затем выберите «Установка».

Рисунок 9 Установка библиотеки BME280 в Arduino IDE
Рисунок 9 – Установка библиотеки BME280 в Arduino IDE

Библиотека датчиков BME280 использует Adafruit Sensor support backend, поэтому при установке Arduino IDE предложит установить и эти библиотеки. Соглашайтесь (Install all).

Рисунок 10 Установка Adafruit Unified Sensor
Рисунок 10 – Установка Adafruit Unified Sensor

Код Arduino, считывание показаний температуры, относительной влажности воздуха и атмосферного давления

Следующий скетч даст вам полное представление о том, как считывать показания температуры, относительной влажности и барометрического давления с модуля BME280, и может послужить основой для более практических экспериментов и проектов.

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme;

void setup() 
{
  Serial.begin(9600);

  if (!bme.begin(0x76)) 
  {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
}

void loop() 
{
  Serial.print("Temperature = ");
  Serial.print(bme.readTemperature());
  Serial.println("*C");

  Serial.print("Pressure = ");
  Serial.print(bme.readPressure() / 100.0F);
  Serial.println("hPa");

  Serial.print("Approx. Altitude = ");
  Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
  Serial.println("m");

  Serial.print("Humidity = ");
  Serial.print(bme.readHumidity());
  Serial.println("%");

  Serial.println();
  delay(1000);
}

Вот как выглядит вывод в мониторе последовательного порта.

Рисунок 11 Вывод показаний датчика BME280. Температура, относительная влажность, атмосферное давление и высота над уровнем моря
Рисунок 11 – Вывод показаний датчика BME280. Температура, относительная влажность, атмосферное давление и высота над уровнем моря

Объяснение кода

Скетч начинается с подключения четырех библиотек, а именно, Wire.h, SPI.h, Adafruit_Sensor.h и Adafruit_BME280.h.

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

Затем мы определяем переменную SEALEVELPRESSURE_HPA, необходимую для вычисления высоты, и создаем объект библиотеки Adafruit_BME280, чтобы мы могли получить доступ к функциям, связанным с ней.

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme;

В функции setup() мы инициализируем последовательную связь с компьютером и вызываем функцию begin().

Функция begin(I2C_ADDR) в качестве параметра принимает адрес модуля на шине I2C. Если ваш модуль имеет другой адрес I2C или вы изменили его, вам нужно указать его правильно. Эта функция инициализирует интерфейс I2C с заданным адресом и проверяет правильность идентификатора чипа. Затем она программно перезапускает микросхему и ждет окончания калибровки датчика после запуска.

if (!bme.begin(0x76)) 
{
  Serial.println("Could not find a valid BME280 sensor, check wiring!");
  while (1);
}

В зацикленном фрагменте кода для считывания значений температуры, относительной влажности и атмосферного давления из модуля BME280 мы используем следующие функции:

  • функция readTemperature() возвращает от датчика температуру;
  • функция readPressure() возвращает от датчика атмосферное давление;
  • функция readAltitude(SEALEVELPRESSURE_HPA) вычисляет высоту (в метрах) исходя из текущего атмосферного давления (в гПа) и давления на уровне моря (в гПа);
  • функция readHumidity() возвращает от датчика относительную влажность воздуха.
Serial.print("Temperature = ");
Serial.print(bme.readTemperature());
Serial.println("*C");

Serial.print("Pressure = ");
Serial.print(bme.readPressure() / 100.0F);
Serial.println("hPa");

Serial.print("Approx. Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println("m");

Serial.print("Humidity = ");
Serial.print(bme.readHumidity());
Serial.println("%");

Теги

ArduinoI2CАтмосферное давлениеДатчикДатчик барометрического давленияИзмерениеИзмерение температурыОтносительная влажность воздухаТемпература

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.


  • 2022-01-07Юрий

    вероятно от стабилизатора напряжения нагревается плата(датчик), отсюда и повышение температуры и как следствие понижение влажности, имеет смысл удалить стабилизатор с платы и использовать либо внешний, либо взять со встроенного в ардуино(выход 3.3 в). Возможно и преобразователь уровней для I2C шины тоже греется(хз что там за микра стоит), но при питании от 3,3 в от него тоже можно избавиться

  • 2020-10-15K_Piterskiy

    У меня такого не наблюдается. Показания на 3 и 5 Вольтах не различаются. А вот сам датчик врёт на +2 градуса по отношению к датчику ds18b20 и лабораторному ртутному термометру.

  • 2020-08-03Ivan Polehov

    Температура и влажность меняются. При повышении напряжения растет температура и падает влажность.
    Давление не скачет.

  • 2020-07-31radioprog

    Остальные показания различаются?

  • 2020-07-26Ivan Polehov

    при подключении модуля к разному питанию 3.3 или 5В на ардуино, он выдает разную температуру.