Термометр на Arduino и датчике температуры DS18B20

В данной статье мы рассмотрим подключение цифрового датчика температуры DS18B20 к плате Arduino Uno. Приведены схема и программа (скетч) для проекта.

Проект термометра на Arduino и датчике температуры DS18B20

Также на нашем сайте вы можете посмотреть проекты измерения температуры с помощью платы Arduino и датчиков lm35 и DHT11.

Необходимые компоненты

  1. Плата Arduino Uno (купить на AliExpress).
  2. Maxim Integrated DS18B20 Programmable Resolution (цифровой датчик температуры DS18B20) (купить на AliExpress).
  3. Резистор 4,7 кОм (купить на AliExpress).
  4. Макетная плата.
  5. Соединительные провода.

Общие принципы работы датчика температуры DS18B20

DS18B20 представляет собой однопроводный цифровой датчик температуры от компании Maxim IC. Выдает значение температуры в градусах Цельсия, способен измерять температуру с 9-12 битной точностью в диапазоне от -55 до 125 градусов Цельсия с точностью +/-0.5 градуса. Каждый датчик DS18B20 имеет 64-битный уникальный номер (Serial number), вытравленный на корпусе датчика, что позволяет подключать огромное число подобных датчиков к одной шине данных. С помощью данного датчика можно измерять температуру воздуха, жидкостей и земли. В некоторых магазинах датчик продается в комплекте с резистором сопротивлением 4,7 кОм.

Внешний вид и распиновка датчика DS18B20

Особенности датчика DS18B20:

  • однопроводный интерфейс (1-Wire® interface), что позволяет использовать для подключения датчика только один контакт микроконтроллера (в нашем случае платы Arduino Uno);
  • каждый датчик имеет 64-битный уникальный последовательный код (номер), хранящийся в ПЗУ (ROM) датчика;
  • способность подключения к одной шине множества датчиков позволяет создавать на его основе приложения для распределенного (в пространстве) измерения температуры;
  • не требует никаких внешних компонентов;
  • может быть запитан от линии данных;
  • поддерживает напряжение питания от 3.0V до 5.5V;
  • способен измерять температуру в диапазоне от –55°C до +125°C (–67°F до +257°F) с точностью ±0.5°C (в диапазоне от –10°C до +85°C);
  • можно выбрать разрешающую способность (разрешение) датчика: от 9 до 12 бит;
  • преобразует значение температуры в 12-битное цифровое слово длительностью 750 мс (max.);
  • можно настраивать энергонезависимую (nonvolatile, NV) сигнализацию (сигнал тревоги);
  • опции сигнала тревоги позволяют идентифицировать и определить адрес датчика, чья температура не соответствует запрограммированным границам;
  • может применяться в устройствах термоконтроля, промышленных системах, потребительских продуктах, термометрах и в любых других системах, где требуется измерение температуры.

Более подробную информацию о принципах работы датчика DS18B20 вы можете посмотреть в следующей статье на нашем сайте.

Схема проекта

Схема подключения датчика температуры DS18B20 к плате Arduino Uno представлена на следующем рисунке.

Схема подключения датчика температуры DS18B20 к плате Arduino Uno

Схема подключения датчика к плате Arduino достаточно проста: контакт 1 – к контакту GND Arduino, контакт 2 – к любому ее цифровому контакту (в нашем случае к контакту 2), контакт 3 – к ее контакту +5V или +3.3V. Также необходимо подключить подтягивающий (pull-up) резистор.

Исходный код программы (скетча)

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

  • 1-Wire bus;
  • Dallas Temperature (необходима для считывания и расчета температуры с датчика).

В скетче программы необходимо подключить заголовочные файлы этих библиотек.

На следующем рисунке показано тестирование работы проекта.

Тестирование работы термометра на Arduino и датчике температуры DS18B20

Источник статьи

(Проголосуй первым!)
Загрузка...
510 просмотров

Комментарии

Термометр на Arduino и датчике температуры DS18B20 — 57 комментариев

  1. Давайте сделаем для начала две кнопки - одна будет повышать какой-нибудь предел температуры, а другая - понижать. А потом будем пытаться дальше усложнять. На сколько это у меня получится при таком формате удаленной работы, настолько помогу. Подойдет вам такой вариант?

  2. При подключении MCP41010 и MAX7219 по SPI на MAX7219 ничего не будет отображаться, т.к. нужно разделить CS по разным контактам Arduino для MCP41010 и MAX7219.
    https://learningaboutelectronics.com/Articles/Multiple-SPI-devices-to-an-arduino-microcontroller.php - вот один из примеров, но как это приспособить для нашего случая?

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

      • Хорошо, вернемся к ТМ1637. Вот два скетча https://disk.yandex.ru/d/sSro9K8Ma1pJ8A
        wDS18B20-7 - изменение ступеней;
        wDS18B20-7.1 - отображение температуры с десятичной точкой, но без десятых.
        Как соединить их вместе для отображения на одном ТМ1637 изменений ступеней, на другом ТМ1637 - температуры (желательно с десятыми)?

        • Кнопки предполагаю так: кнопка "-", кнопка "меню", кнопка "+". При нажатии на кнопку "меню" отображается temp_min, кнопками "-" и "+" выставляется значение, следующее нажатие на "меню" - отображается заданное значение температуры, кнопками "-" и "+" выставляется значение, следующее нажатие на "меню" - отображается temp_max, кнопками "-" и "+" выставляется значение, следующее нажатие на "меню" - выход из меню. Установленные значения запоминаются в EEPROM.

          • А что у вас с десятыми не получается? Вроде по фото видно что они выводятся у вас на индикатор.
            Что то с кнопками вы серьезный больно функционал хотите замутить. Я думал с их помощью нужно будет пределы температуры изменять. А меню, которое вы хотите, я даже не знаю как реализовать. Слишком долго в это вникать нужно

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

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

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

  4. Внес Ваши изменения в скетч и температура появилась! Теперь нужно добавить отображение ступеней (два левых разряда индикатора) и кнопки установки температуры.
    Вот для меня это сложный проект - газовый котел всё-таки, где многое нужно учесть. Ваши удаленные правки всегда с моими экспериментами и обратной связью.

    На всякий случай: https://www.youtube.com/watch?v=A9oOtKbNfck - убрал лишнее, хотя может быть и не всё - https://disk.yandex.ru/d/I7XxiMFKj-ItXw. Температуру показывает.

    • Ну вы картинку пришлите как у вас сейчас температура отображается, а то мне сложно пока представить куда нужно ступени отображать

            • А зачем вы мои строки из программы удалили:
              DispString[0] = 3;
              DispString[1] = 4;
              DispString[2] = 5;
              DispString[3] = 6;
              У меня просто есть сомнения относительно того как вам ступени в первых двух разрядах индикатора отображать. Или вы сами уже знаете как в этих двух разрядах числа отображать?

  5. Датчика BMP180 нет в наличии.
    Значит что-то в Вашем скетче не так - нет вывода температуры на индикатор.

    • Хорошо, попробуйте эту программу
      https://disk.yandex.ru/d/wVfL9VO2_3Avxw
      Это скетч с proto-constructor.ru, из которого удалена вся работа с датчиком BMP180. Он должен все время выводить на индикатор температуру 25 градусов

      • Выводит на индикатор температуру 25 градусов, если убрать строки
        /*Создаём объект BMP180_Sensor класса SFE_BMP180*/
        SFE_BMP180 BMP180_Sensor;

        /*Инициализация датчика BMP180*/
        BMP180_Sensor.begin();

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

            • Измените функцию int GetTemperature() следующим образом:
              {
              /*Переменная для хранения замеренного значения температуры*/
              double T;

              //Работаем с датчиком DS18B20
              temp.requestTemperatures();
              T=temp.getTempCByIndex(0);
              Serial.print(T);
              return int(T);
              }
              А то у вас в ней переменная T объявляется, а ей ничего не присваивается. Естественно, что в этом случае на выход функции ничего не передавалось

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

    • Все равно не вижу. Можете на яндекс диск загрузить пример подобного скетча, который у вас заработал?

        • Сделайте плз еще скрин работы этого скетча как он температуру на индикаторе отображает, а то пока не очень понятно

          • Температуру на индикаторе отображает так, как на Рис.3:Схема подключения в статье - 26 градус С.

            Предлагаю всё-таки использовать индикатор на MAX7219 отсюда:
            https://www.youtube.com/watch?v=A9oOtKbNfck
            Убрать букву П на верхнем индикаторе, сделать два левых разряда для индикации ступеней регулирования 0 - 19. Уличная температура пусть остается. Соединить всё в один скетч.

            • Ну как хотите. Тогда попробуйте какой-нибудь скетч в сети для работы с индикатором на MAX7219, который у вас заработает. Ссылку мне тогда на статью с этим скетчем напишите, а я его в нашу программу интегрирую.

  6. Температуру пока оставим без изменений.
    Да, интегрировать скетч с сайта thesolaruniverse.wordpress.com, другого не нашел. Номера контактов на Ваше усмотрение. Как изменить задержку, чтобы не было мерцания?
    Кстати, с 8-ми разрядным индикатором на MAX7219 (фото посылал) работали? Думаю проще будет сделать на одном индикаторе и температуру и показания уровня. Вот нашел
    https://www.youtube.com/watch?v=A9oOtKbNfck

    • Нет, не работал. Попробуйте эту программу
      https://disk.yandex.ru/d/6sMCZbs9txiVhg
      Добавил в нее вывод ступени на индикатор, может, и не будет в ней никакого мерцания. Контакты 9 и 8 как и в примере на thesolaruniverse.wordpress.com

      • Ступени на индикаторе отображаются без мерцания. Как теперь отобразить температуру и ступени попеременно, к примеру по 10 секунд?

        • А температуру нужно отображать с десятыми долями градуса? Индикатор позволяет отображать десятичную точку?

          • Нужно отображать с десятыми. Да, точки отображает. В скетче с сайта thesolaruniverse.wordpress.com убрать знак С, градус оставить и сместить на место С, а вместо градуса сделать десятые.

            • А где там этот скетч? Что то я его не нашел

  7. Да, нужно чтобы от нуля, чтобы состояние "Выключено" было обязательно, иначе котел не отключится.
    Ясно, что несоответствие связано с функцией map.
    А что с подключением индикатора?

        • Ну работает как я и программировал. До 19 ступени показания не могут подняться потому что у нас шаг 2. Или вам еще что-нибудь нужно подправить?

        • Этого я не знаю, я же никогда с таким индикатором не работал. Можете еще с какого-нибудь сайта пример работы с таким индикатором попробовать, может в нем не будет мигания. Все равно работу с температурой пока не до конца отладили

            • Этого я не знаю, это вы должны мне сказать. Ну если работа с температурой вас устраивает, то оставим ее пока без изменений и займемся другими задачами

          • Кнопки ещё нужно добавить для того, чтобы задавать температуру. Также сделать, чтобы на индикатор выводились показания уровня от 0 до 19.

            • Ну вам тогда в программу скетч с сайта thesolaruniverse.wordpress.com интегрировать? Не будете другой искать? К каким номерам контактов Ардуино тогда подключить ваш индикатор в программе.
              Возможно, мерцание в скетче наблюдается из-за задержки всего в 250 мс, но это не точно

    • То есть ступени можно опускаться до 0? Я могу тогда диапазон трансформации ступени задать от 0 до 19. Сейчас стоит от 1 до 19. Может быть это вам поможет.
      Ну вы же сами когда делили одно на другое у вас получалось отношение 13 с чем то. Не преувеличивайте возможности функции map - она просто линейно трансформирует один диапазон в другой.
      256/19=13,47
      256/20=12,8 (это если я диапазон в программе изменю чтобы он с нуля начинался)

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

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