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.

 

 

Предыдущий урок Программирование МК STM32 Следующая часть

 

 

Отладочную плату можно приобрести здесь Nucleo STM32F401RE

Логический анализатор 16 каналов можно приобрести здесь

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

Дисплей LCD 20×4 можно приобрести тут: LCD 20×4

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

 

 

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

 

STM Name

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

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

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

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

*