Оглавление:

Библиотека для BMP280 и BME280: 7 шагов
Библиотека для BMP280 и BME280: 7 шагов

Видео: Библиотека для BMP280 и BME280: 7 шагов

Видео: Библиотека для BMP280 и BME280: 7 шагов
Видео: Обзор модуля BMP280 Датчик атмосферного давления для arduino 2024, Ноябрь
Anonim
Библиотека для BMP280 и BME280
Библиотека для BMP280 и BME280
Библиотека для BMP280 и BME280
Библиотека для BMP280 и BME280
Библиотека для BMP280 и BME280
Библиотека для BMP280 и BME280

Вступление

Я не собирался писать эту библиотеку. Это «произошло» как побочный эффект начатого мной проекта, в котором используется BMP280. Этот проект еще не завершен, но я думаю, что библиотека готова поделиться с другими. Впоследствии у меня возникла необходимость использовать BME280, который добавляет измерение влажности к возможностям BMP280 по давлению и температуре. BME280 "обратно совместим" с BMP280, то есть все регистры и шаги, необходимые для считывания давления и температуры с BME280, такие же, как и для BMP280. Для считывания влажности необходимы дополнительные регистры и шаги, применимые только к BME280. Возникает вопрос: одна библиотека для обеих или две отдельные библиотеки. Аппаратное обеспечение для двух типов устройств полностью взаимозаменяемо. Даже многие из продаваемых модулей (например, на Ebay и AliExpress) имеют маркировку BME / P280. Чтобы узнать, какой это тип, вы должны посмотреть на (крошечную) запись на самом датчике или проверить байт идентификатора устройства. Я решил выбрать одну библиотеку. Похоже, все прошло нормально.

Мы будем благодарны за обратную связь, особенно любые предложения по улучшению.

Функции и возможности библиотеки

Библиотека - это часть программного обеспечения, которое предоставляет программисту интерфейс прикладного программирования (API) для использования возможностей устройства без необходимости иметь дело со всеми мелкими деталями. Желательно, чтобы API был легким для новичка с простыми требованиями для начала работы, обеспечивая при этом полное использование возможностей устройства. Желательно, чтобы библиотека следовала любым конкретным рекомендациям производителя устройства, а также общим передовым методам работы с программным обеспечением. Я старался достичь всего этого. Начиная с BMP280, я нашел для него 3 разные библиотеки: Adafruit_BMP280; Seeed_BMP280; и один под названием BMP280 от производителя устройства. Ни Adafruit, ни Seeed не предоставляли расширенных возможностей, хотя они хорошо работали и были просты в использовании для базовых приложений. Я не мог понять, как использовать тот, который выпускает производитель устройства (Bosch Sensortec). Возможно, это мой недостаток, а не их. Однако библиотека была намного сложнее двух других, я не смог найти никаких инструкций или примеров использования (впоследствии я обнаружил, что примеры были в файле «bmp280_support.c», однако они не были мне особенно полезны).

В результате этих факторов я решил написать свою собственную библиотеку для BMP280.

Изучая ситуацию с библиотекой BME280, я обнаружил отдельные библиотеки Adafruit_BME280, Seed_BME280 и еще одну BME280_MOD-1022, написанную Embedded Adventures. Ни один из них не объединил функции BMP280 в библиотеке, способной использовать BME280. Ни один из них явно не поддерживал способность устройств хранить несколько бит данных, пока устройство и его управляющий микропроцессор находятся в спящем режиме (эта возможность очевидна в таблице данных и поддерживается в библиотеке, которую я написал и описал здесь).

Комбинированная библиотека должна поддерживать все возможности BME280, но при использовании с BMP280 она не должна вызывать никаких накладных расходов из-за неиспользуемых функций. Преимущества комбинированной библиотеки включают меньшее количество файлов библиотеки для управления, легкое сочетание различных устройств в одном проекте и упрощенные изменения для обслуживания или обновлений, которые должны выполняться только в одном месте, а не в двух. Это, наверное, все совсем мелкие, даже незначительные, но …

Возможности устройства

BMP280 и BME280 представляют собой устройства для поверхностного монтажа с площадью около 5 мм и высотой 1 мм. Имеется 8 контактных площадок, в том числе 2 отдельные площадки ввода питания и две площадки заземления. Они доступны на eBay в виде модуля с 4 или 6 выведенными контактами. 4-контактный модуль имеет фиксированный адрес I2C и не может быть настроен для использования протокола SPI.

6-контактный модуль или голое устройство можно использовать с протоколами I2C или SPI. В режиме I2C он может иметь два разных адреса, что достигается подключением вывода SDO либо к земле (для базового адреса = 0x76), либо к Vdd (для базового адреса +1 = 0x77). В режиме SPI он имеет обычное расположение: 1 тактовый сигнал, 2 данных (по одному для каждого направления) и вывод выбора устройства (CS).

Библиотека, которую я написал и описываю здесь, поддерживает только I2C. Библиотеки Adafruit_BMP280 и BME_MOD-1022 поддерживают как i2C, так и SPI.

Библиотеку можно скачать здесь:

github.com/farmerkeith/BMP280-library

Шаг 1: Настройка оборудования

Настройка оборудования
Настройка оборудования

Прежде чем библиотека станет полезной, необходимо подключить микроконтроллер к BMP280 (или к двум из них, если хотите).

Я использовал WeMos D1 mini pro, поэтому покажу его соединения. Другие микроконтроллеры будут похожи, вам просто нужно правильно подключить выводы SDA и SCL.

В случае WeMos D1 mini pro соединения следующие:

Функция Вывод WeMos Вывод BMP280 Примечания

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Номинальное 3,3 В Земля GND Управление адресом SDO Ground или Vdd I2C выберите CSB Vdd (GND выбирает SPI)

Обратите внимание, что вывод SDO на некоторых модулях MP280 обозначен как SDD, а вывод Vdd может быть обозначен как VCC. Примечание. Линии SDA и SCL должны иметь подтягивающие резисторы между линией и выводом Vin. Обычно значение 4,7K должно быть в порядке. Некоторые модули BMP280 и BME280 имеют нагрузочные резисторы 10 кОм, включенные в модуль (что не является хорошей практикой, поскольку подключение нескольких устройств к шине I2C может привести к чрезмерной нагрузке). Однако использование 2 модулей BME / P280, каждый с резистором 10 кОм, не должно быть проблемой на практике, если на той же шине не слишком много других устройств, также с подтягивающими резисторами.

После подключения оборудования вы можете легко проверить, является ли ваше устройство BMP280 или BME280, запустив скетч I2CScan_ID, который вы можете найти здесь:

Вы также можете проверить, какой у вас BMP280 или BME280, посмотрев на само устройство. Я счел необходимым использовать для этого цифровой микроскоп, но если у вас очень хорошее зрение, вы можете сделать это без каких-либо вспомогательных средств. На корпусе устройства нанесены две линии печати. Ключ - это первая буква во второй строке, которая в случае устройств BMP280 представляет собой «K», а в случае устройств BME280 - «U».

Шаг 2. API, предоставляемые библиотекой

API, предоставляемые библиотекой
API, предоставляемые библиотекой
API, предоставляемые библиотекой
API, предоставляемые библиотекой

Включение библиотеки в эскиз

Библиотека включается в скетч стандартным образом с помощью оператора

#include "farmerkeith_BMP280.h"

Этот оператор необходимо включить в начальную часть скетча перед запуском функции setup ().

Создание программного объекта BME или BMP

Существует 3 уровня создания программного объекта BMP280. Самое простое - это просто

bme280 objectName; или bmp280 objectName;

например BMP280 bmp0;

Это создает программный объект с адресом по умолчанию 0x76 (т.е. для SDO, подключенного к земле).

Следующий уровень для создания программного объекта BME280 или BMP280 имеет параметр 0 или 1, как показано ниже:

bme280 objectNameA (0);

bmp280 objectNameB (1);

Параметр (0 или 1) добавляется к базовому адресу I2C, так что два устройства BME280 или BMP280 могут использоваться на одной шине I2C (включая по одному каждого из них).

Третий уровень для создания программного объекта BME или BMP280 имеет два параметра. Первый параметр, равный 0 или 1, относится к адресу, как и в предыдущем случае. Второй параметр управляет отладочной печатью. Если он установлен в 1, каждая транзакция с программным объектом приводит к выходным данным Serial.print, что позволяет программисту видеть детали транзакции. Например:

bmp280 objectNameB (1, 1);

Если параметр отладочной печати установлен на 0, программный объект возвращается к нормальному поведению (без печати).

Этот оператор или операторы необходимо включить после #include и перед функцией setup ().

Инициализация программного объекта BME или BMP

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

Для простой инициализации общего назначения следующий оператор:

objectName.begin ();

Эта версия begin () считывает параметры калибровки с устройства и устанавливает osrs_t = 7 (16 измерений температуры), osrs_p = 7 (16 измерений давления), mode = 3 (непрерывный, нормальный), t_sb = 0 (время ожидания 0,5 мс между наборы измерений), filter = 0 (K = 1, поэтому фильтрация отсутствует) и spiw_en = 0 (SPI отключен, поэтому используйте I2C). В случае BME280 есть дополнительный параметр osrs_h = 7 для 16 измерений влажности.

Есть еще одна версия begin (), которая принимает все шесть (или 7) параметров. Эквивалент приведенного выше утверждения:

objectName.begin (7, 7, 3, 0, 0, 0); // osrs_t, osrs_p, режим, t_sb, фильтр, spiw_en

или objectName.begin (7, 7, 3, 0, 0, 0, 7); // osrs_t, osrs_p, режим, t_sb, фильтр, spiw_en, osrs_h

Полный список кодов и их значений можно найти в технических данных BME280 и BMP280, а также в комментариях в файле.cpp в библиотеке.

Простое измерение температуры и давления

Самый простой способ получить измерение температуры:

двойная температура = objectName.readTemperature (); // измеряем температуру

Самый простой способ измерить давление:

двойное давление = objectName.readPressure (); // измеряем давление

Самый простой способ измерить влажность:

двойная влажность = objectName.readHumidity (); // измеряем влажность (только BME280)

Чтобы получить как температуру, так и давление, два вышеупомянутых оператора можно использовать один за другим, но есть и другой вариант, а именно:

двойная температура;

двойное давление = objectName.readPressure (температура); // измеряем давление и температуру

Этот оператор считывает данные с устройства BME280 или BMP280 только один раз и возвращает температуру и давление. Это немного более эффективное использование шины I2C и гарантирует, что два показания соответствуют одному и тому же циклу измерения.

Для BME 280 объединенный оператор, который получает все три значения (влажность, температуру и давление), выглядит следующим образом:

двойная температура, давление; двойная влажность = objectName.readHumidity (температура, давление); // измеряем влажность, давление и температуру

Этот оператор считывает данные с устройства BMP280 только один раз и возвращает все три значения. Это немного более эффективное использование шины I2C и гарантирует, что три показания соответствуют одному и тому же циклу измерения. Обратите внимание, что имена переменных могут быть изменены на все, что угодно пользователю, но их порядок фиксирован - на первом месте температура, а на втором - давление.

Эти варианты использования описаны в примерах скетчей, поставляемых с библиотекой: basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino и basicHumidityAndTemperatureAndPressure.ino.

Более сложные измерения температуры и давления

Хотя приведенная выше серия утверждений будет работать без проблем, есть несколько проблем:

  1. устройство работает непрерывно и поэтому потребляет мощность на максимальном уровне. Если энергия поступает от батареи, возможно, потребуется уменьшить ее.
  2. из-за потребляемой мощности устройство будет нагреваться, и, следовательно, измеренная температура будет выше температуры окружающей среды. Я расскажу об этом подробнее позже.

Результат, который потребляет меньше энергии и дает температуру, близкую к температуре окружающей среды, может быть получен с помощью метода begin () с параметрами, переводящими его в спящий режим (например, mode = 0). Например:

objectName.begin (1, 1, 0, 0, 0, 0 [, 1]); // osrs_t, osrs_p, mode, t_sb, filter, spiw_en [, osrs_h]

Затем, когда требуется измерение, выведите устройство из спящего режима с помощью команды конфигурации для регистров F2 (при необходимости) и F4, которая устанавливает соответствующие значения osrs_h, osrs_t и osrs_p, плюс mode = 1 (режим одиночного импульса). Например:

[objectName.updateF2Control (1);] // osrs_h - никогда не требуется для BMP280, // и не требуется для BME280, если количество измерений не изменяется // со значения, предоставленного в begin (). objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, режим

Разбудив устройство, оно начнет измерения, но результат будет недоступен в течение нескольких миллисекунд - минимум 4 мс, возможно, до 70 мс или более, в зависимости от количества заданных измерений. Если команда чтения отправляется немедленно, устройство вернет значения из предыдущего измерения, что может быть приемлемо в некоторых приложениях, но в большинстве случаев, вероятно, лучше отложить, пока новое измерение не станет доступным.

Эту задержку можно осуществить несколькими способами.

  1. подождите фиксированное количество времени, чтобы покрыть самую долгую ожидаемую задержку
  2. ждать время, рассчитанное из максимального времени измерения на одно измерение (например, 2,3 мс), умноженного на количество измерений, плюс накладные расходы плюс запас.
  3. подождите более короткое время, рассчитанное, как указано выше, но с использованием номинального времени измерения (например, 2 мс) плюс служебные данные, а затем начните проверку бита «Я измеряю» в регистре состояния. Когда бит состояния показывает 0 (т. Е. Не измерения), получите показания температуры и давления.
  4. немедленно начать проверку регистра состояния и получать показания температуры и давления, когда бит состояния показывает 0,

Я покажу пример одного из способов сделать это чуть позже.

Операции с регистром конфигурации

Чтобы все это произошло, нам понадобится несколько инструментов, которые я еще не представил. Они есть:

байт readRegister (reg)

void updateRegister (reg, значение)

У каждого из них есть несколько производных команд в библиотеке, которые немного упрощают программное обеспечение для определенных действий.

В примере powerSaverPressureAndTemperature.ino используется метод № 3. Строка кода, выполняющая повторную проверку:

while (bmp0.readRegister (0xF3) >> 3); // цикл до F3bit 3 == 0

Обратите внимание, что этот эскиз предназначен для микроконтроллера ESP8266. Я использовал WeMos D1 mini pro. Скетч не будет работать с микроконтроллерами Atmega, у которых есть другие инструкции для сна. В этом эскизе используется несколько других команд, поэтому я представлю их все, прежде чем описывать этот эскиз более подробно.

Когда микроконтоллер находится в спящем режиме параллельно с датчиком BMP280, настройку датчика для требуемых измерений можно выполнить с помощью команды begin () с использованием 6 параметров. Однако, если микроконтроллер не спит, а датчик находится в спящем режиме, то во время измерения датчик должен быть разбужен и сообщить свою конфигурацию измерения. Это можно сделать напрямую с помощью

updateRegister (рег, значение)

но это немного проще с помощью следующих трех команд:

updateF2Control (osrs_h); // только BME280

updateF4Control (osrs_t, osrs_p, mode); updateF5Config (t_sb, filter, spi3W_en);

После завершения измерения, если используется режим «Покадровый снимок» (принудительный режим), устройство автоматически перейдет в спящий режим. Однако, если набор измерений включает несколько измерений в непрерывном (нормальном) режиме, BMP280 необходимо будет снова перевести в спящий режим. Это можно сделать с помощью одной из двух следующих команд:

updateF4Control16xSleep ();

updateF4ControlSleep (значение);

Оба они устанавливают биты режима в 00 (то есть в спящий режим). Однако первый устанавливает osrs_t и osrs_p на 111 (т.е. 16 измерений), а второй сохраняет младшие 6 битов от «значения» в битах 7: 2 регистра 0xF4.

Аналогичным образом следующий оператор сохраняет шесть младших битов «значения» в битах 7: 2 регистра 0xF5.

updateF5ConfigSleep (значение);

Использование этих последних команд позволяет хранить 12 бит информации в регистрах F4 и F5 BMP280. По крайней мере, в случае ESP8266, когда микроконтроллер выходит из спящего режима, он запускается в начале скетча, не зная о своем состоянии до команды спящего режима. Чтобы сохранить информацию о своем состоянии до команды перехода в спящий режим, данные могут быть сохранены во флэш-памяти с использованием функций EEPROM или путем записи файла с помощью SPIFFS. Однако флеш-память имеет ограничение на количество циклов записи порядка от 10 000 до 100 000. Это означает, что если микроконтроллер проходит цикл сна-пробуждения каждые несколько секунд, он может превысить допустимый объем записи в память. ограничение в несколько месяцев. Хранение нескольких бит данных в BMP280 не имеет такого ограничения.

Данные, хранящиеся в регистрах F4 и F5, могут быть восстановлены, когда микроконтроллер просыпается, используя команды

readF4Sleep ();

readF5Sleep ();

Эти функции читают соответствующий регистр, сдвигают содержимое, чтобы удалить 2 младших бита и возвращают оставшиеся 6 бит. Эти функции используются в примере эскиза powerSaverPressureAndTemperatureESP.ino следующим образом:

// считываем значение EventCounter обратно из bmp0

байт bmp0F4value = bmp0.readF4Sleep (); // от 0 до 63 байт bmp0F5value = bmp0.readF5Sleep (); // от 0 до 63 eventCounter = bmp0F5value * 64 + bmp0F4value; // от 0 до 4095

Эти функции читают соответствующий регистр, сдвигают содержимое, чтобы удалить 2 младших бита и возвращают оставшиеся 6 бит. Эти функции используются в примере скетча powerSaverPressureAndTemperature.ino следующим образом:

// считываем значение EventCounter обратно из bmp1

байт bmp1F4value = bmp1.readF4Sleep (); // от 0 до 63 байт bmp1F5value = bmp1.readF5Sleep (); // от 0 до 63 eventCounter = bmp1F5value * 64 + bmp1F4value; // от 0 до 4095

Необработанные функции температуры и давления

Базовые функции readTemperature, readPressure и readHumidity состоят из двух компонентов. Сначала необработанные 20-битные значения температуры и давления получаются из BME / P280, или необработанные 16-битные значения влажности получаются из BME280. Затем алгоритм компенсации используется для генерации выходных значений в градусах Цельсия, гПа или% относительной влажности.

Библиотека предоставляет отдельные функции для этих компонентов, так что необработанные данные о температуре, давлении и влажности могут быть получены и, возможно, каким-то образом обработаны. Также предоставляется алгоритм для получения температуры, давления и влажности из этих необработанных значений. В библиотеке эти алгоритмы реализованы с использованием арифметики с плавающей запятой двойной длины. Он хорошо работает на ESP8266, который является 32-битным процессором и использует 64 бита для «двойных» переменных с плавающей запятой. Доступ к этим функциям может быть полезен для оценки и, возможно, изменения расчета для других платформ.

Эти функции:

readRawPressure (rawTemperature); // считывает необработанные данные о давлении и температуре из BME / P280readRawHumidity (rawTemperature, rawPressure); // считывает исходные данные о влажности, температуре и давлении из BME280 calcTemperature (rawTemperature, t_fine); calcPressure (rawPressure, t_fine); calcHumidity (rawHumidity, t_fine)

Аргумент "t-fine" для этих функций заслуживает небольшого пояснения. Алгоритмы компенсации давления и влажности включают компонент, зависящий от температуры, который достигается с помощью переменной t_fine. Функция calcTemperature записывает значение в t_fine на основе логики алгоритма температурной компенсации, которое затем используется в качестве входных данных как для calcPressure, так и для calcHumidity.

Пример использования этих функций можно найти в примере скетча rawPressureAndTempera.ino, а также в коде функции readHumidity () в файле.cpp библиотеки.

Высота и давление на уровне моря

Существует известная взаимосвязь между атмосферным давлением и высотой. Погода также влияет на давление. Когда погодные организации публикуют информацию об атмосферном давлении, они обычно корректируют ее по высоте, и поэтому «синоптическая карта» показывает изобары (линии постоянного давления), стандартизированные для среднего уровня моря. Итак, на самом деле в этих отношениях есть 3 значения, и знание двух из них позволяет получить третье. Три значения:

  • высота над уровнем моря
  • фактическое давление воздуха на этой высоте
  • эквивалентное атмосферное давление на уровне моря (точнее, средний уровень моря, потому что мгновенный уровень моря постоянно меняется)

Эта библиотека предоставляет две функции для этой связи, а именно:

calcAltitude (давление, seaLevelhPa);

calcNormalisedPressure (давление, высота);

Существует также упрощенная версия, которая предполагает стандартное давление на уровне моря 1013,15 гПа.

calcAltitude (давление); // стандартное значение seaLevelPressure

Шаг 3: Подробная информация об устройстве BMP280

BMP280 Подробная информация об устройстве
BMP280 Подробная информация об устройстве

Возможности оборудования

BMP280 имеет 2 байта данных конфигурации (по адресам регистров 0xF4 и 0xF5), которые используются для управления несколькими вариантами измерения и вывода данных. Он также предоставляет 2 бита информации о состоянии и 24 байта параметров калибровки, которые используются для преобразования исходных значений температуры и давления в обычные единицы измерения температуры и давления. BME280 имеет следующие дополнительные данные:

  • 1 дополнительный байт данных конфигурации по адресу регистра 0xF2, используемый для управления несколькими измерениями влажности;
  • 8 дополнительных байтов параметров калибровки, используемых для преобразования исходного значения влажности в процент относительной влажности.

Регистры температуры, давления и состояния для BME280 такие же, как и для BMP280, за небольшими исключениями, а именно:

  • биты «ID» BME280 установлены на 0x60, поэтому его можно отличить от BMP280, который может быть 0x56, 0x57 или 0x58
  • управление временем ожидания (t_sb) изменено таким образом, что два больших времени в BMP280 (2000 мс и 4000 мс) заменяются в BME280 короткими временами 10 мс и 20 мс. Максимальное время ожидания в BME280 составляет 1000 мс.
  • В BME280 исходные значения температуры и давления всегда равны 20 битам, если применяется фильтрация. Использование значений от 16 до 19 бит ограничено случаями без фильтрации (т. Е. Filter = 0).

Температура и давление представляют собой 20-битные значения, которые необходимо преобразовать в обычные температуру и давление с помощью довольно сложного алгоритма, использующего 3 16-битных калибровочных параметра для температуры и 9 16-битных калибровочных параметров плюс температуру для давления. Степень детализации измерения температуры составляет 0,0003 градуса Цельсия для наименее значимого изменения бит (20-битное считывание), увеличиваясь до 0,0046 градусов Цельсия, если используется 16-битное считывание.

Влажность - это 16-битное значение, которое необходимо преобразовать в относительную влажность с помощью другого сложного алгоритма с использованием 6 параметров калибровки, которые представляют собой сочетание 8, 12 и 16 бит.

В техническом паспорте указана абсолютная точность показаний температуры: + -0,5 C при 25 C и + -1 C в диапазоне от 0 до 65 C.

Степень детализации измерения давления составляет 0,15 Паскалей (т. Е. 0,0015 гектопаскалей) при разрешении 20 бит или 2,5 Паскалей при разрешении 16 бит. На исходное значение давления влияет температура, так что около 25 ° C повышение температуры на 1 ° C снижает измеренное давление на 24 Па. Температурная чувствительность учитывается в алгоритме калибровки, поэтому значения подаваемого давления должны быть точными при различных температурах.

В техническом паспорте абсолютная точность показаний давления указана как + -1 гПа для температур от 0 C до 65 C.

Точность влажности указана в техническом паспорте как + -3% относительной влажности и + -1% гистерезиса.

Как это работает

24 байта данных калибровки температуры и давления, а также в случае BME280 8 байтов данных калибровки влажности должны быть считаны с устройства и сохранены в переменных. Эти данные индивидуально запрограммированы в устройстве на заводе, поэтому разные устройства имеют разные значения - по крайней мере, для некоторых параметров. BME / P280 может находиться в одном из двух состояний. В одном состоянии он мерный. В другом состоянии он ждет (спит).

В каком состоянии он находится, можно проверить, посмотрев на бит 3 регистра 0xF3.

Результаты самого последнего измерения могут быть получены в любое время путем считывания соответствующего значения данных, независимо от того, находится ли устройство в спящем режиме или измеряет.

BME / P280 также можно использовать двумя способами. Один из них - это непрерывный режим (называемый нормальным режимом в таблице данных), который многократно переключается между состояниями измерения и ожидания. В этом режиме устройство выполняет набор измерений, затем переходит в спящий режим, затем просыпается для выполнения другого набора измерений и так далее. Количество отдельных измерений и продолжительность периода ожидания в цикле можно контролировать с помощью регистров конфигурации.

Другой способ работы BME / P280 - это режим одиночной съемки (в технических данных он называется принудительным режимом). В этом режиме устройство выводится из спящего режима с помощью команды измерения, выполняет ряд измерений, а затем возвращается в спящий режим. Количество отдельных измерений в наборе контролируется командой конфигурации, которая выводит устройство из спящего режима.

В BMP280, если выполняется одно измерение, заполняются 16 старших битов значения, а все четыре младших бита в считывании значения равны нулю. Количество измерений может быть установлено на 1, 2, 4, 8 или 16, и по мере увеличения количества измерений количество битов, заполненных данными, увеличивается, так что при 16 измерениях все 20 битов заполняются данными измерений. В таблице данных этот процесс называется передискретизацией.

В BME280 такое же расположение применяется до тех пор, пока результат не фильтруется. Если используется фильтрация, значения всегда равны 20 битам, независимо от того, сколько измерений выполняется в каждом цикле измерения.

Каждое отдельное измерение занимает около 2 миллисекунд (типичное значение; максимальное значение составляет 2,3 мс). Если добавить к этому фиксированные накладные расходы около 2 мс (обычно немного меньше), это означает, что последовательность измерений, которая может состоять из от 1 до 32 отдельных измерений, может занимать от 4 до 66 мс.

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

Регистры управления конфигурацией

Два регистра управления конфигурацией в BMP280 находятся по адресам регистров 0xF4 и 0xF5 и отображаются на 6 отдельных значений управления конфигурацией. 0xF4 состоит из:

  • 3 бита osrs_t (измерять температуру 0, 1, 2, 4, 8 или 16 раз);
  • 3 бита osrs_p (измерьте давление 0, 1, 2, 4, 8 или 16 раз); а также
  • 2-битный режим (спящий, принудительный (т.е. одиночный снимок), нормальный (т.е. непрерывный).

0xF5 состоит из:

  • 3 бита t_sb (время ожидания, от 0,5 мс до 4000 мс);
  • 3-битный фильтр (см. Ниже); а также
  • 1 бит spiw_en, который выбирает SPI или I2C.

Параметр фильтра управляет типом алгоритма экспоненциального затухания или фильтра бесконечной импульсной характеристики (БИХ), применяемого к необработанным значениям измерения давления и температуры (но не к значениям влажности). Уравнение приведено в техническом паспорте. Другая презентация:

Значение (n) = Значение (n-1) * (K-1) / K + измерение (n) / K

где (n) указывает самое последнее измерение и выходное значение; K - параметр фильтра. Параметр фильтра K и может быть установлен на 1, 2, 4, 8 или 16. Если K установлен на 1, уравнение просто принимает вид Значение (n) = измерение (n). Кодировка параметра фильтра:

  • фильтр = 000, K = 1
  • фильтр = 001, K = 2
  • фильтр = 010, K = 4
  • фильтр = 011, K = 8
  • фильтр = 1xx, K = 16

BME 280 добавляет дополнительный регистр управления конфигурацией по адресу 0xF2, «ctrl_hum» с одним 3-битным параметром osrs_h (измерение влажности 0, 1, 2, 4, 8 или 16 раз).

Шаг 4: Время измерения и считывания

Я планирую добавить это позже, показывая время выполнения команд и результатов измерений.

Iddt - ток при измерении температуры. Типовое значение 325 мкА

Iddp - ток при измерении давления. Типовое значение 720 мкА, не более 1120 мкА

Iddsb - ток в режиме ожидания. Типичное значение 0,2 мкА, макс 0,5 мкА

Iddsl - ток в спящем режиме. Типичное значение 0,1 мкА, макс. 0,3 мкА

Шаг 5. Рекомендации по программному обеспечению

Рекомендации по программному обеспечению
Рекомендации по программному обеспечению
Рекомендации по программному обеспечению
Рекомендации по программному обеспечению

I2C пакетный режим

Спецификация BMP280 содержит указания по считыванию данных (раздел 3.9). В нем говорится, что «настоятельно рекомендуется использовать пакетное чтение и не обращаться к каждому регистру по отдельности. Это предотвратит возможное смешение байтов, принадлежащих разным измерениям, и уменьшит трафик интерфейса». Никаких указаний относительно считывания параметров компенсации / калибровки не дается. Предположительно, это не проблема, потому что они статичны и не меняются.

Эта библиотека считывает все смежные значения за одну операцию чтения - 24 байта в случае параметров компенсации температуры и давления, 6 байтов для комбинации температуры и давления и 8 байтов для комбинации влажности, температуры и давления. Когда проверяется только температура, считываются только 3 байта.

Использование макросов (#define и т. Д.)

В этой библиотеке нет макросов, кроме обычного библиотечного макроса «include guard», который предотвращает дублирование.

Все константы определяются с помощью ключевого слова const, а отладочная печать контролируется стандартными функциями C.

Это было источником некоторой неуверенности для меня, но совет, который я получаю, читая много сообщений по этой теме, заключается в том, что использование #define для объявления констант (по крайней мере) и (возможно) управления печатью отладки не нужно и нежелательно.

Случай использования const вместо #define довольно ясен - const использует те же ресурсы, что и #define (т.е. nil), и результирующие значения следуют правилам области видимости, тем самым уменьшая вероятность ошибок.

Случай для управления печатью отладки немного менее ясен, потому что способ, которым я это сделал, означает, что окончательный код содержит логику для операторов печати отладки, даже если они никогда не выполняются. Если библиотека будет использоваться в большом проекте на микроконтроллере с очень ограниченной памятью, это может стать проблемой. Поскольку моя разработка велась на ESP8266 с большой флэш-памятью, это не казалось мне проблемой.

Шаг 6: Температурные характеристики

Я планирую добавить это позже.

Шаг 7: Давление

Я планирую добавить это позже.

Рекомендуемые: