Датчик температури в Arduino – один із найпоширеніших видів сенсорів. Розробнику проектів з термометрами на Arduino є безліч різних варіантів, що відрізняються за принципом дії, точності, конструктивному виконанню. Цифровий датчик DS18B20 є одним із найпопулярніших температурних датчиків, часто він використовується у водонепроникному корпусі для вимірювання температури води або інших рідин. У цій статті ви знайдете опис датчика ds18b20 російською, ми разом розглянемо особливості підключення до ардуїно, принцип роботи датчика, опис бібліотек та скетчів.
DS18B20 – це цифровий температурний датчик, що має безліч корисних функцій. По суті, DS18B20 – це цілий мікроконтролер, який може зберігати значення вимірювань, сигналізувати про вихід температури за встановлені межі (самі межі ми можемо встановлювати та змінювати), змінювати точність вимірювань, спосіб взаємодії з контролером та багато іншого. Все це у дуже невеликому корпусі, який, до того ж, доступний у водонепроникному виконанні.
Температурний датчик DS18B20 має різноманітні видикорпуси. Можна вибрати один із трьох – 8-Pin SO (150 mils), 8-Pin µSOP, та 3-Pin TO-92. Останній є найпоширенішим і виготовляється у спеціальному вологозахисному корпусі, тому його сміливо можна використовувати під водою. Кожен датчик має 3 контакти. Для корпусу TO-92 потрібно дивитися на колір проводів: чорний – земля, червоний – живлення та білий/жовтий/синій – сигнал. В інтернет-магазинах можна придбати готовий модуль DS18B20.
Де купити датчик
Природно, що DS18B20 найдешевше купити на Аліекспресі, хоча він продається і в будь-яких спеціалізованих російських інтернет-магазинах з Ардуїно. Наведемо кілька посилань для прикладу:
Пам'ять датчика складається з двох видів: оперативної та енергонезалежної – SRAM та EEPROM. В останню записуються регістри конфігурації та регістри TH, TL, які можуть використовуватись як регістри загального призначення, якщо не використовуються для визначення діапазону допустимих значень температури.
Основним завданням DS18B20 є визначення температури та перетворення отриманого результату на цифровий вигляд. Ми можемо самостійно поставити необхідний дозвіл, Встановивши кількість біт точності - 9, 10, 11 і 12. У цих випадках роздільні здатності будуть відповідно дорівнюють 0,5С, 0,25С, 0,125С і 0,0625С.
Отримані температурні вимірювання зберігаються у SRAM датчика. 1 і 2 байти зберігають одержане значення температури, 3 і 4 зберігають межі вимірювання, 5 і 6 зарезервовані, 7 і 8 використовуються для високоточного визначення температури, останній 9 байт зберігає стійкий до перешкод CRC код.
Підключення DS18B20 до Arduino
DS18B20 є цифровим датчиком. Цифрові датчики передають значення вимірюваної температури у вигляді певного двійкового коду, який надходить на цифрові або аналогові піни ардуїно, а потім декодується. Коди можуть бути різними, ds18b20 працює за протоколом даних 1-Wire. Ми не будемо вдаватися до подробиць цього цифрового протоколу, зазначимо лише необхідний мінімум для розуміння принципів взаємодії.
Обмін інформацією в 1-Wire відбувається завдяки наступним операціям:
- Ініціалізація – визначення послідовності сигналів, з яких починається вимір та інші операції. Провідний пристрій подає імпульс скидання, після цього датчик повинен подати імпульс присутності, повідомляє про готовність до виконання операції.
- Запис даних – відбувається передача байта даних датчик.
- Читання даних відбувається прийом байта з датчика.
Для роботи з датчиком нам знадобиться програмне забезпечення:
- Arduino IDE;
- Бібліотека OneWire, якщо використовується кілька датчиків на шині, можна використовувати бібліотеку DallasTemperature. Вона працюватиме поверх OneWire.
З обладнання знадобляться:
- Один або декілька датчиків DS18B20;
- Мікроконтролер Ардуїно;
- Конектори;
- Резистор на 4,7 ком (у разі підключення одного датчика піде резистор номіналом від 4 до 10K);
- монтажна плата;
- USB-кабель для підключення до комп'ютера.
До плати Ардуїно UNOДатчик підключається просто: GND з термодатчика приєднується до GND Ардуїно, Vdd підключається до 5V, Data – до будь-якого цифрового піну.
Найпростіша схема підключення цифрового датчика DS18B20 представлена малюнку.
Алгоритм отримання інформації про температуру в скетчі складається з наступних етапів:
- Визначення адреси датчика, перевірка його підключення.
- На датчик подається команда з вимогою прочитати температуру та викласти виміряне значення у регістр. Процедура відбувається довше, на неї необхідно приблизно 750 мс.
- Подається команда на читання інформації з регістру та відправлення отриманого значення в монітор порту,
- Якщо потрібно, то здійснюється конвертація в градуси Цельсія/Фаренгейта.
Приклад простого скетчу для DS18B20
Найпростіший скетч для роботи з цифровим датчиком має такий вигляд. (У скетчі ми використовуємо бібліотеку OneWire, про яку поговоримо докладніше трохи пізніше).
#include
Скетч для роботи з датчиком ds18b20 без delay
Можна трохи ускладнити програму для ds18b20, щоб позбавитися від того, що гальмує виконання скетчу.
#include
Бібліотека DallasTemperature та DS18b20
У своїх скетчах ми можемо використовувати бібліотеку DallasTemperature, яка спрощує деякі аспекти роботи з датчиком DS18B20 по 1-Wire. Приклад скетчу:
#include
Бібліотека OneWire для роботи з DS18B20
DS18B20 використовує для обміну інформацією з Ардуін протокол 1-Wire, для якого вже написана відмінна бібліотека. Можна і потрібно використовувати її, щоб не реалізовувати всі функції вручну. . Для встановлення бібліотеки завантажте архів, розпакуйте в папку library вашого каталогу Arduino. Підключається бібліотека за допомогою команди #include
Усі датчики DS18B20 підключаються паралельно, їм всіх достатньо одного резистора. За допомогою бібліотеки OneWire можна одночасно рахувати всі дані з усіх датчиків. Якщо кількість датчиків, що підключаються більше 10, потрібно підібрати резистор з опором не більше 1,6 кОм. Також для більш точного вимірутемператури потрібно поставити додатковий резистор на 100...120 Ом між виходом data на платі Ардуїно та data на кожному датчику. Дізнатися, з якого датчика отримано те чи інше значення, можна за допомогою унікального 64-бітного серійного коду, який буде виданий в результаті виконання програми.
Для підключення температурних датчиків у нормальному режимі необхідно використовувати схему, представлену малюнку.
Висновки
Мікросхема Dallas DS18B20 є дуже цікавим пристроєм. Датчики температури і термометри, створені на її основі, мають прийнятні для більшості завдань характеристики, розвинений функціонал, відносно не дорогі. Особливу популярність датчик DS18B20 отримав як вологозахищений пристрій для вимірювання температури рідин.
За додаткові можливостідоводиться платити відносною складністю роботи з датчиком. Для підключення DS18B20 нам обов'язково знадобиться резистор із номіналом близько 5К. Для роботи з датчиком у скетчах ардуїно потрібно встановити додаткову бібліотеку та отримати певні навички для роботи з нею – там не зовсім тривіально. Втім, можна купити вже готовий модуль, а для скетчу здебільшого вистачить простих прикладів, наведених у цій статті.
Так історично склалося, що на поточний моментодним із найпопулярніших цифрових температурних датчиків є датчик DS18B20 корпорації Dallas Semiconductor. Звичайно ж, і ми не можемо обійти його стороною.
Вся пам'ять DS18B20 включає оперативну (SRAM) і енергонезалежну (EEPROM) пам'ять. У EEPROM зберігаються регістри TH, TL та регістр конфігурації. Якщо функція тривожного сигналуне використовується, то регістри TH та TL можуть використовуватися як регістри загального призначення. У режимі термостата TH містить значення верхнього порогу температури, TL відповідно нижнього порога.
Кодінг.
Насамперед нам знадобиться бібліотека OneWireяка нам дуже спростить життя. Завантажити можна з GitHub або з нашого сайту.
Будь-яке спілкування з датчиком починається з команди Reset. Тобто МК притискає шину даних у стан логічний "0" на 480 µs, потім відпускає її. Датчик відповідає це сигналом присутності, після чого ми відправляємо команду Skip ROM (0xCC) . Тобто звернемося до всіх датчика які присутні на шині.
OneWire(uint8_t pin);Конструктор, Pin– номер виводу, до якого підключено датчик.
uint8_t reset(void);Ініціалізація операції на шині. З цієї команди має починатися будь-яка операція обміну даними. Повертає:
- 1 – якщо пристрій підключено до шини (був відповідний імпульс присутності);
- 0 – якщо пристрій відсутній на шині (імпульсу у відповідь не було).
Запис байт. Передає байт пристрій на шині.
Відправимо команду 0x44ініціалізації вимірювання температури.
Пауза 1 сек.Очікування на час, необхідне виконання датчиком перетворення температури. Цей час залежить від обраної роздільної здатності датчика. Роздільна здатність 12 біт встановлено в датчику за замовчуванням. Час перетворення йому – 750 мс.
Потім ми відправляємо команду Reset, Skip ROM (0xCC) , а поміт команду 0xBE читання пам'яті датчика.
Ось і сам код із бібліотеки:
#include
Власне це бібліотека підходить для всіх датчиків сімейства. DS18(DS18B20, DS18S20, DS1820, DS1822) підключення не чим не відключаються. Ну а деякі відмінності можна вже дізнатися з даних,що до них.
У цьому уроці ми будемо використовувати датчик температури DS18B20 із Arduino UNO для створення термометра. Датчик DS18B20 є добрим варіантом, коли в проекті з високою точністю потрібна хороша реакція. Ми покажемо як підключити DS18B20 до вашого та відобразити дані температури на РК-дисплеї 16x2.
Огляд датчика DS18B20
Датчик DS18B20 взаємодіє з Arduino через 1-провідну шину. За визначенням зв'язку з Arduino потрібна лише одна лінія даних (і земля).
Кожен DS18B20 має унікальний 64-бітовий послідовний код або адресу, що дозволяє кільком DS18B20s працювати на тій же однопровідній шині. Тому використання мікропроцесора спрощує керування кількома DS18B20, розподіленими на великій площі. Додатки для цієї функції включають екологічний контроль, системи контролю температури в будівлях і механічному обладнанні.
Особливості DS18B20
- Необхідний лише один однопровідний інтерфейс для зв'язку між мікроконтролером та датчиком.
- Потрібний лише один зовнішній компонент: резистор 4,7 кОм.
- Може харчуватися від лінії передачі безпосередньо, вимагаючи напруги від 3,0 до 5,5 У.
- Кожен пристрій має унікальний 64-бітовий послідовний код, що зберігається на вбудованому ПЗП.
- Може вимірювати температуру в діапазоні від -55 ° C до + 125 ° C (від -67 ° F до + 257 ° F).
- Точність ± 0,5 ° C в діапазоні від -10 ° C до + 85 ° C.
У цьому проекті використовується DS18B20, який постачається у формі температурного зонда, що є водонепроникним. Використання водонепроникного датчика розширює можливості - датчик температури зможе виміряти температуру рідин, таких як вода, хімікати, чай та кава.
Вимоги до комплектуючих
Вимоги до обладнання для вашого термометра досить стандартні, нам знадобляться:
- РК-дисплей 16х2
- Датчик температури DS18B20
- Провід для перемичок
- Резистор 1K
- Макетна плата
Схема з'єднання
Зробіть з'єднання згідно з наведеною нижче схемою.
З'єднуємо датчик та Ардуїно
- VCC -> Arduino 5V, плюс резистор 4,7K, що йде від VCC до Data
- Data -> Пін 7 Arduino
- GND -> GND Arduino
З'єднання для РК-дисплею та Arduino UNO
- Пін 1 -> GND
- Пін 2 -> VCC
- Пін 3 -> Arduino Пін 3
- Пін 4 -> Arduino Пін 33
- Пін 5 -> GND
- Пін 6 -> Arduino Пін 31
- Пін 7-10 -> GND
- Пін 11 -> Arduino Пін 22
- Пін 12 -> Arduino Пін 24
- Пін 13 -> Arduino Пін 26
- Пін 14 -> Arduino Пін 28
- Пін 15 -> VCC через резистор 220 Ом
- Пін 16 -> GND
Підключіть потенціометр, як показано вище, до контакту 3 на РК-дисплеї, щоб керувати контрастністю.
Цей проект працює на температурах до 125 ° C. У разі наявності деякого дисонансу у значенні показаної температури двічі перевірте з'єднання з резистором, підключеним до DS18B20. Після з'єднання всього, що описано вище, ми можемо перейти до програмування.
Вихідний код для термометра
Перед завантаженням вихідного коду потрібно налаштувати дві бібліотеки, необхідні для запуску цього коду в середовищі Arduino.
- Перша бібліотека називається - OneWire().
- Друга бібліотека називається - DallasTemperature ().
Після завантаження обох бібліотек перемістіть файли до папки бібліотек Arduino за промовчанням. Потім скопіюйте код і завантажте його після подвійної перевірки правильності підключення вашого датчика.
//Code begins #includeПриблизно це так:
Ми змогли виміряти температуру до 100 ° C за допомогою цього датчика! Він дуже чуйний.
Після того, як ви створили проект, потестуйте пристрій, зануривши датчик у гарячу та холодну воду.
Розглянемо як за допомоги Arduinoчитати показання з цифрового датчика температури DS18B20 або DS18S20. У заразм/с DS18B20 фірми Dallas є найбільш поширеним та доступним цифровим датчиком температури. Працює за протоколом. Даташит датчика:
Схема підключення датчика DS18B20 до Arduino наведена нижче. Підтягуючий Pull-Up резистор номіналом 4.7 кОм (5 кОм) включається між виведенням DQ (Data) та живленням датчика Vdd.
Робочий скетч представлений нижче. Необхідна бібліотека OneWire, останню версіюякої можна завантажити.
Після встановлення бібліотеки, в меню з'явиться робочий приклад, яким можна скористатися.
#include "OneWire.h" // OneWire DS18S20, DS18B20, DS1822 Temperature Example // // http://www.pjrc.com/teensy/td_libs_OneWire.html // // DallasTemperature library can all this work for you ! // http://milesburton.com/Dallas_Temperature_Control_Library OneWire ds(10); // on pin 10 (a 4.7K resistor is necessary) void setup(void) ( Serial.begin(9600); ) void loop(void) ( byte i; byte present = 0; byte type_s; byte data; byte addr; float celsius, fahrenheit; if (!ds.search(addr)) ( Serial.println("No more addresses."); Serial.println(); ds.reset_search(); delay(250); return; ) Serial. print("ROM =");< 8; i++) { Serial.write(" "); Serial.print(addr[i], HEX); } if (OneWire::crc8(addr, 7) != addr) { Serial.println("CRC is not valid!"); return; } Serial.println(); // the first ROM byte indicates which chip switch (addr) { case 0x10: Serial.println(" Chip = DS18S20"); // or old DS1820 type_s = 1; break; case 0x28: Serial.println(" Chip = DS18B20"); type_s = 0; break; case 0x22: Serial.println(" Chip = DS1822"); type_s = 0; break; default: Serial.println("Device is not a DS18x20 family device."); return; } ds.reset(); ds.select(addr); ds.write(0x44, 1); // start conversion, with parasite power on at the end delay(1000); // maybe 750ms is enough, maybe not // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad Serial.print(" Data = "); Serial.print(present, HEX); Serial.print(" "); for (i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } Serial.print(" CRC="); Serial.print(OneWire::crc8(data, 8), HEX); Serial.println(); // Convert the data to actual temperature // because the result is a 16 bit signed integer, it should // be stored to an "int16_t" type, which is always 16 bits // even when compiled on a 32 bit processor. int16_t raw = (data << 8) | data; if (type_s) { raw = raw << 3; // 9 bit resolution default if (data == 0x10) { // "count remain" gives full 12 bit resolution raw = (raw & 0xFFF0) + 12 - data; } } else { byte cfg = (data & 0x60); // at lower res, the low bits are undefined, so let"s zero them if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms //// default is 12 bit resolution, 750 ms conversion time } celsius = (float)raw / 16.0; fahrenheit = celsius * 1.8 + 32.0; Serial.print(" Temperature = "); Serial.print(celsius); Serial.print(" Celsius, "); Serial.print(fahrenheit); Serial.println(" Fahrenheit"); }
DS18B20 підключення до Arduino— це фантастичний датчик визначення температурної складової з цифровим інтерфейсом у своєму складі — отже, він не вимагає виконання калібрування. Тому такі пристрої можна підключити одночасно в множині до одного контакту arduino. Таку можливість надає оригінальна адреса, яка була запрограмована у схему DS18B20 при його виготовленні.
Ось так виглядає ця "супер-складна" схема DS18B20 підключення до Arduino:
Тут потрібен лише один резистор і більше нічого))). До того ж тут немає потреби в калібруванні температури, а також виключаються можливі неточності при виконанні складання. Напругу живлення можна подавати в діапазоні від 3v до 5v. Все просто. А відображення температурного значення – три рядки)). Нижче показаний зразок, все досконало та чітко розписано.
Ось звідси потрібно завантажити бібліотеку:
Тут все аналогічно, код у зразку Multiple.pde. Різниця лише в тому, що застосовано деяку кількість змінних величин термометрів, що мають адреси — отже на три датчики три змінні величини зі своєю адресою і аналогічний код для пошуку:
If (!sensors.getAddress(Thermometer1, 0)) Serial.println("Не знайдено адресу датчика 0"); if (!sensors.getAddress(Thermometer2, 1)) Serial.println("Не знайдено адресу датчика 1"); if (!sensors.getAddress(Thermometer3, 2)) Serial.println("Не знайдено адресу датчика 2");
Природно і виведення температурних складових також три.