Взаимодействие BME280, датчика температуры, влажности и давления, с Arduino
Добавьте в свой следующий проект на Arduino возможность отслеживать состояние окружающей среды с помощью датчика BME280. Эти датчики довольно просты в использовании, предварительно откалиброваны и не требуют дополнительных компонентов. Поэтому вы можете начать измерение относительной влажности, температуры, атмосферного давления и приблизительного значения высоты в самые кратчайшие сроки.
![Взаимодействие BME280, датчика температуры, влажности и давления, с Arduino](/uploads/media/articles/0001/05/c83b6425873a81513f2906168641990a62d339f7.jpeg)
BME280, датчик температуры, относительной влажности и атмосферного давления
В основе модуля находится цифровой датчик температуры, влажности и давления нового поколения производства Bosch – BME280. Он является преемником таких датчиков, как BMP180, BMP085 или BMP183.
![Рисунок 1 Чип BME280 на модуле](/uploads/media/articles/0001/05/924d0a3ba157516ba38a3f899608d7166042436e.jpeg)
Этот прецизионный датчик может измерять относительную влажность воздуха от 0 до 100% с точностью ±3%, атмосферное давление от 300 гПа до 1100 гПа с абсолютной точностью ± 1 гПа, и температуру от -40°C до 85°C с точностью ±1,0°C.
Измерения давления настолько точны, что вы даже можете использовать его в качестве альтиметра (высотомера) с точностью ±1 метр.
![Рисунок 2 Диапазоны измерений датчика BME280](/uploads/media/articles/0001/05/8ae8cec0f15c88fcaaa2bdfeeaf2229203d3986b.png)
Требования к питанию
Модуль поставляется с встроенным стабилизатором напряжения 3,3 В LM6206 и преобразователем уровней напряжения на шине I2C, поэтому вы можете без проблем использовать его с микроконтроллером, работающим с логическими уровнями 3,3 В или 5 В, таким как Arduino.
![Рисунок 3 Модуль BME280. Преобразователь уровней на шине I2C и стабилизатор напряжения 3,3 В](/uploads/media/articles/0001/05/5f027962a9b5e8d9548d36c9ac31b1b292909dfc.jpeg)
Во время измерений BME280 потребляет менее 1 мА и только 5 мкА в режиме ожидания. Такое низкое энергопотребление позволяет использовать его в устройствах с батарейным питанием, таких как телефоны, модули GPS или часы.
Интерфейс I2C
Модуль использует простой двухпроводной интерфейс I2C, который можно легко подключить к любому микроконтроллеру.
Адрес I2C по умолчанию для модуля BME280 равен 0x76HEX и может быть легко изменен на 0x77HEX с помощью перемычки из припоя, устанавливаемой между площадками рядом с микросхемой.
![Рисунок 4 Модуль BME280. Площадки для напайки перемычки для выбора адреса I2C](/uploads/media/articles/0001/05/450ae6836790b8c9b53170ef1d1ca00645be27ce.jpeg)
Процедура изменения адреса I2C
- Найдите перемычку из припоя рядом с чипом. По умолчанию средняя медная площадка подключена к левой площадке.
- Перережьте ножом соединение между средней и левой медными площадками.
- Добавьте каплю припоя между средней и правой медными площадками, чтобы установить между ними электрическое соединение. Это сменит адрес I2C на 0x77HEX.
![Рисунок 5 Установка перемычки для выбора адреса I2C датчика BME280](/uploads/media/articles/0001/05/29073f4802aa5acd15a0df4de1e065bc0ca46d45.png)
Распиновка датчика BME280
Для связи с внешним миром у модуля BME280 есть только 4 контакта. Их назначение показано на рисунке ниже.
![Рисунок 6 Распиновка BME280, датчика атмосферного давления, температуры и влажности](/uploads/media/articles/0001/05/9f3a35e5f8c4b0185d586cd30d34d05e9d2e2a05.png)
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.
SCL | SDA | |
---|---|---|
Arduino Uno | A5 | A4 |
Arduino Nano | A5 | A4 |
Arduino Mega | 21 | 20 |
Leonardo/Micro | 3 | 2 |
Следующая диаграмма показывает, как всё подключить.
![Рисунок 7 Схема подключения модуля BME280 к Arduino](/uploads/media/articles/0001/05/a70d1be91f591689c2e7ccd6ef8c04379441e4ac.png)
Установка необходимых библиотек
Для связи с модулем BME280 необходимо выполнить кучу работы. К счастью, чтобы скрыть все сложности, была написана библиотека Adafruit BME280, чтобы мы могли выполнять простые команды для считывания данных о температуре, относительной влажности и атмосферном давлении.
Чтобы установить библиотеку, перейдите в раздел «Скетч»→ «Подключить библиотеку» → «Управлять библиотеками…». Подождите, пока менеджер библиотек загрузит индекс библиотек и обновит список установленных библиотек.
![Рисунок 8 Установка библиотеки Arduino – выбор управления библиотеками в Arduino IDE](/uploads/media/articles/0001/05/0f6ebfa1205ffd69caf682ba525485e6d465859f.png)
Отфильтруйте результаты поиска, набрав «bme280». Там должно быть пара записей. Ищите библиотеку Adafruit BME280 by Adafruit. Нажмите на эту запись, а затем выберите «Установка».
![Рисунок 9 Установка библиотеки BME280 в Arduino IDE](/uploads/media/articles/0001/05/f57532ea532291d94b582ed139008cde62156e53.png)
Библиотека датчиков BME280 использует Adafruit Sensor support backend, поэтому при установке Arduino IDE предложит установить и эти библиотеки. Соглашайтесь (Install all).
![Рисунок 10 Установка Adafruit Unified Sensor](/uploads/media/articles/0001/05/f109e8d974beb0a8e587aec00a09058de3b0b0b9.png)
Код 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. Температура, относительная влажность, атмосферное давление и высота над уровнем моря](/uploads/media/articles/0001/05/c137bd9de3da39a84536701ae6cb21a01dbc5ac1.png)
Объяснение кода
Скетч начинается с подключения четырех библиотек, а именно, 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("%");