В данной статье мы рассмотрим подключение цифрового датчика температуры DS18B20 к плате Arduino Uno. Приведены схема и программа (скетч) для проекта.
Также на нашем сайте вы можете посмотреть проекты измерения температуры с помощью платы Arduino и датчиков lm35 и DHT11.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Maxim Integrated DS18B20 Programmable Resolution (цифровой датчик температуры DS18B20) (купить на AliExpress).
- Резистор 4,7 кОм (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Общие принципы работы датчика температуры DS18B20
DS18B20 представляет собой однопроводный цифровой датчик температуры от компании Maxim IC. Выдает значение температуры в градусах Цельсия, способен измерять температуру с 9-12 битной точностью в диапазоне от -55 до 125 градусов Цельсия с точностью +/-0.5 градуса. Каждый датчик DS18B20 имеет 64-битный уникальный номер (Serial number), вытравленный на корпусе датчика, что позволяет подключать огромное число подобных датчиков к одной шине данных. С помощью данного датчика можно измерять температуру воздуха, жидкостей и земли. В некоторых магазинах датчик продается в комплекте с резистором сопротивлением 4,7 кОм.
Особенности датчика 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 представлена на следующем рисунке.
Схема подключения датчика к плате Arduino достаточно проста: контакт 1 – к контакту GND Arduino, контакт 2 – к любому ее цифровому контакту (в нашем случае к контакту 2), контакт 3 – к ее контакту +5V или +3.3V. Также необходимо подключить подтягивающий (pull-up) резистор.
Исходный код программы (скетча)
Перед тем как загружать программу в плату Arduino необходимо скачать и извлечь из архива следующие библиотеки, необходимые для работы проекта:
- 1-Wire bus;
- Dallas Temperature (необходима для считывания и расчета температуры с датчика).
В скетче программы необходимо подключить заголовочные файлы этих библиотек.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
/********************************************************************/ // сначала необходимо подключить следующие библиотеки в проект #include <OneWire.h> #include <DallasTemperature.h> /********************************************************************/ // контакт данных датчика подключен к контакту 2 платы Arduino #define ONE_WIRE_BUS 2 /********************************************************************/ //создаем объект класса oneWire для работы с датчиком и его взаимодействия //с другими OneWire устройствами (не только температурными датчиками Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); /********************************************************************/ // связываем наш объект oneWire с библиотекой Dallas Temperature. DallasTemperature sensors(&oneWire); /********************************************************************/ void setup(void) { // инициализируем последовательную связь со скоростью 9600 бод Serial.begin(9600); Serial.println("Dallas Temperature IC Control Library Demo"); // инициализируем датчик sensors.begin(); } void loop(void) { // вызываем функцию sensors.requestTemperatures() для запроса значения // температуры со всех устройств, подключенных к шине /********************************************************************/ Serial.print(" Requesting temperatures..."); sensors.requestTemperatures(); // передаем команду на запрос температуры Serial.println("DONE"); /********************************************************************/ Serial.print("Temperature is: "); Serial.print(sensors.getTempCByIndex(0)); // почему вводится индекс "byIndex"? // потому что к одной и той же шине может быть подключено несколько датчиков DS18B20. // 0 относится к первому датчику (микросхеме) на шине (проводе) delay(1000); } |
На следующем рисунке показано тестирование работы проекта.
Да, нужно чтобы от нуля, чтобы состояние "Выключено" было обязательно, иначе котел не отключится.
Ясно, что несоответствие связано с функцией map.
А что с подключением индикатора?
Попробуйте тогда эту программу
https://disk.yandex.ru/d/nna9czgHn0DwAQ
Ну у вас получилось какой-нибудь пример с индикатором запустить из тех, ссылки на которые вы мне писали
https://disk.yandex.ru/d/irMV6B38L3CJ6A - при уменьшении и увеличении температуры.
С индикатором пока ничего не пробовал.
https://thesolaruniverse.wordpress.com/2018/08/08/four-digit-7-segment-led-display-for-arduino-based-on-the-tm1637-driver/?like_comment=1190&_wpnonce=960f2ed19e
с этого сайта использовал скетч для индикатора и DS18B20 - все работает, только периодически мигание индикатора заметно. С чем это может быть связано?
https://disk.yandex.ru/d/cuwbpiNmgvd_KQ
Должно быть stupen=0 (выкл) и только тогда level=0; при stupen=1 , level=13.
Почему не соблюдается соотношение 13 к 1 (к примеру,level=70 - stupen=6, а должно быть 78)?
То есть ступени можно опускаться до 0? Я могу тогда диапазон трансформации ступени задать от 0 до 19. Сейчас стоит от 1 до 19. Может быть это вам поможет.
Ну вы же сами когда делили одно на другое у вас получалось отношение 13 с чем то. Не преувеличивайте возможности функции map - она просто линейно трансформирует один диапазон в другой.
256/19=13,47
256/20=12,8 (это если я диапазон в программе изменю чтобы он с нуля начинался)