Сравнение бюджетных термо-сенсоров (датчиков) BMP180, BMP280, AM2320, DS18B20 - первые шаги в Ардуино.

Приветствую, народ. В предыдущей статье я сравнивал GSM-термостаты и упомянул самодельный проект на Arduino. Ну и запала мне в душу эта идея, решил заняться изучением. Хотя в программировании микроконтроллеров я полный ноль, да и в электронике не спец (хотя основы все же знаю), решил не задерживаться на уроках с включением и выключением лампочек, а сразу изучать и делать что-нибудь полезное в быту — благо, платформа Arduino древняя и популярная, и в инете полно уже готовых библиотек и примеров для всех возможных модулей и датчиков. Наверное, многие, начинающие изучать Arduino, в качестве первого полезного проекта выбирают термометр или домашнюю метеостанцию, ну и мне такая задумка показалась по душе. Купил несколько разных термосенсоров и решил заодно сравнить, с каким из них в будущем есть смысл работать, а от каких стоит держаться подальше.

DS18B20 — довольно популярный датчик температуры. Диапазон от -55 до +125 градусов, погрешность +/-0.5 градусов. Цена 50 рублей за голый сенсор или 100 рублей за готовый модуль.

BMP180 GY-68 — барометр, совмещенный с датчиком температуры.  Диапазон от -40 до +85. Цена 90 рублей.

BMP280 — барометр (новая версия), совмещенный с датчиком температуры и высотомер.  Диапазон от -40 до +85. Цена 100 рублей.

AM2320 — Датчик температуры и влажности. Диапазон от -40 до 80. Цена 190 рублей.

Это самые дешевые. DHT-11 — это классика, но как раз его я покупать не стал. Причина — несерьезный диапазон измеряемых температур 0-50 градусов. Цена 100 рублей за модуль. То же можно сказать и про AMT1001 (температура + влажность)  — диапазон от 0 до 60 градусов при цене 160 рублей. Хотя и им можно найти применение в домашних условиях, но, поскольку я в перспективе хочу собрать термостат для дачи, которая может замерзнуть, то возможность работы с отрицательными температурами считаю необходимостью, в связи с чем данные модели мне не подходят.

Итак, чтобы не ездить в магазин каждый раз, когда понадобится 1 резистор, я закупился сразу оптом, набрав того, что теоретически может пригодится при изучении Arduino. Стартовые комплекты со «всем необходимым» покупать не стал — посчитал, если покупать  все детали по отдельности  — выходит значительно дешевле. В российских магазинах цены на стартовые комплекты вообще неадекватные — 3-5 тысяч за несколько компонентов, которые едва тянут на одну-две тысячи, если покупать их отдельно в тех же магазинах. Очевидный плюс покупки деталей по отдельности в том, что можно сосредоточиться именно на том, что интересно. В частности, моторы и сервоприводы мне пока не интересны, я их и не покупал. На алиэкспрессе, конечно, можно было сэкономить, но потерять 3-6 недель на доставку, так что решил брать в России. Важно заметить, что в некоторых российских магазинах цены на некоторые модули Arduino в 3-4 раза выше, чем в других магазинах, так что важно сравнивать цены и правильно выбирать магазин. Рекламы я тут не делаю, но два магазина в полной мере удовлетворили мои потребности (75 предметов). По расходам, прикинул, вышло, конечно, дороже, чем при заказе из Китая, но уже через 3 дня всё, что нужно для начала обучения и экспериментов, было у меня с бесплатной доставкой СДЭК-ом. Китайцы тоже не дураки, и в одном магазине, где что-то дешевле, чем у других, могут продавать иные товары дороже, чем у других. Например, я присмотрел самый дешевый понравившийся мне стартовый набор на али примерно за 1300 рублей, решил заказать к нему кое-каких дополнений у того же продавца, чтобы всё пришло в одной посылке сразу (релюхи, gsm модем и т.д.), но в русском интернет магазине нашел те же самые товары даже дешевле! В результате, чтобы реально сильно сэкономить на али, нужно каждый предмет заказывать у разных продавцов, где он продается дешевле, чем у других, и ожидать несколько десятков посылок, приходящих в разные дни в течение 1-2 месяцев (да еще и потерять что-то могут по пути). Поскольку мне не совсем удобно каждый день ходить на почту, да и уже не терпелось начать обучение, я решил не связываться на этот раз с Китаем и купить все у нас подороже, но быстро.

По сравнению цен. MicroUSB UNO R3 купил за 310 рублей, точно такой же на али 268 рублей + 230 рублей за доставку (не знаю почему, но на момент написания статьи у многих товаров на али с бесплатной или дешевой доставкой почему-то добавилась ощутимая стоимость доставки). Вообще, самые дешевые клоны Arduino Uno R3 продают на алиэкспрессе от 230 рублей за штуку (с доставкой). Data logger shield я купил за 155 рублей, на али самый дешевый такой 113 рублей. Инфракрасный пульт управления с приемником у нас 90 рублей, на али такой же 48 рублей. LCD keypad shield купил за 200 рублей, на али такой же 145 рублей. BMP180 у нас 90 рублей, на али 41 рубль. Это я привел наименьшие цены на момент написания обзора, можно найти то же самое и в 10 раз дороже. То есть, если заказывать самое дешевое в Китае, можно купить необходимое в 1.5-2 раза дешевле, чем в России.

Начинающим изучать Ардуино, кому надо срочно, могу посоветовать такой план действий: купить в России любую дешевую плату, совместимую с Uno R3 (280 рублей), breadboard (доска для беспаячного соединения 80 рублей — маленькая, 100 рублей — в два раза больше), несколько резисторов 10 КОм, 1 КОм, 220 Ом (10-20 рублей), несколько светодиодов разных цветов или один трехцветный светодиод (10-20 рублей), экран I2C по вкусу (от 190 рублей), кнопку (5 рублей), пару датчиков по вкусу (например, датчик температуры 90 рублей). Если денег не жалко, добавьте IR пульт с приемником для создания интерактивности (90 рублей), пищалку (20 рублей), модуль часов (60 рублей). Этого будет достаточно, чтобы понять принципы работы всего этого и решить, интересно вам это или нет. Если почувствуете, что это не ваше, сделаете из этого хлама хотя бы домашнюю метеостанцию за 500-700 рублей и на этом успокоитесь, а если понравится, закажете дополнительно компонентов из Китая, а, пока будете ждать, почитаете умных книжек, чтобы, когда придут все делати, знать уже, что с ними делать. Чего, на мой взгляд, не стоит покупать сразу для обучения, так это цифровую клавиатуру (требует много пинов для подключения и управление в программе более замудренное, чем через ИК-пульт), дисплеи SPI (занимают много пинов и сложнее в коде), всякие шилды (в начальном обучении от них толку не будет).

Описание самопальной метеостанции с логгером.

Описывать особо тут нечего. Цель была проста: потренироваться в сборке, проверить все купленные датчики и научиться снимать с них информацию одновременно, выводить на экран и записывать на SD карту в виде лога (с указанием времени). В принципе, ничего сложного здесь нет — читай мануал, соединяй провода как написано. За время сборки произошло только два примечательных момента, на которых хочется остановиться.

Первый: я спалил датчик газа MQ-9. Скорее всего, перепутал провода + и — по недосмотру, в результате вся плата вырубилась, но после отключения датчика снова заработала. Мне повезло, ничего кроме этого датчика не пострадало, видимо, на плате имеется защита от дурака. Сам же датчик стал вызывать короткое замыкание даже при правильном подключении.  Сопротивление между VCC и GND = 2 ом. Если кто знает, как вернуть его в строй — пишите  в комментах. Цена датчика, к слову, 120 рублей, не сильно обидно, но жаль, что вещица не успела послужить. Вывод: проверяйте все соединения по два раза, прежде чем подавать питание на прибор!

Второй: я подключил к 5 вольтам модуль BMP180, рассчитанный на 3.3 вольт. Причиной тому была не моя невнимательность, а наглая дезинформация на сайте, где была опубликована схема подключения. Модуль проработал на 5 вольтах несколько часов, пока я не пересмотрел его спецификации для написания этой статьи. Удивительно, но модуль не был поврежден. К счастью, перекинуть питание с 5 вольт на 3.3 вольта  — дело несложное. Датчик все еще в строю. Возможно, причиной путаницы является то, что есть несколько вариантов этого модуля. Модули с четырьмя выводами имеют питание только 3.3 вольта, модули с пятью выводами имеют питание 3.3 вольта либо 5 вольт. Вывод: хотя в интернете много полезной информации от любителей, внимательно читайте спецификации от производителя именно на ваш модуль (т.н. «даташит», datasheet), так как китайцы наплодили кучу вариаций, и многие из них не совместимы ни по питанию, ни по порядку выводов на плате.

Принцип работы метеостанции.

Примерно 1-2 раза в секунду Arduino UNO (в моем случае, китайский фейк с Micro-USB коннектором за 310 рублей!) выводит на LCD-экран 20×4 следующие данные: дату и время с DS1307 (встроен в Data Logger Shield XD204), давление P и температуру T с BMP180, влажность H и температуру T2 с AM2320, два значения температуры T3 с двух датчиков DS18B20, ну и в качестве бонуса уровень освещенности L в процентах (0= темно, 100= светло) с модуля датчика освещенности LM393. Для метеостанции последнее не сильно надо, но поскольку это учебный девайс, то и навесил все, что было. А вот датчик газа MQ-9, к сожалению, не дожил до момента испытаний… При каждом считывании моргает зеленый светодиод. Кроме вывода на экран, каждые 10 секунд данные записываются на SD карту через Data Logger Shield XD204 в формате CSV для удобного анализа в Excel. В момент записи светодиод моргает красным цветом (тоже не сильно нужно в повседневной жизни, но для учебы — то, что надо).

Короче, вот что в итоге вышло (видео на youtube):

Ну и, собственно, цель написания статьи — сравнение четырех термодатчиков, которые в момент теста были расположены рядом друг с другом. Для теста использовался температурный перепад с +22 до -1 градуса и обратно (выполнен в виде моментального вынесения сборки из дома на улицу с последующим моментальным возвратом обратно). Спиртовой термометр показывал в момент теста примерно -1.1 градуса на улице. Можно кликнуть на график для увеличения.

Желающие более детально изучить тенденции и расхождения датчиков, могут скачать полный CSV-лог. Данные идут в следующем порядке: Дата, Время, Давление, Влажность, Свет, T1=BMP180, T2=AM2320, T3/1=DS18B20, T3/2=DS18B20.

Изучив данные из лога и график, каждый сам сделает выводы о пригодности тех или иных датчиков в своих проектах. Коротко можно сказать, что BMP180 наиболее быстро реагирует на изменение температуры окружающей среды. До отметки 0 градусов датчик добрался примерно за 9 минут. Второе место по скорострельности получили датчики DS18B20 — они успели в среднем за 17 минут, причем из двух датчиков один добрался до нулевой отметки почти на полторы минуты позже второго, хоть они и находились менее чем в сантиметре друг от друга. Ну и завершил гонку AM2320 — эта черепаха доползла до нулевой отметки за 28 минут. Примечательно, также, что никто, кроме BMP180, так и не добрался до отметки -1 градус.

В тесте на нагрев все датчики показали примерно схожие результаты, но победителей можно рассортировать в той же последовательности, что и в предыдущем тесте. Нагрев происходил медленнее, но равномернее, чем охлаждение. Возможно, замороженная плата, на которой были расположены датчики, слегка задерживала их отогревание. Если не высчитывать секунды, то можно сказать, что для отогрева сенсорам понадобилось около 30 минут. До отметки 21 градус первым добрался BMP180 примерно за 14 минут, далее DS18B20 за 16 минут, и AM2320 за 20 минут.

В любом случае, результаты всех датчиков весьма впечатляют, если сравнивать их с «готовыми» метеостанциями, которые проходят тот же тест не меньше чем за 1-2 часа, что я показал в обзорах домашних метеостанций Oregon Scientific и Ea2 ранее.

Выводы.

Короче, по показателям быстроты определения изменения температуры BMP180 мне определенно нравится больше. Показания температуры наиболее приближены к показаниям спиртового термометра. В монтаже непривередлив — вешается на I2C (стандартные пины A5-A6), лишних пинов не занимает. По простоте использования в программе мне он тоже симпатичен. Цена доступная.

DS18B20 неплох как запасной вариант, но код для получения данных с него более нагроможденный, да и технически он вешается на 1-wire, что требует выделения дополнительного пина. Серьезный недостаток этого датчика в том, что снятие с него данных тормозит выполнение дальнейших команд. В частности, при точности 0.5 градусов задержка 93,75 мс, при точности 0.25 градусов задержка 187,5 мс, при точности 0.125 градусов задержка 375 мс. Также не ясно, зачем нужно выставлять высокую точность, если она все равно в реальности не реализуется. В моем тесте два датчика снимали данные с максимальной точностью (12 разрядов), и все равно в логе можно видеть расхождения 0.2 градуса и может больше (лень выискивать). То есть можете смело ставить точность не более 11 разрядов (0.125 градуса) и не забивать себе мозги обещанными 0.0625 градусами на 12-разрядной точности. Был у меня и еще один глюк: изначально при последовательном обращении к двум датчикам в том виде, как это сделано в примере, идущим в комплекте с библиотекой, второй датчик иногда отваливался и показывал 127 или -127 градусов, загаживая мне лог. Вылечил я это методом проб и ошибок — поставил между запросами к датчикам дополнительную задержку в несколько сотен миллисекунд, и в этом тесте второй датчик уже ни разу не отваливался. Ну и притянутый за уши недостаток DS18B20 может быть в том, что кроме температуры он ничего определять не умеет, в отличие от двух других датчиков, участвующих в обзоре, так что датчики влажности и давления придется докупать отдельно (если, конечно, они будут нужны в вашем проекте). При всех недостатках, мизерная цена и относительная точность и быстрота являются определенно теми достоинствами, которые заставят вас обратить внимание на этот датчик температуры.

Что касается AM2320, я бы не стал использовать его в качестве основного датчика температуры там, где нужно отслеживать быстрые колебания температур. Не знаю, то ли датчик тормознутый, то ли пластиковый корпус мешает активному обдуванию воздухом, но работает он определенно неспешно. Но как резервный датчик температуры, идущий в виде бонуса к датчику влажности, данный девайс можно использовать в случаях, когда резких скачков температуры не предвидится. Тем не менее, это самый дорогой датчик в этом обзоре — цена в 2 раза выше, чем у остальных, так что я ожидал от него более впечатляющих результатов, но после этого теста весьма разочаровался. Вопросами выяснения точности гигрометра я не занимался.

ДОПОЛНЕНИЕ 2019-03-15.

В связи с покупкой новых датчиков температуры, решил сделать новые тесты. Для этого собрал новый логгер.

Все датчики размещались на одной высоте, вблизи друг от друга (в окружности 5 см). Поскольку особый интерес вызывал новый BMP280, я расположил его вплотную к BMP180, чипами в одну сторону. Также впервые участвовали в тесте отдельный датчик Dallas (без модуля), и еще один герметичный датчик Dallas для измерения температуры жидкостей (куплены в другом месте и в другое время, чем те, что выполнены в виде модулей). Остальные датчики – из предыдущего теста, всего их было 7 штук.

Для начала нужно было определить, какую температуру считать эталонной. Собрав все имеющиеся термометры в кучу (в том числе от метеостанций и спиртовой термометр), и понаблюдав за их показаниями в течение продолжительного времени, я пришел к выводу, что два датчика Dallas в виде модулей наиболее корректно показывают температуру. Теперь нужно было выяснить расхождение остальных датчиков с эталонными. Для этого весь логгер поместил в пластиковый контейнер, закрыл его крышкой и дополнительно убрал в шкаф, чтобы исключить влияние случайных потоков воздуха. Через полтора часа я вынул логгер и получил такой результат (показаны последние 30 минут):

Результат теста меня удивил и опечалил. Разброс температуры от 20.69 до 22.45, то есть 1.76 градуса, притом, что температура всех датчиков за полтора часа в закрытом защищенном пространстве явно выровнялась. Даже «эталонные» датчики имели расхождения. Зато BMP180 в течение всего теста сохранял постоянное значение, хотя и самое низкое из всех. Я даже сначала подумал, что он завис, но нет, и до, и после теста температура менялась. А вот «улучшенный» BMP280 совсем опечалил, его показания сильно превышали не только «эталонные», но даже средние со всех имеющихся у меня термометров.

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

CSV файл для гиков: 20190315_041934.csv
Формат: дата, время, AM_temp, DS-Mod1, DS-Mod2, DS-Sep, DS-Liq, BMP180, BMP280, BMP180_pressure, BMP280_pressure, AM_hum.

Этот тест показал две странные вещи. Во-первых, в комнате отдельный Dallas был типичным середнячком, а на морозе весьма сильно замерз – заметно сильнее других. По скорости тут все понятно – хорошая «обдуваемость» имеет значение. Датчики, напаянные на платы, хотя бы частично защищены от ветра, да и сами платы имеют некоторый запас тепла или холода, который постепенно передают датчику, а у отдельно «висящего» на проводах датчика наилучший контакт с окружающим воздухом, поэтому он быстрее реагирует на резкие изменения температуры. Однако это не объясняет, почему он так сильно «замерз» по сравнению с другими. Во-вторых, BMP280 – это какое-то разочарование. Хотя он и находился вплотную к BMP180, но на изменение температуры реагировал даже медленнее, чем самый тормознутый AM2320. Что с ним не так – я не знаю, обидно, что в Интернете его рекламируют как «улучшенную» версию предшественника, но на деле оказывается, что и температуру сильно врет, и ее изменения замечает весьма медленно.

Относительно измерений давления. Тут не всё однозначно, так как два датчика показывают различное давление, и даже тенденции его изменения различны. Например, в 4:30 логгер вынесли из дома на улицу. Давление резко подскочило вверх у обоих датчиков, но у BMP280 оно сразу начало падать, а у BMP180 наоборот – продолжило расти. В 5:34 логгер вернули домой. У BMP280 давление резко начало расти, а у BMP180 – сразу резко упало и продолжило падать.

Кто из них врет – я не могу сказать, не имея действительно правильного откалиброванного барометра, но ясно, что у одного из них или у обоих наблюдается нездоровая зависимость изменения давления от температуры окружающей среды. Для любопытствующих. Есть сайт с архивом данных на метеостанциях в ближайших городах. Для моей местности указано 749.2 мм.рт.ст в 6 часов утра тестового дня. Находим значения в файле логгера за это время. BMP180 показал 750.6 мм.рт.ст., а BMP280 показал 751.9. Похоже, дешевенький старичок оказался ближе к реальности. Вроде бы их можно калибровать, но я пока этим не занимался.

Для новых тестов я оттопырил датчики Dallas, припаянные к модулям, чтобы улучшить их «обдуваемость» (заранее скажу, что после этого, как и ожидалось, скорость реакции стала сравнима с «голым» датчиком Dallas). Далее я провел еще несколько тестов, например с террасы в морозильник, а из морозильника в теплую комнату (длительность теста — 8 часов):

Чтобы не превращать статью в полное занудство, привожу лишь таблицу с наиболее интересными результатами:

Я взял Dallas-M2 как «условно-эталонный», просто чтобы от чего-то отталкиваться. Проблемы появляются сразу же, как мы захотим привести все датчики к одной температуре. Так, если взять AM2320, то для вычисления эталонной температуры при -20, нужно вычесть из его показаний -0.9 градуса, при температуре около +4 градусов — прибавить 0.3 градуса, а при температуре около +20 градусов — прибавить 0.6 градусов. Таким образом, нет линейной зависимости, и исправить его показания простым прибавлением или вычитанием числа в программе уже не получится. Та же ситуация с BMP280 — при -20 градусах он завышает температуру на 0.5 градусов, при +4 градусах — на 0.76 градусов, а при +20 градусах — примерно на  1 градус. Зато BMP 180 по линейности показаний примерно соответствует датчикам даллас — показания просто занижены примерно на 0.77 градусов на всем проверенном диапазоне температур. Разница температур у различных экземпляров датчиков Dallas составила до 0.9 градуса.  Конечно, приведенные цифры актуальны только для моих образцов, их нельзя применять в Ваших программах для корректировки. Я привел эти данные лишь для того, чтобы показать, что, если Вам важны правильные показания температуры, никакой бюджетный датчик температуры нельзя использовать без предварительного сравнения с неким эталонным датчиком, который Вы считаете точным, чтобы выяснить его отклонения от нормы при разных температурах окружающей среды и заложить индивидуальную компенсацию для каждого используемого датчика в программе для Вашего устройства.

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

  • Счастлив тот, у кого только один термометр, даже если он неправильный. Когда не с чем сравнивать – не паришься.
  • Звучит нелепо, но, имея даже штук 15 цифровых и аналоговых термометров в доме (самодельных и купленных в виде готового товара), я понятия не имею, какая же в действительности температура. Расхождение между их показаниями слишком велико, и есть «изгои», дающие слишком заниженные или завышенные значения, что даже среднее из всех этих показаний было бы неверно считать правильным. За «условно-эталонное» я взял то, к которому были ближе наибольшее количество термометров разных производителей.
  • Даже найдя «эталонные» образцы для комнатной температуры, нельзя быть уверенным, что они сохранят свою эталонность при отрицательных температурах или высоких температурах (например, в +40 градусов).
  • Все четыре хваленых датчика Dallas DS18B20 показывают разные значения, причем расхождения у них существенные, и скорость реакции на изменение температуры у них весьма различается в зависимости от метода крепления к изделию. Если нужна быстрая реакция на изменение температуры (чтобы реагировал на любой порыв ветра или на дыхание) – выносите его подальше от платы или из корпуса изделия. Если нужны более стабильные, но замедленные данные, припаивайте на плату или закрывайте чем-нибудь.
  • AM2320 – это шлак как термометр, хотя бы даже из-за нелинейности показаний. На счет измерения влажности – не знаю – не с чем сравнивать. Нужен профессиональный гигрометр, а те, что есть в домашней метеостанции – такой же бесполезный шлак, который врет и не краснеет.
  • BMP280 сильно завышает температуру, а по линейности показаний не соответствует датчикам Dallas, в отличие от BMP180, который, кроме того, значительно быстрее улавливает изменение температуры. Показания давления у них сильно разнятся.

Резюме. Думаю, сейчас Dallas DS18B20 кажется мне лучшим соотношением цена/качество, при условии, что его можно сравнить с неким «эталонным» термометром и внести коррективы в показания программным путем (для каждого экземпляра датчика корректировка будет своя). Если не глядя (без калибровки) впаивать датчики DS18B20 в приборы, разница показаний между ними может быть более одного градуса, что не очень радует. Даже при постоянной температуре DS18B20 изобилуют постоянными скачками показаний. Если это неприемлемо, и нет желания заниматься усреднениями показаний за некоторый промежуток времени, можно взять BMP180, у которого скачков при постоянной температуре не наблюдается совсем. BMP180 остается вполне достойным выбором, во многих случаях, может даже идеальным для своей цены, особенно, если требуется измерять не только температуру, но и давление. Что касается BMP280, он меня разочаровал (может не очень качественный образец попался — утверждать ничего не буду, но графики я показал). Учитывайте, что показания термометров BMP (всех моделей) не всегда точны и требуют сравнения с эталонным термометром и корректировки программным путем (некоторые сообщали о различиях 1-3 градуса в показаниях этих датчиков).

Ну вот, свое дилетансткое мнение я высказал, основываясь исключительно на практических изысканиях. Если есть что добавить или исправить — пишите в комментах.

Коментарий сюда