STM Урок 121. Датчик температуры, давления и влажности BME280. Часть 1

На данном занятии мы по многочисленным просьбам рассмотрим датчик от компании Bosch SensortecBME280.

Данный датчик измеряет несколько очень важных величин окружающей среды — это температура, влажность воздуха, а также атмосферное давление.

Есть ещё подобный датчик — 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

Дисплей LCD 20×4

Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004

 

 

Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)

STM Name

 

Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)

STM Name

2 комментария к “STM Урок 121. Датчик температуры, давления и влажности BME280. Часть 1

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*