Подключение датчика температуры, влажности и давления BME280 к Arduino
BME280 от Bosch — это прецизионный датчик, используемый в множестве приложений: от мониторинга погоды до игровых контроллеров и измерения высоты, где требуется точность в несколько футов.
Этот датчик прост в использовании, поставляется предварительно откалиброванным и не требует дополнительных компонентов, поэтому вы можете начать измерять относительную влажность, температуру, атмосферное давление и высоту в кратчайшие сроки.
Итак, давайте познакомимся с BME280, о котором мы столько слышали.
Возможности BME280
Измерение температуры
BME280 может измерять температуру в диапазоне от -40°C до 85°C. В диапазоне температур от 0 до 65°C точность составляет ±1,0°C; за пределами этого диапазона точность снижается до ±1,5°C.
Обратите внимание, что это измерение температуры используется внутри датчика для калибровки датчиков давления и влажности. Поскольку датчик нагревает сам себя, измеренная температура обычно немного выше фактической. Если это критично для вашего проекта, сравните измеренную температуру с фактической и при необходимости примените поправку.
Измерение влажности
BME280 может измерять относительную влажность в диапазоне от 0 до 100% с точностью ±3%.
Согласно техническому описанию, датчик может измерять до 100% влажности в диапазоне температур от 0 до 60°C. Однако максимальная измеряемая влажность снижается при экстремально высоких и низких температурах.
Измерение давления
BME280 может измерять давление от 300 до 1100 гПа с абсолютной точностью ±1 гПа.
В диапазоне температур от 0 до 65°C обеспечивается полная точность, что даёт точность измерения высоты приблизительно ±1 метр. За пределами этого диапазона точность снижается до 1,7 гПа.
Вычисление высоты / превышения
BME280 может измерять давление с такой точностью (низкий шум высоты 0,25 м), что его можно использовать и в качестве альтиметра с точностью ±1 метр.
Прежде чем продолжить, важно понимать разницу между абсолютной и относительной высотой. Термин «абсолютная высота» относится к высоте над уровнем моря (MSL), тогда как «относительная высота» — к высоте над уровнем земли (AGL).
Обратите внимание, что BME280 не может непосредственно измерять высоту, но может оценить её по показаниям давления. Поскольку BME280 очень хорошо измеряет давление, он может точно рассчитать относительную высоту. Например, если вы знаете высоту объекта, лежащего на столе, и переместите его на пол, BME280 покажет уменьшение высоты на 60 см.
Однако если вы пытаетесь измерить абсолютную высоту, всё становится немного сложнее, потому что BME280 нужно знать текущее давление на уровне моря.
Поэтому для получения точного измерения абсолютной высоты в примере кода ниже предоставлена константа SEA_LEVEL_PRESSURE, которую следует обновить текущим давлением на уровне моря для вашего местоположения.
Обзор оборудования
Микросхема BME280
В основе модуля лежит цифровой датчик температуры, влажности и давления нового поколения от Bosch — BME280. Он является преемником таких датчиков, как BMP180, BMP085 и BMP183.
Питание
Модуль включает встроенный стабилизатор напряжения 3,3V `LM6206 `_ и трансляторы уровней I2C, поэтому вы можете использовать его с микроконтроллером с логикой 3,3V или 5V, таким как Arduino, без каких-либо опасений.
BME280 потребляет менее 1 мА во время измерений и всего 5 мкА в режиме ожидания. Благодаря низкому энергопотреблению он может использоваться в устройствах с батарейным питанием, таких как смартфоны, GPS-модули и часы.
Интерфейс I2C
Модуль BME280 обменивается данными по I2C и поддерживает два I2C-адреса: 0x76 и 0x77, что позволяет использовать до двух датчиков на одной шине.
I2C-адрес модуля по умолчанию — 0x76**HEX**, его можно легко изменить на 0x77**HEX** с помощью предусмотренной паяной перемычки.
Для изменения I2C-адреса на 0x77 разрежьте дорожку между средней и левой контактными площадками острым ножом. Затем нанесите каплю припоя между средней и правой площадками, чтобы замкнуть их.
Технические характеристики
Вот технические характеристики:
Входное напряжение |
3.3V – 5V |
|---|---|
Потребляемый ток |
1mA (тип.) и 5μA (ожидание) |
Температура |
-40°C до 85°C (точность ±1.0°C) |
Влажность |
0 до 100% RH (точность ±3%) |
Давление |
300Pa до 1100 hPa (точность ±1 hPa) |
Высота |
0 до 30,000 ft. (точность ±1 m) |
Для получения дополнительной информации обратитесь к техническому описанию ниже.
Распиновка датчика BME280
Модуль BME280 имеет всего 4 вывода для подключения к внешнему миру. Подключения следующие:
VIN подаёт питание на модуль. Подключите любое напряжение от 3,3V до 5V к этому выводу.
GND — это вывод заземления.
SCL — это вывод тактирования для интерфейса I2C.
SDA — это вывод данных для интерфейса I2C.
Схема подключения модуля BME280 к Arduino
Давайте подключим модуль BME280 к Arduino.
Подключение простое. Начните с соединения вывода VCC с выходом 5V Arduino, а вывода GND — с землёй.
Теперь нам остались выводы, используемые для связи по I2C. Обратите внимание, что у каждой платы Arduino разные выводы I2C, которые необходимо подключать правильно. На платах Arduino с компоновкой R3 выводы SDA (линия данных) и SCL (линия тактирования) расположены на штыревых разъёмах рядом с выводом AREF. Они также обозначаются как A5 (SCL) и A4 (SDA).
В следующей таблице указаны соединения выводов:
| BME280 Module | Arduino | |
| VCC | 5V | |
| GND | GND | |
| SCL | SCL or A5 | |
| SDA | SDA or A4 |
На схеме ниже показано, как всё подключить.
Установка необходимых библиотек
Чтобы начать считывать данные датчика, сначала необходимо установить `библиотеку Adafruit BME280 `_. Она доступна в менеджере библиотек Arduino.
Для установки библиотеки перейдите в Sketch > Include Library > Manage Libraries… Дождитесь, пока менеджер библиотек загрузит индекс и обновит список установленных библиотек.
Отфильтруйте поиск, введя „bme280“. Найдите Adafruit BME280 Library от Adafruit. Нажмите на эту запись и выберите Install.
Библиотека датчика BME280 использует `бэкенд Adafruit Sensor `_. Поэтому найдите 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);
}
Вы должны увидеть подобный вывод в мониторе последовательного порта.
Объяснение кода:
Скетч начинается с подключения трёх библиотек: Wire.h, Adafruit Sensor.h и Adafruit BME280.h.
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
Затем определяется переменная SEALEVELPRESSURE_HPA. Эта переменная хранит давление на уровне моря в миллибарах и используется для вычисления абсолютной высоты для заданного давления путём сравнения с давлением на уровне моря. В этом скетче используется значение по умолчанию (1013.25), но для точных результатов замените его текущим давлением на уровне моря для вашего местоположения.
Также создаётся объект библиотеки Adafruit BME280, чтобы мы могли использовать её функции.
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;
В разделе setup мы инициализируем последовательную связь с компьютером и вызываем функцию begin().
Функция begin(I2C_ADDR) принимает I2C-адрес модуля в качестве параметра. Если вы изменили I2C-адрес вашего модуля, его необходимо указать правильно. Эта функция инициализирует интерфейс I2C с указанным адресом и проверяет идентификатор чипа. Затем она выполняет программный сброс чипа и ожидает калибровку датчика после пробуждения.
Serial.begin(9600);
if (!bme.begin(0x76)) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
В разделе loop мы используем следующие функции для считывания температуры, относительной влажности и атмосферного давления с модуля 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("%");