ESP32 с датчиком BME280 в Arduino IDE (давление, температура, влажность)
Это руководство показывает, как использовать модуль датчика BME280 с ESP32 для считывания давления, температуры, влажности и оценки высоты с помощью Arduino IDE. Модуль датчика BME280 использует протокол связи I2C или SPI для обмена данными с микроконтроллером.
Мы покажем вам, как подключить датчик к ESP32, установить необходимые библиотеки и написать простой скетч, отображающий показания датчика.
Рекомендуемое чтение: ESP32 веб-сервер с BME280 – метеостанция
Перед тем как приступить к этому руководству, у вас должно быть установлено дополнение ESP32 в Arduino IDE. Следуйте следующему руководству для установки ESP32 в Arduino IDE, если вы этого ещё не сделали.
Вам также может быть интересно прочитать другие руководства по BME280:
Знакомство с модулем датчика BME280
Модуль датчика BME280 считывает барометрическое давление, температуру и влажность. Поскольку давление изменяется с высотой, вы также можете оценить высоту над уровнем моря. Существует несколько версий этого модуля датчика. Мы используем модуль, показанный на рисунке ниже.
Этот датчик взаимодействует по протоколу связи I2C, поэтому подключение очень простое. Вы можете использовать стандартные выводы I2C ESP32, как показано в следующей таблице:
BME280 |
ESP32 |
|---|---|
Vin |
3.3V |
GND |
GND |
SCL |
GPIO 22 |
SDA |
GPIO 21 |
Существуют другие версии этого датчика, которые могут использовать протоколы связи 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 |
Необходимые компоненты
Для выполнения этого руководства вам понадобятся следующие компоненты:
ESP32 (читайте Лучшие платы разработки ESP32)
Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Схема подключения – ESP32 с BME280 по I2C
Мы будем использовать связь I2C с модулем датчика BME280. Для этого подключите датчик к выводам SDA и SCL ESP32, как показано на следующей схеме.
Рекомендуемое чтение: Справочное руководство по выводам ESP32
Установка библиотеки BME280
Для получения показаний с модуля датчика BME280 вам необходимо использовать библиотеку Adafruit_BME280. Выполните следующие шаги для установки библиотеки в Arduino IDE:
Откройте Arduino IDE и перейдите в Скетч > Подключить библиотеку > Управлять библиотеками. Должен открыться Менеджер библиотек.
Найдите «adafruit bme280» в поле поиска и установите библиотеку.
Установка библиотеки Adafruit_Sensor
Для использования библиотеки BME280 вам также необходимо установить библиотеку Adafruit_Sensor. Выполните следующие шаги для установки библиотеки в Arduino IDE:
Перейдите в Скетч > Подключить библиотеку > Управлять библиотеками и введите «Adafruit Unified Sensor» в поле поиска. Прокрутите вниз, чтобы найти библиотеку, и установите её.
После установки библиотек перезапустите 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 для запуска кода. Вы должны увидеть показания, отображаемые в мониторе последовательного порта.
Веб-сервер метеостанции ESP32 с датчиком BME280
Датчик BME280 измеряет температуру, влажность и давление. Таким образом, вы можете легко собрать компактную метеостанцию и отслеживать измерения с помощью веб-сервера, построенного на вашем ESP32.
Для этого вы можете следовать этому руководству: ESP32 веб-сервер с BME280 – метеостанция
Заключение
Эта статья была кратким руководством по получению показаний давления, температуры и влажности с датчика BME280 с помощью ESP32 в Arduino IDE.
Теперь вы можете развить этот проект дальше и отображать показания датчика на OLED-дисплее; создать регистратор данных; или создать веб-сервер для отображения последних показаний датчика. Вот список проектов, которые могут помочь с этими идеями:
Метеостанция с низким энергопотреблением – регистратор данных (MicroPython)
ESP32/ESP8266: вставка данных в базу данных MySQL с помощью PHP и Arduino IDE
Если вы хотите узнать больше об ESP32, обязательно запишитесь на наш курс: «Learn ESP32 with Arduino IDE».
Спасибо за чтение.
Источник: ESP32 with BME280 Sensor using Arduino IDE (Pressure, Temperature, Humidity)