Взаимодействие 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
  SCL SDA
Arduino Uno A5 A4
Arduino Nano A5 A4
Arduino Mega 21 20
Leonardo/Micro 3 2

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

Рисунок 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Атмосферное давлениеДатчикДатчик барометрического давленияИзмерениеИзмерение температурыОтносительная влажность воздухаТемпература