Термометр на DS18B20 и Arduino Nano. Для дома и работы

Полтора года назад* коллега по инженерству Димон попросил сделать термометр для рабочих нужд. Оказалось, что измерять околокомнатную температуру важных деталей нам просто нечем! Я взял на пробу несколько микросхем DS18B20, и после сборки макета точно понял — такому термометру работа найдётся и дома.

*Откопал черновик из июня 2019-го — не выбрасывать же?

Контроллер —  Arduino Nano. Удобно и доступно, даже не побоюсь этого слова — «изподножно».

Датчики
— две микросхемы DS18B20. Заказчик хотел именно так, потому что одну можно прислонить к детали, а второй измерять температуру помещения. Или обеими снимать показания с разных точек детали, а потом вывести среднее. Измеряемый диапазон: -55…+125 градусов Цельсия — хватит и мороз в холодильнике проверить, и нагрев ноутбука. Датчики берут питание от выводов A0 и A2 — сначала так было удобнее на время тестов, а потом прижилось. Вообще их можно подключить к пяти вольтам и «земле».

Дисплей — первый попавшийся LCD 1602 с I2C-адаптером. Отображает показания каждого датчика и третью величину: среднее значение или разницу между ними.

N. B.! I2C-адаптеры собраны на микросхеме PCF8574 или PCF8574A. Они отличаются диапазоном адресов: по умолчанию 0x27 для PCF8574 и 0x3F для PCF8574A. Подойдёт любая — термометр сам выбирает между этими двумя адресами. Спасибо terog с «Пикабу» за код.

Вспомогательное — резистор 4,7 кОм (R1).

Дальше наши с Димоном устройства разделились. Он собрал термометр из пяти деталей, припаявшись проводами прямо к «Нане». Я нарисовал плату и добавил кнопку, чтобы переключать режимы «среднее/разница». Её «земля» так же включается на вывод A0, но можно и на «землю» схемы.


Печатную плату делал по размеру дисплея и его I2C-адаптера, но регулировочное отверстие под потенциометр всё равно немного не совпало.

Резисторы — 0805, перемычки — 1206, конденсаторы — 0805 и 1206. Диод в SMA-корпусе. Впрочем, они с micro-USB разъёмом оказались совсем лишними — я вывел наружу разъём, который включается в «Нану», чтобы можно было с ней общаться по UART.


Включился и работает. Это ещё старая прошивка, которая показывала минус 127 градусов при отключённых датчиках. О текущей версии расскажу ниже.


Корпус оказался маловат — пришлось подпиливать плату напротив разъёма первого датчика и по-уродски выводить кабель до mini-USB штекера (он упирается в стенку, а провода под 90 градусов заворачивают вниз). На свободное место так и просится литиевый аккумулятор с зарядным устройством и «повышайкой». Димон по итогу так и сделал со своим термометром, я же питаюсь от USB.

Разъём питания и связи с ПК — M12 4-pin

Разъём для датчика — M12 3-pin

Кнопка с подсветкой — GQ12H

О работе прибора

N. B.! Гальваноразвязки, защиты от переполюсовки или превышения питающего напряжения нет. Одна моя «Нана» уже вкусила 24 вольта по входному разъёму, и больше температуру не измеряла.


При включении термометр мигает светодиодом в кнопке, показывая пользователю, сколько датчиков подключено. Два мигания — два датчика. Одно — работа с одним датчиком по упрощённому алгоритму, без вывода среднего значения или разницы. Нет датчиков — индикатор светится постоянно, а на дисплее висит надпись «Подключи и перезагрузи». Все стыковки-расстыковки надо делать на выключенном устройстве — программа не поддерживает горячей замены датчиков. Это происходит потому, что у каждой DS18B20 есть уникальный серийный номер. Термометр ищет датчики только при включении, а затем сортирует их по возрастанию номеров. Поэтому неважно, какой датчик в какой из двух разъёмов подключать — первым будет всегда более ранний серийный номер. Я своим сделал пометки красной и зелёной «термоусадкой», и уже знаю, что первый — это красный.

Дисплей, помимо температуры с обоих датчиков, показывает среднее их значение или разницу. Режимы «среднее/дельта» переключаются умеренно долгим нажатием кнопки, а очень долгое нажатие включает-выключает подсветку дисплея. Может быть полезно, если надо оставить термометр на ночь, но не хочется, чтобы он светил в глаза.


Ещё термометр отправляет в COM-порт температуру по каждому датчику, среднюю и разницу. Причём его можно подключить не только к компьютеру, но и к телефону — через OTG-кабель.

Сфера применения устройства довольно широка:

  • узнать нагрев микросхемы очередной «понижайки» с Алиэкспресса;
  • проверить точность термометра-гигрометра с «Алиэкспресса»;
  • убедиться, что холодильник на съёмной квартире приказал долго жить, и внутри постоянно плюс девять;
  • узнать, какую температуру даёт строительный фен на минимальном положении регулятора;
  • подключить герметичный датчик на основе DS18B20, чтобы измерять температуру воды в детской ванне;
  • многое, многое другое.

Дополнение от 31.10.20


Немного обновил прошивку: кнопка больше не тупит, поэтому режимы «среднее/дельта» переключаются по короткому нажатию. Индикаторы датчиков сделал более наглядными. В скетче появилась закомментированная строка:

//#define REQUEST_PERIOD 2000

С её помощью задаётся период опроса датчиков и вывода температуры на экран и в UART. Когда строка закомментирована, то период определяется библиотечным минимумом 750 мс. Если вам не хочется, чтобы цифры часто мельтешили, ставьте 2000 или 5000 мс.

В архиве к тому же лежат уже скомпилированные файлы .hex, которые можно скормить ISP-программатору.

Скетч и прошивки в .hex

Печатная плата в формате .lay6

Запись опубликована в рубрике Arduino, Печатные платы, Электроника. Добавьте в закладки постоянную ссылку.

21 отзыв на “Термометр на DS18B20 и Arduino Nano. Для дома и работы

  1. 1. Область с байтами — это нестандартные символы для дисплея. Мой не может в кириллицу, поэтому byte D[8], byte L[8] и byte soft[8] задают очертания букв «Д», «Л» и «Ь». byte one[8] и byte two[8] — изображения единицы и двойки в квадратике. Потом я передаю значения этих переменных в модуль инициализации дисплея: lcd.createChar(0, D) — во внутренней памяти дисплея под нулевым номером появится мой символ в виде буквы «Д». Последний шаг — вывожу на дисплей букву «Д» в нужном месте: lcd.printByte(0). Всего дисплей поддерживает до восьми пользовательских символов; удобная рисовалка. Можете в этом же стиле нарисовать 3 и 4 в квадратиках.

    2. Переключение информации — файл display.h, ищите конструкцию switch (mode). В режиме 0 показывает среднее, в режиме 1 — дельту. Функции draw_mean() и draw_delta() описаны в начале этого же файла. Можете написать свои функции и переключать их этим же switch(mode). Сама же переменная mode увеличивается на единицу по клику кнопки, смотрите if (butt1.isClick()) в файле button.h. У меня два режима, поэтому if (mode > 1) mode = 0. Так я закольцовываю «пункты меню».

    3. У вас в файле daq.h есть переменные tempC1 и tempC2, плюс наверняка вы разобрались, как добавить больше датчиков. Значит, в этом же файле можно дописать отдельную функцию типа

    if (tempC1 - 78 > 0.2) digitalWrite (13, HIGH);
    else if (tempC1 - 78 <= 0.2) digitalWrite (13, LOW);

    Это самая простая логика опроса одного датчика с сигнализацией на 13-м выводе (не забудьте ему прописать pinMode(13, OUTPUT)). Если ещё немного постараться, то можно дописать таймер, чтобы сигнал срабатывал, если температура выше уставки в течение 5 секунд — чтобы вас помехи не задалбывали, например.

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s