ESP32 с датчиком BME280 в Arduino IDE (давление, температура, влажность)

Это руководство показывает, как использовать модуль датчика BME280 с ESP32 для считывания давления, температуры, влажности и оценки высоты с помощью Arduino IDE. Модуль датчика BME280 использует протокол связи I2C или SPI для обмена данными с микроконтроллером.

ESP32 с датчиком BME280 в Arduino IDE - давление, температура и влажность

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

Рекомендуемое чтение: ESP32 веб-сервер с BME280 – метеостанция

Перед тем как приступить к этому руководству, у вас должно быть установлено дополнение ESP32 в Arduino IDE. Следуйте следующему руководству для установки ESP32 в Arduino IDE, если вы этого ещё не сделали.

Вам также может быть интересно прочитать другие руководства по BME280:

Знакомство с модулем датчика BME280

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

Модуль датчика BME280 I2C - считывает давление, температуру и влажность

Этот датчик взаимодействует по протоколу связи I2C, поэтому подключение очень простое. Вы можете использовать стандартные выводы I2C ESP32, как показано в следующей таблице:

BME280

ESP32

Vin

3.3V

GND

GND

SCL

GPIO 22

SDA

GPIO 21

Существуют другие версии этого датчика, которые могут использовать протоколы связи SPI или I2C, как модуль, показанный на следующем рисунке:

Модуль датчика BME280 с протоколами связи SPI или I2C

Если вы используете один из таких датчиков, для использования протокола связи I2C используйте следующие выводы:

BME280

ESP32

SCK (вывод SCL)

GPIO 22

SDI (вывод SDA)

GPIO 21

Если вы используете протокол связи SPI, вам нужно использовать следующие выводы:

BME280

ESP32

SCK (тактовый сигнал SPI)

GPIO 18

SDO (MISO)

GPIO 19

SDI (MOSI)

GPIO 23

CS (выбор чипа)

GPIO 5

Необходимые компоненты

Для выполнения этого руководства вам понадобятся следующие компоненты:

Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Схема подключения – ESP32 с BME280 по I2C

Мы будем использовать связь I2C с модулем датчика BME280. Для этого подключите датчик к выводам SDA и SCL ESP32, как показано на следующей схеме.

Схема подключения ESP32 с BME280 по I2C

Рекомендуемое чтение: Справочное руководство по выводам ESP32

Установка библиотеки BME280

Для получения показаний с модуля датчика BME280 вам необходимо использовать библиотеку Adafruit_BME280. Выполните следующие шаги для установки библиотеки в Arduino IDE:

Откройте Arduino IDE и перейдите в Скетч > Подключить библиотеку > Управлять библиотеками. Должен открыться Менеджер библиотек.

Найдите «adafruit bme280» в поле поиска и установите библиотеку.

Установка библиотеки BME280 в Arduino IDE

Установка библиотеки Adafruit_Sensor

Для использования библиотеки BME280 вам также необходимо установить библиотеку Adafruit_Sensor. Выполните следующие шаги для установки библиотеки в Arduino IDE:

Перейдите в Скетч > Подключить библиотеку > Управлять библиотеками и введите «Adafruit Unified Sensor» в поле поиска. Прокрутите вниз, чтобы найти библиотеку, и установите её.

Установка библиотеки Adafruit Unified Sensor Driver

После установки библиотек перезапустите Arduino IDE.

Считывание давления, температуры и влажности

Для считывания давления, температуры и влажности мы будем использовать пример скетча из библиотеки.

ESP32 с барометрическим датчиком BME280, запрограммированный в Arduino IDE

После установки библиотеки BME280 и библиотеки Adafruit_Sensor откройте Arduino IDE и перейдите в Файл > Примеры > Adafruit BME280 library > bme280 test.

/*********
  Complete project details at https://randomnerdtutorials.com
*********/

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

/*#include <SPI.h>
#define BME_SCK 18
#define BME_MISO 19
#define BME_MOSI 23
#define BME_CS 5*/

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI

unsigned long delayTime;

void setup() {
  Serial.begin(9600);
  Serial.println(F("BME280 test"));

  bool status;

  // default settings
  // (you can also pass in a Wire library object like &Wire2)
  status = bme.begin(0x76);
  if (!status) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }

  Serial.println("-- Default Test --");
  delayTime = 1000;

  Serial.println();
}

void loop() {
  printValues();
  delay(delayTime);
}

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

  // Convert temperature to Fahrenheit
  /*Serial.print("Temperature = ");
  Serial.print(1.8 * bme.readTemperature() + 32);
  Serial.println(" *F");*/

  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();
}

Просмотреть исходный код

Мы внесли несколько изменений в скетч, чтобы сделать его полностью совместимым с ESP32.

Как работает код

Продолжайте читать этот раздел, чтобы узнать, как работает код, или перейдите к разделу «Демонстрация».

Библиотеки

Код начинается с подключения необходимых библиотек: библиотека Wire для использования I2C, а также библиотеки Adafruit_Sensor и Adafruit_BME280 для взаимодействия с датчиком BME280.

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

Связь по SPI

Поскольку мы будем использовать связь I2C, следующие строки, определяющие выводы SPI, закомментированы:

/*#include <SPI.h>
#define BME_SCK 18
#define BME_MISO 19
#define BME_MOSI 23
#define BME_CS 5*/

Примечание: если вы используете связь SPI, вы используете выводы SPI ESP32. Для связи SPI на ESP32 вы можете использовать выводы HSPI или VSPI, как показано в следующей таблице.

SPI

MOSI

MISO

CLK

CS

HSPI

GPIO 13

GPIO 12

GPIO 14

GPIO 15

VSPI

GPIO 23

GPIO 19

GPIO 18

GPIO 5

Давление на уровне моря

Создаётся переменная с именем SEALEVELPRESSURE_HPA.

#define SEALEVELPRESSURE_HPA (1013.25)

Эта переменная сохраняет давление на уровне моря в гектопаскалях (что эквивалентно миллибарам). Эта переменная используется для оценки высоты при заданном давлении путём сравнения его с давлением на уровне моря. В этом примере используется значение по умолчанию, но для более точных результатов замените это значение на текущее давление на уровне моря в вашем местоположении.

I2C

В этом примере по умолчанию используется протокол связи I2C. Как видите, вам нужно лишь создать объект Adafruit_BME280 с именем bme.

Adafruit_BME280 bme; // I2C

Для использования SPI вам нужно закомментировать предыдущую строку и раскомментировать одну из следующих строк в зависимости от того, используете ли вы аппаратный или программный SPI (аппаратный SPI использует стандартные выводы HSPI ESP32; программный SPI использует выводы, определённые в коде).

//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI

setup()

В функции setup() запускается последовательная связь:

Serial.begin(9600);

И инициализируется датчик:

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

Мы инициализируем датчик с адресом 0x76. Если вы не получаете показания датчика, проверьте I2C-адрес вашего датчика. С подключённым к ESP32 датчиком BME280 запустите этот скетч I2C сканера, чтобы проверить адрес вашего датчика. Затем при необходимости измените адрес.

Вывод значений

В функции loop() функция printValues() считывает значения с BME280 и выводит результаты в монитор последовательного порта.

void loop() {
  printValues();
  delay(delayTime);
}

Считывание температуры, влажности, давления и оценка высоты так же просто, как использование следующих методов объекта bme:

  • bme.readTemperature() – считывает температуру в градусах Цельсия;

  • bme.readHumidity() – считывает абсолютную влажность;

  • bme.readPressure() – считывает давление в гПа (гектопаскалях = миллибарах);

  • bme.readAltitude(SEALEVELPRESSURE_HPA) – оценивает высоту в метрах на основе давления на уровне моря.

Демонстрация

Загрузите код в ESP32 и откройте монитор последовательного порта на скорости 9600 бод. Нажмите встроенную кнопку RST для запуска кода. Вы должны увидеть показания, отображаемые в мониторе последовательного порта.

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

Веб-сервер метеостанции ESP32 с датчиком BME280

Датчик BME280 измеряет температуру, влажность и давление. Таким образом, вы можете легко собрать компактную метеостанцию и отслеживать измерения с помощью веб-сервера, построенного на вашем ESP32.

Для этого вы можете следовать этому руководству: ESP32 веб-сервер с BME280 – метеостанция

Веб-сервер ESP32 с датчиком BME280 -- метеостанция

Заключение

Эта статья была кратким руководством по получению показаний давления, температуры и влажности с датчика BME280 с помощью ESP32 в Arduino IDE.

Теперь вы можете развить этот проект дальше и отображать показания датчика на OLED-дисплее; создать регистратор данных; или создать веб-сервер для отображения последних показаний датчика. Вот список проектов, которые могут помочь с этими идеями:

Если вы хотите узнать больше об ESP32, обязательно запишитесь на наш курс: «Learn ESP32 with Arduino IDE».

Спасибо за чтение.


Источник: ESP32 with BME280 Sensor using Arduino IDE (Pressure, Temperature, Humidity)