STM Урок 121. Датчик температуры, давления и влажности BME280. Часть 1
На данном занятии мы по многочисленным просьбам рассмотрим датчик от компании Bosch Sensortec — BME280.
Данный датчик измеряет несколько очень важных величин окружающей среды — это температура, влажность воздуха, а также атмосферное давление.
Есть ещё подобный датчик — BMP280, который также измеряет данные величины, но только кроме влажности. Но зато стоит он гораздо дешевле.
Но так как просьбы были именно рассмотреть датчик BME280, то им мы и займёмся.
Помимо того, что датчик измеряет все эти вышеперечисленные величины, он также умеет фильтровать шумы, в него встроена очень тонкая калибровка показаний, в то же время все эти работы он проделывает блестяще и очень быстро. Также в отличие от предыдущих подобных рассмотренных нами датчиков, данный датчик проделывает все эти измерения не только быстро, но и в более широких диапазонах. Например, многие датчики не умеют измерять влажность воздуха менее 20 процентов.
Выглядит датчик следующим образом (нажмите на картинку для увеличения изображения)
И, прежде чем приступить к программированию и подключению данного датчика, мы кратко познакомимся с его основными характеристиками. Если кому-то интересно узнать подробно, то вся информация присутствует на официальном сайте компании Bosch Sensortec.
Пока начнём с того, как данный датчик подключить к контроллеру. Он может подключаться как с помощью шины SPI, так и с помощью шины I2C. Мы же будем подключать его именно по шине I2C, так как мне в руки попал модуль с данным датчиком, который подключается только посредством I2C и интерфейс SPI в нём от датчика на внешние контакты не выведен. Выглядит данный модуль следующим образом

По шине SPI датчик можно тактировать частотой до 10 мегагерц, а по шине I2C — до 3,4 мегагерц
Питать данный модуль можно от 1,71 вольт до 3,6 вольт.
Порт ввода-вывода датчика питается в диапазоне 1,2 — 3,6 В (существует для этого отдельная ножка питания).
Ток потребления датчика:
при измерении влажности и температуры при частоте дискретизации 1 герц — 1,8 мкА,
при измерении давления и температуры при частоте дискретизации 1 герц — 2,8 мкА,
при измерении давления, влажности и температуры при частоте дискретизации 1 герц — 3,6 мкА,
в спящем режиме — 0,1 мкА.
Мы видим, что такие токи у нас будут иметь место только при семплировании 1 герц, без оверсемплинга (передискретизации). А если мы применим какие-нибудь фильтры, то на выходе уже будет совершенно другая частота, в силу вступят коэффициенты фильтрации. Поэтому в таком случае данные токи потребления будут наблюдаться уже при меньшей частоте измерений.
Диапазоны измерения: температуры — -40 … +85 °C, влажности — 0 … 100 %, давления — 300 … 1100 hPa.
Конечно в различных диапазонах точность измерения будет разная.
Например, точность измерения влажности ±3 %RH обеспечивается только в диапазоне 20…80 %RH, а точность измерения давления ±1.0 hPa — в диапазоне 300 … 1100 hPa (то есть во всём диапазоне). Точность измерения температуры ±0.5 °C (при 25 °C),
Шумит датчик следующим образом:
Влажность: 0,07% — без применения оверсемплинга, при максимальном оверсемплинге шумы снижаются до 0,02%.
Давление: 1,3 Pa — без применения оверсемплинга и фильтров, при максимальных оверсемплинге и фильтрации снижаются до 0,2 Pa.
Температура: 0,005 °C — без применения оверсемплинга и фильтров, при максимальных оверсемплинге и фильтрации снижаютя до 0,002 °C.
Теперь посмотрим назначение контактов датчика

Vdd — аналоговое питание;
GND — общий провод;
Vddio — питание цифрового тракта;
SDO — выход цифрового сигнала при использовании 4-проводного режима SPI, при использовании режима I2C — шина адреса (если соединен с общим проводом, то логический ноль в нулевом бите адреса, если с питанием — то логическая 1);
GND — общий провод;
CSB — контакт CS (chip select) при использовании режима SPI;
SDI — вход цифрового сигнала при использовании 4-проводного режима SPI, вход и выход цифрового сигнала при использовании 3-проводного режима SPI и режима I2C;
SCK — шина тактирования цифрового сигнала.
Также у датчика существует масса различных регистров, с которыми подробно мы будем знакомиться при написании кода.
Вот так организована память в датчике (нажмите на картинку для увеличения изображения)
Также следует отметить, что датчик может находиться в трёх режимах: в нормальном (NORMAL MODE), в спящем (SLEEP MODE) и в принудительном (FORCE MODE).
Ну со спящим режимом всё ясно. А чем же отличается нормальный от принудительного?
А вот чем.
В нормальном режиме после считывания значений с датчика последний остаётся в этом режиме и дальше, а вот в принудительном, когда мы считаем значения, датчик автоматически переходит в спящий режим. И, чтобы нам опять считывать показатели, нам надо заново инициализировать либо нормальный либо принудительный режимы.
Данная диаграмма как нельзя лучше показывает нам это

Теперь схема подключения.
Модуль с датчиком мы подключим к плате Nucleo STM32F401RE. также к информационным контактам I2C мы подключим логический анализатор, чтобы смотреть, как наш датчик будет откликаться на команды. Затем, как только приём наладится, мы к плате также по I2C подключим символьный дисплей LCD2004.
Вот так выглядит наша схема без дисплея (нажмите на картинку для увеличения изображения)
Создадим новый проект в Cube MX и выберем контроллер

Включим тактирование контроллера

Затем включим отладчик

Включим шину I2C для подключения датчика
![]()
Переопределим ножки для удобства подключения датчика

Давайте заодно сразу включим и шину для подключения дисплея
![]()
Для данной шины ничего не переопределяем, ножки остаются по умолчанию.
Включим также шину USART для просмотра отладочной информации, нам же все равно никаких проводов и переходников не надо, USART работает через отладочный порт

Включим также на выход ножку светодиода

Перейдём в System Configuration и настроим следующие частоты (нажмите на картинку для увеличения изображения)
Перейдём в Configuration и настроим I2C для датчика

На всякий случай включим прерывания, вдруг пригодятся

Зайдём в настройки другой шины I2C и убедимся, что там всё правильно

Зайдём в настройки проекта, выберем среду программирования, папку проекта и назовём наш проект

Сохраним настройки проекта, сгенерируем проект для Keil, откроем его в нём, затем настроим программатор на автоперезагрузку, установим уровень оптимизации в 1 и попробуем собрать проект.
Если всё нормально собралось, то продолжим.
Откроем файл main.c и подключим библиотеку для работу со строками
/* USER CODE BEGIN Includes */
#include <string.h>
/* USER CODE END Includes */
Добавим глобальный строковый массив
/* Private variables ---------------------------------------------------------*/
char str1[100];
/* USER CODE END PV */
Создадим модуль для нашей новой библиотеке работы с датчиком в виде двух файлов BME280.h и BME280.c следующего содержимого
BME280.h:
#ifndef BME280_H_
#define BME280_H_
//------------------------------------------------
#include "stm32f4xx_hal.h"
#include <string.h>
#include <math.h>
//------------------------------------------------
//------------------------------------------------
#endif /* BME280_H_ */
BME280.c:
#include "BME280.h"
//------------------------------------------------
extern I2C_HandleTypeDef hi2c1;
extern UART_HandleTypeDef huart2;
extern char str1[100];
//------------------------------------------------
Подключим модуль в файле main.c
#include <string.h>
#include "BME280.h"
В следующей части урока мы начнём писать инициализацию датчика, в которой считаем идентификатор, калибровочные данные из датчика, также настроим тайминг режима Standby.
Отладочную плату можно приобрести здесь Nucleo STM32F401RE
Логический анализатор 16 каналов можно приобрести здесь
Датчик температуры, давления и влажности BME280 можно приобрести здесь BME280
Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)







Супер! Как раз неделю назад пытался подключить BME280. По SPI получилось считать ID, а вот по I2C пока никак. Теперь с Вами разберусь 🙂
Отлично!