Точное измерение температуры, давления и высоты с BMP280 и Arduino UNO
Компоненты и материалы
| Arduino UNO | × | 1 |
| Adafruit BMP280 | × | 1 |
| Adafruit OLED 128x32 I2C | × | 1 |
О проекте
Приветствуем вас в этом уроке, где мы используем датчик BMP280 для измерения температуры, атмосферного давления и высоты над уровнем моря с помощью платы Arduino UNO и OLED-дисплея. Вот ключевые параметры BMP280 из даташита:

В этом проекте мы будем измерять все эти параметры как в метрической, так и в имперской системах единиц. Компоненты, которые нам понадобятся, показаны ниже:

Тестирование и устранение неисправностей
После подключения модуля рекомендуется протестировать код из примера библиотеки под названием «BMP280test». Если модуль не обнаруживается (как на скриншоте ниже):

Вы можете запустить сканер I²C (но предварительно отключите любые другие I²C-устройства, такие как LCD или OLED). Если модуль исправен и не имеет проблем с пайкой, сканер покажет его адрес:

Запишите этот адрес и откройте файл библиотеки (обычно он находится в «Documents/Arduino/Libraries»):

Откройте файл с помощью подходящего редактора (например, Dev C++):

Перейдите к строке 41 и измените значение _i2caddr, заменив «a» на адрес, найденный в мониторе последовательного порта:

Сохраните изменения и закройте файл. Библиотека по умолчанию настроена на работу с модулями, имеющими I²C-адрес 0x77, но используемый здесь модуль имеет адрес 0x76.
Запустите тестовый код снова:

Фотографии тестирования


Надеюсь, проект заработает у вас. Если возникнут проблемы, оставьте комментарий.
Код
Доступны четыре варианта скетчей:
- bmp280_Serial_metric.ino — вывод в монитор порта (метрическая система)
- bmp280_Serial_Imperial.ino — вывод в монитор порта (имперская система)
- bmp280_OLED_m.ino — вывод на OLED-дисплей (метрическая система)
- bmp280_OLED_US.ino — вывод на OLED-дисплей (имперская система)
bmp280_Serial_metric.ino
/* Этот код для работы с Adafruit BMP280 (метрическая система)
* Измеряет температуру и давление, выводит их в Serial Monitor вместе с высотой
* Модифицированная версия примера Adafruit
* Обратитесь к www.surtrtech.com или каналу SurtrTech на YouTube */
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // I2C интерфейс
void setup() {
Serial.begin(9600);
Serial.println(F("BMP280 test"));
if (!bmp.begin()) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
while (1);
}
/* Настройки по умолчанию из даташита. */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Режим работы. */
Adafruit_BMP280::SAMPLING_X2, /* Передискретизация температуры */
Adafruit_BMP280::SAMPLING_X16, /* Передискретизация давления */
Adafruit_BMP280::FILTER_X16, /* Фильтрация. */
Adafruit_BMP280::STANDBY_MS_500); /* Время ожидания. */
}
void loop() {
Serial.print(F("Temperature = "));
Serial.print(bmp.readTemperature());
Serial.println(" *C");
Serial.print(F("Pressure = "));
Serial.print(bmp.readPressure()/100); // давление в гПа
Serial.println(" hPa");
Serial.print(F("Approx altitude = "));
Serial.print(bmp.readAltitude(1019.66)); // «1019.66» — давление (гПа) на уровне моря в вашем регионе
Serial.println(" m");
Serial.println();
delay(2000);
}
bmp280_Serial_Imperial.ino
/* Этот код для работы с Adafruit BMP280 (имперская система)
* Измеряет температуру и давление, выводит их в Serial Monitor вместе с высотой
* Модифицированная версия примера Adafruit
* Обратитесь к www.surtrtech.com или каналу SurtrTech на YouTube */
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // I2C
void setup() {
Serial.begin(9600);
Serial.println(F("BMP280 test"));
if (!bmp.begin()) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
while (1);
}
/* Настройки по умолчанию из даташита. */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Режим работы. */
Adafruit_BMP280::SAMPLING_X2, /* Передискретизация температуры */
Adafruit_BMP280::SAMPLING_X16, /* Передискретизация давления */
Adafruit_BMP280::FILTER_X16, /* Фильтрация. */
Adafruit_BMP280::STANDBY_MS_500); /* Время ожидания. */
}
void loop() {
float f = bmp.readTemperature()*9/5 + 32; // Перевод из °C в °F
Serial.print(F("Temperature = "));
Serial.print(f);
Serial.println(" *F");
float P = bmp.readPressure()/3386.39; // Давление в дюймах ртутного столба
Serial.print(F("Pressure = "));
Serial.print(P);
Serial.println(" inHg");
float A = bmp.readAltitude(1019.66)*3.28084; // Высота в футах
Serial.print(F("Approx altitude = "));
Serial.print(A);
Serial.println(" ft");
Serial.println();
delay(2000);
}
bmp280_OLED_m.ino
/* Этот код для работы с Adafruit BMP280 и OLED-экраном (метрическая система)
* Измеряет температуру и давление, выводит их на OLED-дисплей вместе с высотой
* Модифицированная версия примера Adafruit
* Обратитесь к www.surtrtech.com или каналу SurtrTech на YouTube */
#include <Adafruit_GFX.h> // Библиотеки для OLED и BMP280
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP280.h>
#define SCREEN_WIDTH 128 // Ширина OLED-дисплея в пикселях
#define SCREEN_HEIGHT 32 // Высота OLED-дисплея в пикселях
#define OLED_RESET -1 // Номер пина Reset (или -1, если используется общий с Arduino)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_BMP280 bmp;
void setup() {
bmp.begin(); // Запуск BMP
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Запуск OLED
display.clearDisplay();
display.display();
display.setTextColor(WHITE);
display.setTextSize(1);
display.print("SurtrTech"); // Имя проекта, можно убрать или заменить
display.setCursor(32,12);
display.setTextSize(2);
display.println("BMP280");
display.display();
delay(2000);
}
void loop() {
display.clearDisplay();
float T = bmp.readTemperature(); // Температура в °C
float P = bmp.readPressure()/100; // Давление в Па и перевод в гПа
float A = bmp.readAltitude(1019.66); // Высота, «1019.66» — давление (гПа) на уровне моря в вашем регионе
// Если не знаете, измените, пока не получите высоту вашего места
display.setCursor(0,0);
display.setTextColor(WHITE);
display.setTextSize(2);
display.print("Temp");
display.setCursor(0,18);
display.print(T,1);
display.setCursor(50,17);
display.setTextSize(1);
display.print("C");
display.setTextSize(1);
display.setCursor(65,0);
display.print("Pres");
display.setCursor(65,10);
display.print(P);
display.setCursor(110,10);
display.print("hPa");
display.setCursor(65,25);
display.print("Alt");
display.setCursor(90,25);
display.print(A,0);
display.setCursor(110,25);
display.print("m");
display.display();
delay(2000);
}
bmp280_OLED_US.ino
/* Этот код для работы с Adafruit BMP280 и OLED-экраном (имперская система)
* Измеряет температуру и давление, выводит их на OLED-дисплей вместе с высотой
* Модифицированная версия примера Adafruit
* Обратитесь к www.surtrtech.com или каналу SurtrTech на YouTube */
#include <Adafruit_GFX.h> // Библиотеки для OLED и BMP280
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP280.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_BMP280 bmp;
void setup() {
bmp.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
display.setTextColor(WHITE);
display.setTextSize(1);
display.print("SurtrTech");
display.setCursor(32,12);
display.setTextSize(2);
display.println("BMP280");
display.display();
delay(2000);
}
void loop() {
display.clearDisplay();
float T = bmp.readTemperature()*9/5 + 32; // Температура в °C и перевод в °F
float P = bmp.readPressure()/3386.39; // Давление в Па и перевод в дюймы ртутного столба
float A = bmp.readAltitude(1019.66)*3.28084; // Высота, «1019.66» — давление (гПа) на уровне моря в вашем регионе
display.setCursor(0,0);
display.setTextColor(WHITE);
display.setTextSize(2);
display.print("Temp");
display.setCursor(0,18);
display.print(T,1);
display.setCursor(50,17);
display.setTextSize(1);
display.print("F");
display.setTextSize(1);
display.setCursor(65,0);
display.print("Pres");
display.setCursor(65,10);
display.print(P);
display.setCursor(100,10);
display.print("inHg");
display.setCursor(65,25);
display.print("Alt");
display.setCursor(90,25);
display.print(A,0);
display.setCursor(110,25);
display.print("ft");
display.display();
delay(2000);
}
Необходимые библиотеки
Схема подключения
Оба модуля используют интерфейс I²C: SDA/SCL подключены к пинам A4 и A5. BMP280 питается от 5 В, а OLED — от 3,3 В.

Производственный процесс
- Интегрированная система контроля доступа с QR, RFID и верификацией температуры
- Подключение нескольких DS18B20 1-Wire датчиков к Raspberry Pi для точного мониторинга температуры
- Создание удалённого датчика температуры на Raspberry Pi и Python — пошаговое руководство
- Бесшовный мониторинг температуры и влажности на Raspberry Pi с EzTemp
- Самодельная система термостатирования для домашнего пивоварения: мониторинг и регулирование на Arduino
- Raspberry Pi BMP085: точные показания температуры и давления по I2C
- Точное измерение и логирование термопар для лабораторных и научных экспериментов
- Создание многодатчиковой системы мониторинга температуры и света с Raspberry Pi и DS18B20
- Устройство точного измерения давления и расхода воздуха на аналоговом датчике
- Логгер температуры и влажности на Arduino с DHT11 и Ethernet Shield