Підключення датчика ds18b20 до Ардуїно. Датчик температури Arduino DS18B20

Датчик температури в 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 * Підключення ds18b20 до ардуїно через пін 8 */ OneWire ds(8); // Створюємо об'єкт OneWire для шини 1-Wire, за допомогою якого буде здійснюватися робота з датчиком void setup()( Serial.begin(9600); ) void loop()( // Визначаємо температуру від датчика DS18b20 byte data; // Місце для значення температури ds.reset(); // Починаємо взаємодію зі скидання всіх попередніх команд і параметрів ds.write(0xCC); ; // Даємо датчику DS18b20 команду виміряти температуру. значення виміряної температури ds.write(0xCC); ds.write(0xBE); // Просимо передати нам значення регістрів зі значенням температури // Отримуємо відповідь data = ds.read(); ds.read(); // А тепер старший // Формуємо підсумкове значення: // - спершу "склеюємо" значення, // - потім множимо його на коефіцієнт, що відповідає роздільній здатності (для 12 біт за замовчуванням - це 0,0625) float temperature = ((data<< 8) | data) * 0.0625; // Выводим полученное значение температуры в монитор порта Serial.println(temperature); }

Скетч для роботи з датчиком ds18b20 без delay

Можна трохи ускладнити програму для ds18b20, щоб позбавитися від того, що гальмує виконання скетчу.

#include OneWire ds(8); // Об'єкт OneWire int temperature = 0; // Глобальна змінна для зберігання значення температури датчика DS18B20 long lastUpdateTime = 0; // Змінна для зберігання часу останнього зчитування датчика const int TEMP_UPDATE_TIME = 1000; // Визначаємо періодичність перевірок void setup()( Serial.begin(9600); ) void loop()( detectTemperature(); // Визначаємо температуру від датчика DS18b20 Serial.println(temperature); // Виводимо отримане значення температури // Т .к. змінна temperature має тип int, дробова частина буде просто відкидатися ) int detectTemperature()( byte data; ds.reset(); ds.write(0xCC); ds.write(0x44); if (millis() - lastUpdateTime > TEMP_UPDATE_TIME) ( lastUpdateTime = millis(); ds.reset(); ds.write(0xCC); ds.write(0xBE); data = ds.read(); data = ds.read(); // Формуємо значення temperature = (data<< 8) + data; temperature = temperature >> 4; } }

Бібліотека DallasTemperature та DS18b20

У своїх скетчах ми можемо використовувати бібліотеку DallasTemperature, яка спрощує деякі аспекти роботи з датчиком DS18B20 по 1-Wire. Приклад скетчу:

#include // Номер піна Arduino із підключеним датчиком #define PIN_DS18B20 8 // Створюємо об'єкт OneWire OneWire oneWire(PIN_DS18B20); // Створюємо об'єкт DallasTemperature до роботи з сенсорами, передаючи йому посилання на об'єкт до роботи з 1-Wire. DallasTemperature dallasSensors(&oneWire); // Спеціальний об'єкт зберігання адреси пристрою DeviceAddress sensorAddress; void loop(void)( // Запит на вимірювання датчиком температури Serial.print("Вимірюємо температуру..."); dallasSensors.requestTemperatures(); // Просимо ds18b20 зібрати дані Serial.println("Виконано"); // Запит для отримання збереженого значення температури printTemperature(sensorAddress); // Затримка для того, щоб можна було щось розібрати на екрані delay(1000); dallasSensors.getTempC(deviceAddress); Serial.print("Temp C: "); Serial.println(tempC);< 8; i++) { if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } }

Бібліотека OneWire для роботи з DS18B20

DS18B20 використовує для обміну інформацією з Ардуін протокол 1-Wire, для якого вже написана відмінна бібліотека. Можна і потрібно використовувати її, щоб не реалізовувати всі функції вручну. . Для встановлення бібліотеки завантажте архів, розпакуйте в папку library вашого каталогу Arduino. Підключається бібліотека за допомогою команди #include

Усі датчики DS18B20 підключаються паралельно, їм всіх достатньо одного резистора. За допомогою бібліотеки OneWire можна одночасно рахувати всі дані з усіх датчиків. Якщо кількість датчиків, що підключаються більше 10, потрібно підібрати резистор з опором не більше 1,6 кОм. Також для більш точного вимірутемператури потрібно поставити додатковий резистор на 100...120 Ом між виходом data на платі Ардуїно та data на кожному датчику. Дізнатися, з якого датчика отримано те чи інше значення, можна за допомогою унікального 64-бітного серійного коду, який буде виданий в результаті виконання програми.

Для підключення температурних датчиків у нормальному режимі необхідно використовувати схему, представлену малюнку.

Висновки

Мікросхема Dallas DS18B20 є дуже цікавим пристроєм. Датчики температури і термометри, створені на її основі, мають прийнятні для більшості завдань характеристики, розвинений функціонал, відносно не дорогі. Особливу популярність датчик DS18B20 отримав як вологозахищений пристрій для вимірювання температури рідин.

За додаткові можливостідоводиться платити відносною складністю роботи з датчиком. Для підключення DS18B20 нам обов'язково знадобиться резистор із номіналом близько 5К. Для роботи з датчиком у скетчах ардуїно потрібно встановити додаткову бібліотеку та отримати певні навички для роботи з нею – там не зовсім тривіально. Втім, можна купити вже готовий модуль, а для скетчу здебільшого вистачить простих прикладів, наведених у цій статті.

Розглянемо як за допомоги 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 має різні форм-фактори. Отже, вибір, який саме використовувати, залишається за вами. Доступно три варіанти: 8-Pin SO (150 mils), 8-Pin µSOP, та 3-Pin TO-92. Серфінг eBay або Aliexpress показує, що китайці пропонують версію TO-92 у вологозахищеному корпусі. Тобто ви можете сміливо занурювати подібне диво у воду, використовувати під дощем і т.д. і т.п. Ці сенсори виготовляються з трьома вихідними контактами (чорний – GND, червоний – Vdd та білий – Data).

Різні форм-фактори датчиків DS18B20 наведені нижче.

Модель DS18B20 у вологозахищеному корпусі:


DS18B20 зручний у використанні. Запитати його можна через контакт data (у такому разі ви використовуєте всього два контакти з трьох для підключення!). Сенсор працює в діапазоні напруг від 3.0 до 5.5 і вимірює температуру в діапазоні від -55°C до +125°C (від -67°F до +257°F) з точністю ±0.5°C (від -10°C до +85°C).

Ще одна крута фіча: ви можете підключити паралельно до 127 датчиків! та зчитувати показання температури з кожного окремо. Не зовсім зрозуміло, в якому проекті подібне може знадобитися, але підключити два сенсори та контролювати температуру в холодильнику та морозильній камері можна. При цьому ви залишите вільними купу пінів на Arduino... Загалом фіча приємна.

Що вам знадобиться для контролю температури за допомогою Arduino та DS18B20

Програмне забезпечення

  • Звичайно, вам потрібна Arduino IDE;
  • Бібліотека OneWire library, яка значно полегшує роботу з Arduino та датчиком DS18B20;
  • Скетч...

Завантажуємо скетч на Arduino

Скетч, який представлений нижче, є у бібліотеці OneWire, у категорії examples. Перейдіть до "File" - "Examples" - "OneWire" і виберіть приклад "DS18x20_Temperature". Код програми наведено нижче.

Даний приклад використовує бібліотеку OneWire Library, щоб зібрати дані з усіх підключених датчиків температури DS28B20 (як підключити кілька сенсорів описано в кінці статті) та відобразити їх у вікні серійного монітора Arduino IDE.

У вікні серійного монітора ви побачите приблизно таке:

ROM = 28 88 84 82 5 0 0 6A

No more addresses.

ROM = 28 88 84 82 5 0 0 6A

Data = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1

Температура = 21.37 Celsius, 70.47 Fahrenheit

No more addresses.

ROM = 28 88 84 82 5 0 0 6A

Data = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1

Температура = 21.37 Celsius, 70.47 Fahrenheit

No more addresses.

Переконайтеся, що ви вказали правильні піни!

У рядку 10, де вказано "OneWire ds(2);" встановлюється пін, якого підключений контакт data з сенсора.

У цьому прикладі використаний пін 2, але значення стандартного піна в прикладі OneWire стоїть на 10. Можна використовувати і його.

#include <OneWire.h>

// Приклад використання бібліотеки OneWire DS18S20, DS18B20, DS1822

OneWire ds(2); // на піні 10 (потрібний резистор 4.7 кому)

void setup(void) (

Serial.begin(9600);

void loop (void) (

byte present = 0;

float celsius, fahrenheit;

if (!ds.search(addr)) (

Serial.println("No more addresses.");

Serial.println();

ds.reset_search();

Serial.print("ROM =");

Serial.write(" ");

Serial.print(addr[i], HEX);

if (OneWire::crc8(addr, 7) != addr) (

Serial.println("CRC is not valid!");

Serial.println();

// Перший байт визначає чіп

Serial.println(" Chip = DS18S20"); // або старіший DS1820

Serial.println(" Chip = DS18B20");

Serial.println(" Chip = DS1822");

Serial.println("Device is not a DS18x20 family device.");

ds.select(addr);

delay(1000); // 750 може бути достатньо, а може і не вистачить

// ми могли б використовувати тут ds.depower(), але reset подбає про це

present = ds.reset();

ds.select(addr);

Serial.print("Data=");

Serial.print(present, HEX);

Serial.print(" ");

data[i] = ds.read();

Serial.print(data[i], HEX);

Serial.print(" ");

Serial.print("CRC=");

Serial.print(OneWire::crc8(data, 8), HEX);

Serial.println();

// конвертуємо даний у фактичну температуру

// Оскільки результат є 16 бітним цілим, його треба зберігати в

// змінною з типом даних "int16_t", яка завжди дорівнює 16 біт,

// навіть якщо ми проводимо компіляцію на 32-бітному процесорі

int16_t raw = (data

if (data == 0x10) (

raw = (raw & 0xFFF0) + 12 - data;

byte cfg = (data & 0x60);

// при маленьких значеннях, малі біти не визначені, давайте їх обнулилим

if (cfg == 0x00) raw = raw & ~7; // Роздільна здатність 9 біт, 93.75 мс

else if (cfg == 0x20) raw = raw & ~3; // Роздільна здатність 10 біт, 187.5 мс

else if (cfg == 0x40) raw = raw & ~1; // Роздільна здатність 11 біт, 375 мс

//// Роздільна здатність за замовчуванням дорівнює 12 біт, час перетворення - 750 мс

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?

Можна підключити кілька цифрових датчиків температури DS18B20 паралельно. При цьому бібліотека OneWire library дозволить зчитувати дані з усіх датчиків одночасно.

Нижче описано два методи підключення сенсорів.

Для великої кількості сенсорів (більше 10), треба використовувати резистори з меншим опором (наприклад, 1.6 кім або навіть менше).

Крім того, якщо ви підключаєте паралельно більше 10 датчиків, можуть виникнути проблеми (похибки під час знімання показань). Тому рекомендується встановлювати додатковий резистор опором 100...120 Ом між контактом data на Arduino та data на кожному сенсорі!

Результат роботи попереднього скетчу з двома підключеними сенсорами може виглядати приблизно так:

ROM = 28 88 84 82 5 0 0 6A

Data = 1 51 1 4B 46 7F FF F 10 FE CRC = FE

Температура = 21.06 Celsius, 69.91 Fahrenheit

ROM = 28 DA CA 27 5 0 0 49

Data = 1 4E 1 4B 46 7F FF 2 10 D9 CRC=D9

Температура = 20.87 Celsius, 69.57 Fahrenheit

No more addresses.

Вибираємо правильний сенсор

Було б непогано знати, з якого сенсора ви отримуєте дані, коли ви використовуєте паралельно кілька датчиків. Як це зробити?

Серійний номер

Так як цифрові датчики, у кожного з них є індивідуальний серійний номер, який можна використовувати для розпізнавання того чи іншого сенсора. Начебто все просто. Але... адже нам треба попередньо визначити ці серійні номери, перш ніж використовувати їх для впізнавання сенсора, правильно?

Ви могли звернути на прикладах вище, що скетч видає нам дані у вигляді 64-бітового серійного номера – значення “ROM”. Наприклад:

28 88 84 82 5 0 0 6A або 28 DA CA 27 5 0 0 49 у прикладі вище.

Не забувайте, якщо ви використовуєте одночасно велику кількість датчиків (10 і більше), треба додати резистори 100...120 Ом між контактами data із сенсора DS18B20 та піном data на Arduino (для кожного датчика!).

Нижче показано схему паралельного підключення кількох сенсорів з використанням трьох контактів.


Залишайте Ваші коментарі, питання та поділіться особистим досвідом нижче. У дискусії часто народжуються нові ідеї та проекти!

Так історично склалося, що на даний момент одним із найпопулярніших цифрових температурних датчиків є датчик 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 – якщо пристрій відсутній на шині (імпульсу у відповідь не було).
void write(uint8_t v, uint8_t power = 0);

Запис байт. Передає байт пристрій на шині.

Відправимо команду 0x44ініціалізації вимірювання температури.

Пауза 1 сек.Очікування на час, необхідне виконання датчиком перетворення температури. Цей час залежить від обраної роздільної здатності датчика. Роздільна здатність 12 біт встановлено в датчику за замовчуванням. Час перетворення йому – 750 мс.

Потім ми відправляємо команду Reset, Skip ROM (0xCC) , а поміт команду 0xBE читання пам'яті датчика.

Ось і сам код із бібліотеки:

#include // OneWire DS18S20, DS18B20, DS1822 Temperature Example // // http://www.pjrc.com/teensy/td_libs_OneWire.html // // DallasTemperature library може зробити все це для вас! // http://milesburton.com/Dallas_Temperature_Control_Library OneWire ds(10); // датчик на виводі 10 (а резистор 4.7 K є необхідним) 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.print("ROM =");< 8; i++) { Serial.write(" "); Serial.print(addr[i], HEX); } if (OneWire::crc8(addr, 7) != addr) { Serial.println("CRC недопустимый!"); return; } Serial.println(); // первый байт ROM указывает, какой чип (8 бит код чипа, 48 бит серийный номер, 8 бит CRC) 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("Не является устройством семейства DS18x20."); return; } ds.reset(); ds.select(addr); ds.write(0x44, 0); // старт преобразования с питание от внешнего источника. delay(1000); // ждем конца преобразования. // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(addr); ds.write(0xBE); // Читаем память. Serial.print(" Data = "); Serial.print(present, HEX); Serial.print(" "); for (i = 0; i < 9; i++) { // нам нужно 9 байт data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } Serial.print(" CRC="); Serial.print(OneWire::crc8(data, 8), HEX); Serial.println(); // Преобразование данных в фактическую температуру //поскольку результатом является 16-разрядное целое число со знаком // ранится в типе "int16_t", который всегда составляет 16 бит // даже при компиляции на 32-битном процессоре. int16_t raw = (data << 8) | data; if (type_s) { raw = raw << 3; // 9 бит разрешение по умолчанию у датчиков DS18S20 or old DS1820 if (data == 0x10) { // "количество остается" дает полное разрешение 12 бит raw = (raw & 0xFFF0) + 12 - data; } } else { byte cfg = (data & 0x60); // при более низком разрешении низкие биты не определены, поэтому давайте обнуляем их. 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"); }

Власне це бібліотека підходить для всіх датчиків сімейства. DS18(DS18B20, DS18S20, DS1820, DS1822) підключення не чим не відключаються. Ну а деякі відмінності можна вже дізнатися з даних,що до них.

У попередніх уроках ми вже працювали з датчиком температури та вологості DHT11, а також із терморезистором. На цей раз спробуємо розібратися ще з одним популярним датчиком, що вимірює температуру - DS18B20. Цей пристрій дозволяє вимірювати температуру від –55°C до +125°C з точністю ±0.5°C (при температурі від –10°C до +85°C). Харчуватись DS18B20 може як від 3.3, так і від 5 Вольт. Сам по собі датчик це мікросхема, яка може зустрічатися в різних корпусах: Також популярними є готові модулі, на яких розміщений датчик, резистор підтяжки і роз'єм.
Інший варіант - датчик у герметичній сталевій капсулі з проводом:

1. Підключення модуля DS18B20-ROC до Ардуїно

У цьому уроці ми будемо працювати з модулем датчика температури, розробленим у RobotClass. Підключати ми його будемо до контролера Ардуїно Уно. Як і DHT11, датчик DS18B20 використовує однопровідну шину (1-wire) для обміну даними з контролером. Так що нам знадобиться всього три дроти щоб підключити датчик до Ардуїно. Принципова схема Зовнішній вигляд макету
Примітка.У разі використання не модуля, а окремої мікросхеми необхідно виведення мікросхеми OUT з'єднати з контактом живлення через резистор 4,7 КОм. У зазначеному вище модулі цей резистор вже встановлено.

2. Програма для отримання даних із датчика DS18B20

Напишемо програму, яка кожну секунду зчитуватиме показання температури з датчика і виводитиме їх у COM-порт. #include OneWire ds(2); void setup() ( Serial.begin(9600); ) void loop() ( byte i; byte data; byte addr; float celsius; // пошук адреси датчика if (!ds.search(addr)) ( ds.reset_search( );delay(250); ds.reset(); .select(addr); ds.write(0xBE); // команда початку читання виміряної температури // зчитуємо показання температури з внутрішньої пам'яті датчика for (i = 0; i< 9; i++) { data[i] = ds.read(); } int16_t raw = (data << 8) | data; // датчик может быть настроен на разную точность, выясняем её byte cfg = (data & 0x60); if (cfg == 0x00) raw = raw & ~7; // точность 9-разрядов, 93,75 мс else if (cfg == 0x20) raw = raw & ~3; // точность 10-разрядов, 187,5 мс else if (cfg == 0x40) raw = raw & ~1; // точность 11-разрядов, 375 мс // преобразование показаний датчика в градусы Цельсия celsius = (float)raw / 16.0; Serial.print("t="); Serial.println(celsius); } Процедура на первый взгляд может показать совершенно непонятной. На самом деле, все эти 0xBE, 0x44 и т.п. взяты из спецификации к датчику. Для удобства мы можем всю процедуру вычисления выделить в отдельную функцию или даже в отдельный модуль. Загружаем программу на Ардуино и запускаем монитор COM-порта. В окне терминала мы должны увидеть данные о температуре, обновляющиеся раз в секунду: t=23.15 t=23.47 t=23.32 Вот и всё, датчик работает!

Висновок

За допомогою датчика температури можна зробити найпростішу систему автоматичної вентиляції у квартирі або у теплиці. Достатньо додати до програми оператор умови, який перевірятиме досягнення температурою певного значення та включатиме вентилятор за допомогою реле. Так само ми працювали