Когда речь идет об измерении температуры несколькими датчиками, простое большинство определяет истину. Семь датчиков показывают температуру 25…26 °С, один – около 23…24 °С. Вывод напрашивается сам собой – истинная температура 25,5 °С, а восьмой датчик даёт ложные значения.  На рисунке 1 показаны результаты измерения комнатной температуры несколькими аналоговыми и цифровыми датчиками. Характеристики первых рассмотрены в статье «Сравнение датчиков температуры. Часть 1, аналоговые», характеристики вторых в статье «Сравнение датчиков температуры. Часть 2, цифровые». В этой публикации собраны результаты. Итак, изначальная задумка – собрать разные датчики и подключить к одному микроконтроллеру. Затем нужно вывести результаты измерений на график, посмотреть, что получится. Сбором показаний будет заниматься отладочная плата на базе STM32G030F6P6. Три датчика (AHT20, STLM75, BME280) вешаем на шину I2C, один (MAX6675) на SPI, один (DS18B20) на UART, остальное подключено к аналоговым входам. Прелесть выбранного контроллера в том, что все необходимые интерфейсы не пересекаются между собой. Более того, из семнадцати GPIO шесть остались свободны, так что есть потенциал для расширения. Передачей данных на ПК занимается USB-UART преобразователь FT232RL. Общая схема подключения показана на рисунке 2.  При монтаже схемы может потребоваться навык вязания крючком. Длинные провода, отсутствие общего полигона земли и слабая фильтрация питания – это всё источники вносимых погрешностей. На фото показано размещение датчиков на макетной плате.  Последний этап приготовлений – терминал для вывода результатов. Здесь на помощь приходят PyQt5, QtSerialPort и pyqtgraph. Даже обладая минимальными знаниями на Python, можно написать небольшое приложение под текущую задачу. Но и переоценивать простоту языка не следует, для разбора данных с последовательного порта потребовался дополнительный поток. Так что приложение на вечер превратилось в приложение на неделю. Здорово помог курс по PyQt5 и QtDesigner, радует обилие готовых проектов на GitHub. Так или иначе терминал заработал, первый эксперимент по измерению комнатной температуры был показан на рисунке 1. Теперь можно заняться более интересными опытами.  Допустим летним утром вы открываете окно комнаты, чтобы прохладный свежий воздух заполнил помещение. Легкий ветерок колышет шторы, и вы радуетесь тому, что удаётся немного охладиться, развеять духоту. Но действительно ли утренний ветерок холодный? Взгляните на рисунок 4.  Датчики MF52 и MAX6675 (термопара), самые маленькие по размеру, т.е. имеют наименьшую теплоемкость. Именно они лучше всего отреагировали на небольшие притоки теплого воздуха с улицы. Можно сказать, что на графике видны дуновения ветра, во время которых происходит рост температуры, затем датчики возвращается к исходным показаниям. В данном случае свежий ветер ощущается как прохладный, но на самом деле он повышает общую температуру в комнате.  «Ты, без платья, налегке, Искупайся в молоке, Тут побудь в воде вареной, А потом еще в студеной, И скажу тебе, отец, Будешь знатный молодец!» Чтобы оценить скорость реакции датчиков на изменение температуры и работу на морозе, открытой форточки явно недостаточно, нужны более радикальные меры. Из домашнего инвентаря морозильная камера хорошо подходит для обозначенной цели. Взгляните на следующий рисунок. Как и в предыдущий раз датчики с наименьшей теплоёмкостью быстрее всех отреагировали на изменение температуры. MF52 поменял показания с +20 °С до -10 °С приблизительно за 30 секунд. Тем временем термопара дошла до порогового 0 °С, а AHT20 и вовсе «отвалился». Оставшиеся в живых датчики приблизились к правдивым показаниям спустя две минуты.  Кратковременный сброс питания реанимировал AHT20, но не надолго. С чем связано подобное поведение для меня останется загадкой. Проблемы могут крыться как в самом чипе, так и в плохих контактах макетной платы или проблемами обмена шины I2C. Эксперимент с охлаждением впоследствии был повторен и AHT20 засбоил при температуре -3,2 °С. В сравнении с комнатной температурой для остальных датчиков вырос разброс показаний, LM335M судя по всему завышает значения, STM32G0 – занижает. Оцениваю, вновь, по мнению большинства.  С отрицательными температурами теперь все более-менее понятно, а как насчет температур положительных? На помощь приходит другой неотъемлемый реквизит кухонного оборудования – газовая духовка. Но с поддержанием стабильной температуры здесь все немного сложнее, после включения нагрева температура нарастает довольно резко, создаётся риск измерить не температуру, а количество выживших устройств. Поэтому спустя 5…6 секунд пламя пришлось погасить. На начальный участок графика рисунка 7 не стоит обращать внимания, это инициализация массива начальными значениями.  Цифровые датчики, как всегда, отреагировали на изменение температуры с некоторой задержкой, их характеристика более плавная. Судя по всему, внутри микросхемы имеется механизм фильтрации показаний. Спустя две минуты температура начала постепенной падать, в некотором приближении можно зафиксировать стабилизацию процесса.  Теперь LM335M показывает заниженные результаты, ошибка от общего мнения больше 4..5 °С. Полученный результат радует, т.к. говорит о симметричности отклонений относительно нуля, ошибку легко исправить изменив значение углового коэффициента теоретически рассчитанной прямой. Цифровые датчики ведут себя достойно, единодушно объявив о нагреве до  55 °С.  Мир настолько сложен, что мы вынуждены его упрощать, для понимания заменять общими моделями. Взять, к примеру, прогноз погоды, большую часть времени он верен. Тем не менее в середине лета мне довелось попасть под дождь, хотя утром обещали солнечный день. Стоит ли ожидать точность там, где её крайне сложно достичь.  Поводом к написанию публикации послужило наблюдение: разница показаний около 1 °С двух цифровых датчиков (если быть точнее, то разница в 0,7 °С двух датчиков: 29,1 °С от DS18B20 и 29,8 °С от SHT4). В комментариях предшествующих публикаций коллеги высказывали возможные причины такого расхождения. Почти наверняка используемый DS18B20 контрафактный, датчик приобретен в Поднебесной и находится внутри металлической гильзы. Но вряд ли это стало определяющим фактором. Я нашел оригинальный DS18B20 2008 года выпуска на завалявшейся старой плате (благодарю @vau за полезную методику), разница показаний с тем, что приобретен на Али около 0,3 °С. Вероятно причин больше: потоки воздуха с окна или кулера ноутбука, теплоёмкость материала (в моём случае металлической гильзы), солнечный свет и т.п. Измерять температуру оказалось намного сложнее, чем я ожидал.  Большую часть времени датчики дают более-менее совпадающие результаты, в диапазоне 1 °С. Посмотрите, как дружно работают DS18B20, AHT20, MF52, STLM75.  Однако стоит открыть форточку, и ситуация изменится. А если поместить датчики в более жёсткие условия, от прежнего единства не останется и следа. На изменение температуры каждый датчик отреагирует по-разному и показания будут менять до тех пор, пока процесс не установится. Поэтому разница измерений в диапазоне 1 °С – это хороший результат.  Вторым неожиданным следствием публикации стал вопрос надежности самих датчиков. Когда разрабатываемое вами устройство трудится вдали от комфортной комнатной температуры а датчик установлен на самой плате, возможно лучше воспользоваться чем-то попроще. Пусть показания будут плавать и не всегда точны, зато и ломаться будет нечему. Программным фильтром легко сгладить резкие колебания считанных значений, защитив схему от ложных сигналов. При должной калибровке термистор MF52 за 7 рублей даст фору в десять раз более дорогой цифровой микросхеме.  Внимательно выбирайте датчик температуры под свои уникальные требования и задачи, надеюсь, данная публикация поспособствует это цели.   Разработка электроники