BMP180 – подключение датчика атмосферного давления

BMP180 подключение датчика атмосферного давления
BMP180 представляет собой датчик для измерения атмосферного давления и температуры окружающего воздуха. Поскольку между давлением и температурой существует взаимосвязь, то последняя учитывается при расчете давления. Пределы измеряемого давления составляют 300…1100 мбар, или 225…825 мм рт. ст. Датчик продается в виде модуля GY-68 под Arduino, представляет собой миниатюрную плату на которой установлен стабилизатор напряжения 3,3 В, обвязка и непосредственно сам датчик.

Модуль можно заказать здесь. Напряжение питания датчика может находиться в пределах 1,8…3,6 В. Обмен данными, осуществляется с помощью распространенного интерфейса I2C, скорость передачи может достигать 3,4 Мбит/сек (3,4 МГц). Ток потребления и время преобразования зависят от точности (разрешения) результата преобразования давления и подразделены на режимы, которые отражены в следующей таблице:

Режим преобразования
(oss)
ОписаниеВремя преобразования, тип. (макс.)Ток потребления
(частота преобразования 1 Гц)
Длина результата преобразования давления
0Режим пониженного потребления3 мс (4,5 мс)3 мкА16 бит
1Стандартный режим5 мс (7,5 мс)5 мкА17 бит
2Режим высокого разрешения9 мс (13,5 мс)7 мкА18 бит
3Режим ультравысокого разрешения17 мс (25,5 мс)12 мкА19 бит

Ток потребления в таблице указан для частоты преобразования в 1 Гц, при увеличении частоты, ток возрастает прямо пропорционально.

Для температуры время преобразования фиксировано, и составляет 3 мс (макс. 4,5 мс), длина результата 16 бит.

Ниже представлена карта памяти датчика:

АдресНазваниеОписание
0xAA – 0xBFCalib_xxКалибровочные константы
0xD0Chip-idРегистр содержит число 0x55, и может использоваться для проверки интерфейса передачи данных
0xE0Soft resetРегистр программного сброса, для выполнения которого необходимо записать число 0xB6
0xF4Measurement controlРегистр управления преобразованием
0xF6Out_msbРегистр результата преобразования, старший байт
0xF7Out_lsbРегистр результата преобразования, младший байт
0xF8Out_ xlsbРегистр результата преобразования, дополнительный младший байт

Всего в памяти датчика хранятся 11 калибровочных констант, необходимых для расчета температуры и давления. Константы двухбайтные, названия и адреса приведены в следующей таблице:

КонстантаАдрес в памяти
MSBLSB
AC10xAA0xAB
AC20xAC0xAD
AC30xAE0xAF
AC40xB00XB1
AC50XB20XB3
AC60XB40XB5
B10XB60XB7
B20XB80XB9
MB0XBA0XBB
MC0XBC0XBD
MD0XBE0XBF

Регистр управления преобразованием (Measurement control) содержит следующие биты:

БитНазваниеЗначение битаОписание
7-6oss
Режим преобразования
00Пониженное потребление
01Стандартный режим
10Высокое разрешение
11Ультравысокое разрешение
5sco
Бит состояния преобразования
1Начать преобразование
0Преобразование закончено
4-0meas_ctrl01110Измерение температуры
10100Измерение давления

В общем, для измерения температуры в регистр Measurement control необходимо записать число 0x2E, результат считать из регистров out_msb и out_lsb (16 бит). Для измерения давления записать числа 0x34, 0x74, 0xB4, 0xF4 в зависимости от режима преобразования (oss: 0, 1, 2, 3), при этом длина результата варьируется в пределах от 16 до 19 бит. Для режимов (oss: 1, 2, 3), младшие биты результата находятся в дополнительном регистре Out_ xlsb (7-5 биты). Окончание преобразования можно определить, прочитав значение бита sco.

Результаты преобразования температуры и давления представляют собой некомпенсированные (сырые) данные. Для получения правильных значений необходимо произвести довольно много расчетов с использованием калибровочных констант, причем вычисления идут с 32-х разрядными числами.

Датчик имеет фиксированный 7-ми битный адрес для работы по шине I2C, двоичное значение адреса: 1110111.

Ниже представлен алгоритм и пример расчета из даташита:
BMP180 - расчет температуры и давления

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

На следующей картинке представлена схема подключения датчика давления BMP180 к микроконтроллеру PIC16F628A:
BMP180 схема подключения

Микроконтроллер работает на частоте 4 МГц от внутреннего тактового генератора, для вывода результатов измерений я использовал LCD модуль Nokia 5110.

Ниже представлена часть программы для микроконтроллера PIC16F628A, полный исходник с прошивкой можно скачать в конце статьи:

Интерфейс I2C на стороне микроконтроллера реализован программно. После инициализации дисплея выполняется считывание калибровочных констант из датчика в 1-й банк ОЗУ микроконтроллера, там же расположены все вспомогательные регистры, участвующие в арифметических операциях расчета температуры и давления. Под расчеты и хранение констант выделено 75 регистров, почти весь 1-й банк ОЗУ. В 0-м банке расположены регистры подпрограммы передачи данных интерфейса I2C, регистры подпрограммы преобразования двоичного числа в десятичное по разрядам, а также регистры для работы с дисплеем Nokia 5110.

Далее вызывается подпрограмма получения значения температуры rd_temp, которая отправляет на датчик команду запуска преобразования и затем считывает результат. Для получения величины давления, необходимо предварительно в регистр oss записать число от 0 до 3, в зависимости от требуемой точности результата, затем вызывается подпрограмма rd_pres.

Далее следует вызов подпрограммы расчета давления и температуры rash_T_P. Расчет выполняется при помощи арифметических подпрограмм для знаковых 32-х разрядных чисел. Из-за большого количества вычислений подпрограммы расчета занимают значительный объем памяти программ микроконтроллера PIC16F628A, около 800 слов, 40% памяти программ. Расчет длится около 15 мс, для частоты тактового генератора 4 МГц.

После получения рассчитанных значений температуры и давления выполняется преобразование результата в десятичное значение и вывод на LCD дисплей. На первой строке выводится температура, на второй давление в мм рт. ст., на третьей давление в Паскалях. Пауза между измерениями равна 1 секунде. Вся программа занимает около 1600 слов, то есть 80% памяти программ. При возникновении ошибки передачи данных по интерфейсу I2C загорается светодиод HL1, программа при этом зацикливается.

У меня было 2 экземпляра BMP180, при сравнении показаний давления с прогнозом погоды из интернета, первый датчик показывал на 1 мм рт.ст. меньше значения прогноза, второй на 3 мм рт.ст. меньше, то есть получается некоторый разброс показаний от экземпляра к экземпляру. При сравнении показаний температуры с распространенным датчиком DS18B20, оба экземпляра BMP180 выдавали меньшее значение температуры, первый на 1 градус Цельсия, второй на 1,8.

BMP180 внешний вид модуляBMP180 макетная платаМакетная плата BMP180

Ниже представлен видеоролик с подключенным к микроконтроллеру датчиком BMP180:

Прошивка МК и исходник для подключения датчика BMP180

Посетитель, зарегистрированный под именем Nik, отредактировал исходный файл под шрифт размером 9×14, ниже на фото представлен пример отображения температуры и давления на дисплее, исходник и прошивка в конце статьи.
BMP180 шрифт 9x14
Прошивка МК и исходник для BMP180, шрифт 9×14
Печатная плата разработанная посетителем сайта Печатная плата

Последние записи:

Комментариев 57 на “BMP180 – подключение датчика атмосферного давления

  1. Добрый день Руслан.
    Подскажите возможно ли увеличить размер шрифта
    в 2 раза?

    • Приветствую, да это возможно, в этом случае в одну строку уместится 8 символов, всего 3 строки, для этого надо редактировать прошивку, включить таблицу символов 9×14.

  2. Добрый день. Вопрос несколько не по теме, но, скажите пожалуйста, Вам встречались микроконтроллеры серии pic16, работающие при температуре минус 50 градусов Цельсия (по документации на микроконтроллер)?

    • Здравствуйте, я посмотрел документации микроконтроллеров с которыми приходилось иметь дело, из них PIC16F84A, а также серия PIC16F87XA (всего в серии 4 микроконтроллера) могут эксплуатироваться до -55 градусов Цельсия по даташиту.

  3. а можно создать схему с виводом значения мм.рт.ст на семисегментние индикатори?

  4. Я отредактировал ваш АСМ ВМР-180 под большие буквы 9Х14 может кому-то будет интерес повторить с большим шрифтом.Вот и подумал вам переслать. Вы мне помогли с экономить время на написания протокола обмена с ВМР спасибо вам,ну и я чуть-чуть кому-то может помогу.

    • Хорошо), пришлите на почту (почта указана на странице “Об авторе” https://radiolaba.ru/o-avtore) прошивку и исходный код, можно еще и фото как это все выглядит, я выложу в конце статьи ваши доработки.

  5. Здравствуйте.
    Будет ли работать схема при замене BMP180 на BMP280, вроде бы
    позиционируется как прямая замена?

    • Здравствуйте, нет BMP280 не подойдет, там другие формулы для расчета давления и температуры.

  6. Добрый день. Собрал этот прибор работает хорошо. Но есть одна проблема, купив два датчика ВМР180 китайского производства, обнаружил что у них большой разброс по показаниям и они занижают фактическое значение на несколько цифр. Нельзя ли в прошивку внести изменение, чтобы можно было корректировать значение показаний, например забить некоторую цифру к которой и будет прибавляться данные датчика. Это было бы очень здорово. С уважением В. М. Андреев.

    • Расположение выводов может быть разным, точно не помню, но название и назначение одинаковые.

  7. Сейчас собрал на макетке, всё работает. Надо откопать ещё индикатор от 3310 попробовать с крупным шрифтом. Отличный компактный приборчик получится. Ещё бы кнопку с таймером включения на 5-10 секунд добавить в программу.

  8. Помогите победить с формулами вычислений для BMP280. Ассемблер, PIC16F628A Инициализция, настройка регистров F4 & F5 сделана. Калибровочные с 88 по А1 сохраняются, считывание c F7 по FC происходит, сохраняю всё в регистрах. А вот дальше затык…

  9. Здравствуйте. Можно ли к шине i2c прикрутить второй датчик для сравения давлений, скажем в канале вентиляции? Если да то можно в кратце какие изменения необходимо сделать в исходнике (как считывать показания двух датчиков по шине i2c, выводить на экран). Хочу сделать сравнение показаний давлений и при разнице включать сигнализацию реле. Спасибо.

    • Здравствуйте, к одной и той же шине нельзя подключить 2 датчика, потому что они имеют одинаковый фиксированный адрес (будет коллизия). Можно просто подключить второй датчик к другим линиям микроконтроллера, и использовать одни и те же подпрограммы для считывания данных.

      Надо вносить правки в код, по изменениям пока не могу сказать конкретно.

  10. Поправьте, если ошибаюсь, но думаю, что в расчёте давления:
    pdel_k1 call multiply ;умножение (UP-B3) * (50000 >> oss)
    btfsc REGB3,7
    goto rash_P1
    // REGB3,7 следует заменить на REGA,7 , т.к. результат умножения B7 находится в REGA

    • Приветствую, да действительно ошибка, я поправил файлы, спасибо за наблюдательность)

    • Один из посетителей сайта прислал версию печатной платы, можно скачать в конце статьи.

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

    • Без датчика на экране должно высветится три тире (—), и включится светодиод ошибки HL1 протокола I2C.

  11. огромное спасибо за исходник – задумал прикрутить BMP-180 к существующей конструкции и тоже пишу на асме. Посмотрел расчеты, стало грустновато… а тут вот оно! правда пик чуть другой – 876, но это уже не вопрос, тем паче модуль I2C на борту есть – бери готовые процедуры и делай! Вроде как все что касается BMP во вставке здесь? Посмотрел пока очень бегло .

    • Приветствую! код приведенный в статье содержит все расчеты по вычислению давления и температуры, кроме подпрограмм интерфейса I2C, и дисплея Nokia 5110, полный код можно скачать в конце статьи.

  12. Добрый день!
    “содержит все расчеты по вычислению давления и температуры” и чтение параметров из BMP180?
    “кроме подпрограмм интерфейса I2C, и дисплея Nokia 5110” I2C у меня аппаратный, дисплей – двухстрочник, так что это не нужно

  13. в процедурах vivod_tem, vivod_p ,viv_p_mm получим числа в формате 0х31, 0х32 и т.д. , т.е. в таблице ascii символов – далее у вас идут преобразования именно для вашего LCD – я правильно понял? На двухстрочник мне нужно именно ascii символы, т.е. я могу просто из этих процедур выводить данные, или тут есть подводный камень?

    • В подпрограммах vivod_tem, vivod_p ,viv_p_mm выполняется преобразование двоично-десятичного числа находящегося в регистрах DIGIT1-DIGIT10 в ASCII символы (путем прибавления числа 48 для каждого разряда), и вывод на дисплей. Но полученные ASCII символы не сохраняются. Сохраняется только двоично-десятичное число в регистрах DIGIT1-DIGIT10.

      Температура и давление рассчитываются в подпрограмме rash_T_P, затем последовательно выводятся на дисплей, сначала температура преобразуется из десятичного числа в двоично-десятичное в подпрограмме bin2dec, затем в подпрограмме vivod_temp преобразуется в ASCII и выводится на дисплей. Далее таким же способом давление.

  14. после долгих танцев с бубном вокруг этой конструкции получил
    1. Питание от аккумулятора – прибор работает круглые сутки, меня больше интересует как меняется давление в течении суток – рыбалка
    2. график изменения давления за сутки (см п. 1)
    3. естно проц пришлось заменить – 628-й забит под завязку
    3. мелкие изменения типа –
    err_1 bsf led ;ошибка: включить светодиод led
    goto err_1 ;переход на метку err_1: за
    зависание не годится для эсплуатации
    получился вроде и не плохой прибор, единственно поленился поставить точку после 3-го знака паскалей. Если есть у кого интерес могу прислать программу, схему, плату хотя повторять чужую плату не есть хорошо – найти такие же элементы не всегда получится.
    Выполнено на синем дисплее – такая вот интересность – на дисплее надпись – 3V-5V! Не стал пробовать т.к. следов какого либо стабилизатора не обнаружил на плате. Может есть у кого-то опыт?

  15. Добрый день,админ.Можно ли получить уточненный HEX-файл с десятичной точкой в строке гПа и второй вопрос- имеется ли прошивка для схемы подключения pic-контроллера к модулю MAX7219 с 8 светодиодными индикаторами?

  16. А у меня дисплей (nokia 5110 на синей платке), заливает черным, реально получилось все ок при питании 2,6 вольта, как бы отрегулировать контрастность дисплея ?

    • Надо поменять значение в строке программы:

      movlw 0xC1 ;установка контрастности (напряжение Vop) 6,42В (0хB8)
      call sendispcom

      Затем заново откомпилировать программу.

  17. Где в расчёте и в программе используются калибровочные коэффициенты MB_LL, MB_LH ?

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

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