Герметичный датчик температуры DS18B20
Товары из офиса нельзя заказать через интернет или забронировать. Можно только прийти, схватить и бежать. Доступное количество актуально на момент загрузки страницы.
Офис находится в 3 минутах ходьбы от м. Парк культуры по адресу: ул. Тимура Фрунзе, 8/5.
скоро Магазин-мастерская, м. Лиговский пр-т
Магазин-мастерская, м. Лиговский пр-т
Товары из магазина-мастерской нельзя заказать через интернет или забронировать. Можно только прийти, схватить и бежать. Доступное количество актуально на момент загрузки страницы.
Магазин-мастерская находится в трёх минутах пешком от метро Лиговский Проспект на территории пространства «Лофт Проект Этажи» по адресу Лиговский проспект 74Д.
Вам необходимо измерить температуру в неблагоприятной для микросхем среде? Воспользуйтесь герметичным датчиком температуры.
Этот датчик поможет вам измерить температуру воды в аквариуме или чайнике. Можно использовать его для измерения температуры на улице и при этом не бояться, что датчик зальёт дождём. Дачники оценят возможность измерять температуру почвы в теплице и на участке. А при отсутствии медицинского термометра этот датчик вас выручит, если возникнет необходимость оценить температуру собственного тела.
Датчик температуры основан на популярной микросхеме DS18B20. Он определяет температуру окружающей среды в диапазоне от -55 °C до +125 °C и передаёт данные в виде цифрового сигнала с 12-битным разрешением по протоколу 1-Wire. Этот протокол позволяет подключить огромное количество таких датчиков, используя всего один цифровой порт контроллера и всего два провода для всех датчиков: землю и сигнал. В этом случае применяется так называемое «паразитное питание», при котором датчик получает энергию прямо с линии сигнала. Каждый датчик имеет уникальный прошитый на производстве 64-битный код, который может использоваться микроконтроллером для общения с конкретным сенсором на общей шине. Код каждого сенсора считывается отдельной командой.
В постоянной памяти DS18B20 можно сохранить граничные значения температуры, при выходе из которых сенсор будет переходить в режим тревоги. На общей шине из многих сенсоров микроконтроллер может за раз узнать, какие из них перешли в этот режим. Таким образом легко определить проблемный участок в контролируемой среде.
Разрешение показаний настраивается и составляет от 9 до 12 бит. Меньше разрешение — выше скорость преобразования.
Подключение
Герметичный датчик на основе микросхемы DS18B20 можно подключить двумя способами:
- По трём проводам: питание, земля и сигнал.
- По двум проводам: земля и сигнал. В этом случае датчик изредка может давать неверные показания, которые легко исключить из конечного результата фильтрацией.
Независимо от способа подключения, сигнальный провод необходимо соединить с питанием через резистор 4,7 кОм. Если вы хотите сосредоточиться на проекте и не думать о схемотехнике, подключайте датчик через модуль подтяжки.
Для подключения датчика к Arduino или макетной плате удобно использовать нажимной клеммник.
Программирование
Для работы с устройствами по протоколу 1-Wire в Arduino IDE существует готовая библиотека OneWire, а для работы именно с DS18B20 существует библиотека-надстройка от Майлса Бёртона.
Комплектация
1× Датчик температуры в герметичном корпусе
Характеристики
- Модуль: DS18B20
- Интерфейс: 1-Wire
- Диапазон измеряемых температур: −55…+125 °C
- Точность: ±0,5 °C (в пределах −10…+85 °C)
- Разрешение: 9/10/11/12 бит
- Время получения данных:
- 750 мс при 12-битном разрешении
- 94 мс при 9-битном разрешении
Ресурсы
Видеообзор датчика:
- Библиотека OneWire
- Библиотека Arduino Temperature Control
Взаимодействие нескольких DS18B20, цифровых датчиков температуры, с Arduino
Одним из самых больших преимуществ датчиков температуры DS18B20 является то, что на одной шине 1-Wire могут сосуществовать несколько таких датчиков. Поскольку каждый DS18B20 имеет уникальный 64-битный последовательный код, зашитый на заводе, их легко отличать друг от друга.
В следующем руководстве показано, как подключить несколько датчиков DS18B20 к одной шине и получать показания температуры от каждого из них. Эта функция может быть огромным преимуществом, если вы хотите управлять несколькими датчиками DS18B20, распределенными по большой площади.
Это может показаться пугающим, но, прежде чем углубляться в это руководство, вы должны быть знакомы с основами работы с однопроводными датчиками температуры DS18B20. Если вы не знакомы с ними, посмотрите следующую статью:
А теперь, без дальнейших задержек, давайте подключим датчики DS18B20 к нашей плате Arduino.
Подключение нескольких датчиков DS18B20 к Arduino
Подключение довольно простое.
Начните с подключения всех датчиков DS18B20 параллельно, то есть объединения всех выводов VDD, выводов GND и сигнальных выводов. Затем подключите шину VDD к выходу 5V на Arduino, GND к выводу земли Arduino, и подключите сигнальные выводы к цифровому выводу 2 на Arduino.
Затем, чтобы обеспечить стабильную передачу данных, вам нужно добавить один подтягивающий резистор 4,7 кОм для всей шины между сигнальными выводами и выводами питания (внутренние подтягивающие резисторы на ардуино не работают).
Установка библиотеки для DS18B20
Протокол Dallas 1-Wire несколько сложен и требует много кода для парсинга связи. Чтобы скрыть эту ненужную сложность, мы установим библиотеку DallasTemperature.h, чтобы мы могли выполнять простые команды для получения показаний температуры от датчика.
Чтобы установить библиотеку, перейдите в раздел «Скетч»→ «Подключить библиотеку» → «Управление библиотеками…». Подождите, пока менеджер библиотеки загрузит индекс библиотек и обновит список установленных библиотек.
Чтобы отфильтровать результаты поиска, введите « ds18b20 ». Там должна быть пара записей. Ищите DallasTemperature от Miles Burton. Нажмите на эту запись, а затем выберите Установка.
Эта библиотека DallasTemperature является аппаратно-зависимой библиотекой, которая обрабатывает функции более низкого уровня. Она должна быть связана с библиотекой OneWire для связи с любым устройством 1-Wire, а не только с DS18B20. Установите и эту библиотеку.
Способ 1: чтение показаний DS18B20 по индексу
В этом методе библиотека Dallas Temperature при инициализации обнаруживает все датчики, использующие одну шину. Она рассматривает всю шину как массив датчиков и присваивает им индексы. Поэтому мы можем точно выбрать каждый датчик по его индексу и прочитать показания температуры.
#include #include // линия данных подключена к цифровому выводу 2 Arduino #define ONE_WIRE_BUS 2 // настройка объекта oneWire для связи с любым устройством OneWire OneWire oneWire(ONE_WIRE_BUS); // передать ссылку на oneWire библиотеке DallasTemperature DallasTemperature sensors(&oneWire); int deviceCount = 0; float tempC; void setup(void) < sensors.begin(); // запустить библиотеку Serial.begin(9600); // найти устройства на шине Serial.print("Locating devices. "); Serial.print("Found "); deviceCount = sensors.getDeviceCount(); Serial.print(deviceCount, DEC); Serial.println(" devices."); Serial.println(""); >void loop(void) < // послать команду всем датчикам для преобразования температуры sensors.requestTemperatures(); // отобразить температуру с каждого датчика for (int i = 0; i < deviceCount; i++) < Serial.print("Sensor "); Serial.print(i+1); Serial.print(" : "); tempC = sensors.getTempCByIndex(i); Serial.print(tempC); Serial.print((char)176);// напечатать символ градусов Serial.print("C | "); Serial.print(DallasTemperature::toFahrenheit(tempC)); Serial.print((char)176);// напечатать символ градусов Serial.println("F"); >Serial.println(""); delay(1000); >
Вывод вышеприведенного скетча выглядит так:
Объяснение кода
Скетч начинается с включения библиотек, объявления вывода, к которому подключена шина датчиков, и создания объекта библиотеки DallasTemperature .
В настроечной части кода мы сначала вызываем функцию begin() . Она инициализирует шину и обнаруживает все DS18B20, присутствующие на ней. Затем каждому датчику присваивается индекс и устанавливается разрешение в 12 бит.
Затем мы вызываем функцию getDeviceCount() , чтобы получить количество устройств, найденных на шине.
В циклической части кода мы используем функцию requestTemperatures() , чтобы отправить команду всем датчикам для преобразования температуры.
Способ 2: чтение датчика DS18B20 по адресу
Мы знаем, что каждому DS18B20 назначен уникальный 64-битный адрес, чтобы отличать их друг от друга. В этом методе мы найдем этот адрес для соответствующей маркировки каждого датчика. Затем этот адрес можно использовать для считывания каждого датчика в отдельности.
Поиск адресов датчиков DS18B20s на шине
Следующий скетч обнаруживает все DS18B20, присутствующие на шине, и печатает их адреса на 1-Wire в монитор последовательного порта.
Вы можете подключать только один датчик за раз, чтобы определить его адрес (или последовательно добавлять по одному новому датчику, чтобы вы могли идентифицировать каждый из них по его адресу). Затем вы можете пометить каждый датчик.
#include #include // линия данных подключена к цифровому выводу 2 Arduino #define ONE_WIRE_BUS 2 // настройка объекта oneWire для связи с любым устройством OneWire OneWire oneWire(ONE_WIRE_BUS); // передать ссылку на oneWire библиотеке DallasTemperature DallasTemperature sensors(&oneWire); // переменная для хранения адресов устройств DeviceAddress Thermometer; int deviceCount = 0; void setup(void) < // запустить последовательный порт Serial.begin(9600); // запустить библиотеку sensors.begin(); // найти устройства на шине Serial.println("Locating devices. "); Serial.print("Found "); deviceCount = sensors.getDeviceCount(); Serial.print(deviceCount, DEC); Serial.println(" devices."); Serial.println(""); Serial.println("Printing addresses. "); for (int i = 0; i < deviceCount; i++) < Serial.print("Sensor "); Serial.print(i+1); Serial.print(" : "); sensors.getAddress(Thermometer, i); printAddress(Thermometer); >> void loop(void) <> void printAddress(DeviceAddress deviceAddress) < for (uint8_t i = 0; i < 8; i++) < Serial.print("0x"); if (deviceAddress[i] < 0x10) Serial.print("0"); Serial.print(deviceAddress[i], HEX); if (i < 7) Serial.print(", "); >Serial.println(""); >
Теперь откройте монитор последовательного порта. Вы должны получить что-то подобное:
Скопируйте все адреса, так как они нам понадобятся в следующем скетче.
Чтение показаний датчиков DS18B20 по адресу
Следующий скетч считывает температуру датчиков DS18B20 по их адресам. Прежде чем приступить к загрузке скетча, вам нужно изменить адреса датчиков DS18B20 на те, которые вы определили в предыдущем скетче.
#include #include // линия данных подключена к цифровому выводу 2 Arduino #define ONE_WIRE_BUS 2 // настройка объекта oneWire для связи с любым устройством OneWire OneWire oneWire(ONE_WIRE_BUS); // передать ссылку на oneWire библиотеке DallasTemperature DallasTemperature sensors(&oneWire); // адреса трех датчиков DS18B20 uint8_t sensor1[8] = < 0x28, 0xEE, 0xD5, 0x64, 0x1A, 0x16, 0x02, 0xEC >; uint8_t sensor2[8] = < 0x28, 0x61, 0x64, 0x12, 0x3C, 0x7C, 0x2F, 0x27 >; uint8_t sensor3[8] = < 0x28, 0x61, 0x64, 0x12, 0x3F, 0xFD, 0x80, 0xC6 >; void setup(void) < Serial.begin(9600); sensors.begin(); >void loop(void) < sensors.requestTemperatures(); Serial.print("Sensor 1: "); printTemperature(sensor1); Serial.print("Sensor 2: "); printTemperature(sensor2); Serial.print("Sensor 3: "); printTemperature(sensor3); Serial.println(); delay(1000); >void printTemperature(DeviceAddress deviceAddress)
Вывод вышеприведенного эскиза выглядит так
Объяснение кода
Как обычно, скетч начинается с включения библиотек, объявления вывода, к которому подключена шина датчиков, и создания объекта библиотеки DallasTemperature .
Далее мы вводим адреса, которые были найдены ранее для каждого датчика температуры. В нашем случае имеем следующее.
uint8_t sensor1[8] = < 0x28, 0xEE, 0xD5, 0x64, 0x1A, 0x16, 0x02, 0xEC >; uint8_t sensor2[8] = < 0x28, 0x61, 0x64, 0x12, 0x3C, 0x7C, 0x2F, 0x27 >; uint8_t sensor3[8] = < 0x28, 0x61, 0x64, 0x12, 0x3F, 0xFD, 0x80, 0xC6 >;
Во фрагменте настройки мы инициализируем библиотеку путем вызова функции begin() и инициализируем последовательную связь с ПК.
В цикле мы просто посылаем команду всем датчикам для преобразования температуры, используя функцию requestTemperatures() .
Затем, чтобы напечатать температуру датчика, мы вызываем пользовательскую функцию printTemperature(DeviceAddress deviceAddress) , для которой deviceAddress передается в качестве параметра.
void printTemperature(DeviceAddress deviceAddress)
Вышеприведенная функция просто вызывает библиотечные функции getTempC(deviceAddress) для отображения температуры в градусах Цельсия и DallasTemperature::toFahrenheit() для отображения температуры в градусах Фаренгейта.
Теги
Сохранить или поделиться
На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.
В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.
2021-10-10 baksser
Ясен пень тоже самое, но без функций и лишних печатей. Вы этим уроком что хотели преподнести? Как функции работают или как датчики подключать. Уроки для начинающих? Надо думать как начинающий. Нахрена туда пихать лишнее. Кое как разобрался в вашей писанине. Проще надо быть и люди потянутся.
2021-10-09 radioprog
Что именно усложнено? Какие циклы?
Вы переписали всё то же самое, но без отдельной функции печати температуры в градусах Цельсия и Фаренгейта с символами градусов ‘°’.2021-10-05 baksser
Трындец всё как сложно запутываете нет чтобы тремя простыми словами нет надо циклы мутить запутанные.
#include
#include
#define ONE_WIRE_BUS 2OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);void setup(void)
Serial.begin(115200);
sensors.begin();
>void loop(void)
sensors.requestTemperatures();
Serial.print(«температура»);
Serial.print(sensors.getTempC(sensor1));
Serial.print(«температура»);
Serial.print(sensors.getTempC(sensor2));
Serial.print(«температура»);
Serial.print(sensors.getTempC(sensor3));
delay(1000);
>
И всё. Чё усложнять?2020-12-14 Dmitry Bezborodov
Здравствуйте. Подскажите, пожалуйста, в каком порядке датчикам присваиваются индексы? Могут ли одни и те же датчики получать разные индексы? Спасибо.
Arduino и термометр DS18B20
DS18B20 – высокоточный цифровой датчик температуры. Основные характеристики:
- Диапазон: -55.. 125 °C
- Точность: 0.5 °C
- Разрешение: 9.. 12 бит (0.48.. 0.06 °C)
- Питание: 3-5.5V
- Период выдачи результата:
- 750 мс при точности 12 бит
- 94 мс при точности 9 бит
В наборе идёт датчик в герметичном исполнении со стандартным гнездом (шаг 2.54 мм) для подключения
Подключение
Датчик имеет следующие назначения пинов:
Датчик подключается к любому цифровому пину Arduino, но пин должен быть подтянут к питанию резистором 4.7 кОм. На один пин можно подключить несколько датчиков DS18B20.
В рамках набора GyverKIT резистор на 4.7 кОм можно заменить двумя резисторами на 10 кОм (есть в комплекте), подключенными параллельно:
Библиотеки
Для этого датчика есть несколько библиотек:
- “Официальная” библиотека DallasTemperature.h, для работы которой также понадобится библиотека OneWire.h.
- Наша библиотека microDS18B20
В примерах на этом сайте мы будем использовать microDS18B20, так как она в несколько раз легче и проще в использовании, чем официальная. Библиотека идёт в архиве к набору GyverKIT, а свежую версию всегда можно установить/обновить из встроенного менеджера библиотек Arduino по названию microDS18B20. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.
Работа с microDS18B20
Без адресации
В этом режиме на один пин МК подключается один датчик, для работы с ним не требуется предварительного чтения адреса и записи его в программу. Можно подключить несколько датчиков, каждому указать свой пин, см. пример one_pin_one_sensor.
MicroDS18B20 sensor1; MicroDS18B20 sensor2; // . и так далее
С адресацией
В этом режиме можно подключить сколько угодно датчиков на один пин МК, но для работы с ними понадобится занести в программу уникальные адреса датчиков. В момент чтения адреса к пину должен быть подключен только один датчик! Пример – address_read. Для дальнейшей работы адреса хранятся в массивах на стороне программы и передаются датчикам при инициализации, пин указывается один и тот же:
uint8_t addr1[] = ; uint8_t addr2[] = ; MicroDS18B20 sensor1; MicroDS18B20 sensor2; // . и так далее
Также адрес можно сменить во время работы программы, см. документацию.
Чтение температуры
Чтение температуры делится на два этапа – запрос и получение данных. Запрос делается функцией requestTemp() . После получения запроса датчик начинает измерение температуры, которое длится от 90 до 750 мс в зависимости от настроенной точности (по умолчанию точность максимальная, преобразование длится 750 мс). Если прочитать температуру до окончания преобразования – датчик вернёт результат предыдущего измерения, поэтому в примерах используется задержка или опрос по таймеру на 1 секунду. Получить температуру можно при помощи getTemp() [float] или getTempInt() [int]. Если принятые данные повреждены или датчик отсутствует на линии – функция вернёт предыдущее успешно прочитанное значение температуры.
Примечание: при повторных вызовах getTemp() не запрашивает с датчика новую температуру (долгое выполнение функции), вместо этого она просто возвращает предыдущий результат до тех пор, пока не будет сделан новый запрос requestTemp().
В версии библиотеки 3.5 появилась возможность отдельно запросить температуру и определить корректность полученных данных, чтобы только после этого их прочитать и применить в программе – функция readTemp() . Также это позволяет определить состояние подключения и всё ли в порядке с датчиком. Для чтения температуры рекомендуется использовать конструкцию вида:
if (sensor.readTemp()) value = sensor.getTemp(); // else отработка ошибки
где readTemp() запрашивает данные с датчика и возвращает true , если они прочитаны корректно. После этого можно забрать текущую температуру из getTemp() , которая уже не запрашивает температуру с датчика, а отдаёт прочитанный в readTemp() результат.
Примеры
Без адресации
Библиотека позволяет работать по схеме “один датчик – один пин”, в которой адрес датчика получать не нужно. Достаточно подключить и использовать:
// один датчик лучше читать без адресации, это сильно экономит память #include MicroDS18B20 sensor; void setup() < Serial.begin(9600); >void loop() < // запрос температуры sensor.requestTemp(); // вместо delay используй таймер на millis(), пример async_read delay(1000); // проверяем успешность чтения и выводим if (sensor.readTemp()) Serial.println(sensor.getTemp()); else Serial.println("error"); >
Без адресации асинхронный опрос
#include MicroDS18B20 sensor; // датчик на D2 void setup() < Serial.begin(9600); >void loop() < // конструкция программного таймера на 800 мс static uint32_t tmr; if (millis() - tmr >= 800) < tmr = millis(); // читаем прошлое значение if (sensor.readTemp()) Serial.println(sensor.getTemp()); else Serial.println("error"); // запрашиваем новое измерение sensor.requestTemp(); >>
Чтение адреса
Каждый датчик имеет свой уникальный адрес. Его можно прочитать следующим образом:Данный код выводит в порт адрес текущего подключенного датчика.
#include MicroDS18B20 sensor; // Создаем термометр без адреса на пине D2 uint8_t address[8]; // Создаем массив для адреса void setup() < Serial.begin(9600); >void loop() < // читаем адрес термометра в указанный массив if (sensor.readAddress(address)) < // если успешно, выводим Serial.print('<'); for (uint8_t i = 0; i < 8; i++) < Serial.print("0x"); Serial.print(address[i], HEX); // Выводим адрес if (i < 7) Serial.print(", "); >Serial.println('>'); > else Serial.println("Not connected"); delay(1000); >
Опрос датчиков с адресацией
Зная адреса датчиков, можно подключить несколько штук на один пин и обращаться к ним в коде следующим образом:
#include #define DS_PIN 2 // пин для термометров // Уникальные адреса датчиков - считать можно в примере address_read uint8_t s1_addr[] = ; uint8_t s2_addr[] = ; MicroDS18B20 sensor1; // Создаем термометр с адресацией MicroDS18B20 sensor2; // Создаем термометр с адресацией void setup() < Serial.begin(9600); >void loop() < // асинхронное чтение нескольких датчиков смотри в примере async_read_many sensor1.requestTemp(); // Запрашиваем преобразование температуры sensor2.requestTemp(); delay(1000); // ожидаем результат Serial.print("t1: "); if (sensor1.readTemp()) Serial.println(sensor1.getTemp()); else Serial.println("error"); Serial.print("t2: "); if (sensor2.readTemp()) Serial.println(sensor2.getTemp()); else Serial.println("error"); >
Удобный опрос массива датчиков
// количество датчиков для удобства #define DS_SENSOR_AMOUNT 5 // создаём двухмерный массив с адресами uint8_t addr[][8] = < , , , , , >; #include // указываем DS_ADDR_MODE для подключения блока адресации // и создаём массив датчиков на пине D2 MicroDS18B20 sensor[DS_SENSOR_AMOUNT]; void setup() < Serial.begin(9600); // устанавливаем адреса for (int i = 0; i < DS_SENSOR_AMOUNT; i++) < sensor[i].setAddress(addr[i]); >> void loop() < // конструкция программного таймера на 1c static uint32_t tmr; if (millis() - tmr >= 1000) < tmr = millis(); // выводим показания в порт for (int i = 0; i < DS_SENSOR_AMOUNT; i++) < Serial.print(sensor[i].getTemp()); Serial.print(','); >Serial.println(); // запрашиваем новые for (int i = 0; i < DS_SENSOR_AMOUNT; i++) < sensor[i].requestTemp(); >> >
Видео
Домашнее задание
- Изучить остальные возможности библиотеки
- Измерить температуру тела, сравнить со ртутным термометром
Связанные уроки
Сколько должно быть жил в кабеле (проводе) к проводному датчику температуры Кситал?
Основой термодатчика Кситал ТД является микросхема DS18B20 производства Dallas.
Для подключения проводного датчика температуры к блоку Кситал необходимо минимум три жилы, несмотря на то, что сама микросхема допускает двухпроводное подключение.
Для полноценной работы считывателя ключей Touch Memory нужно четыре жилы.
Эта информация была полезной?
Автор: Кситал Дата: 16.03.2024 Просмотров: 6940
Вы можете оставить свой комментарий к статье
Евгений
Как оптимально подключить проводные термодатчики Кситал? В каждой комнате дома есть сетевые розетки RJ45 которые через кабели UTP кат5Е выходят в одно помещение, где расположен блок Кситал. Тянуть отдельные провода для последовательного подключения датчиков возможности нет. Возможно ли параллельное соединение датчиков ?
Кситал Параллельное подключение датчиков нарушает условия работы протокола и может приводить к рассогласованию линии и сбоям в работе термодатчиков. Но это не ведет к повреждению чего-либо. То есть можно пробовать. В конкретном случае результат непредсказуем, в том числе и может быть успешным.
Но если у Вас проложена витая пара с 4-мя парами проводников, то Вы можете несложно соединить их как «складку» линии. То есть 4 проводника (2 пары) пойдут в сторону термодатчика, 4 проводника (другие 2 пары) вернут линию обратно. Таким образом, Вы сможете, с одной стороны, выполнить условия согласования линии, с другой стороны, коммутировать все лучи из одного места.
Подписаться на новости
Подпишитесь на нашу рассылку, и мы сообщим вам о новейших проектах и новостях.
Компания
Поддержка
Контакты
Россия, г.Москва, ул.Новопоселковая д.6, корпус 217, офис 416. ООО «КСИТАЛ»
тел. +7 (495) 229-04-86
E-mail: info@ksytal.ru