Термометр ds18b20 і його підключення до arduino

DS18B20 - цифровий датчик температури. Датчик дуже простий у використанні. По перше, він цифровий, а по друге – у нього всього лише один контакт, з якого ми отримуємо корисний сигнал. при бажанні змінивши колір маски та назву (деякі китайці не бажають =), ви можете підключити до одного Arduino одночасно величезну кількість цих сенсорів. Пінов буде більш ніж достатньо. Мало того, ви навіть можете підключити кілька сенсорів до одного піну Arduino! Але про все по порядку.

Arduino датчик температури DS18B20

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

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

Arduino датчик температури DS18B20

Модель 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

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

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

Завантажити Arduino IDE можна з офіційного сайту Arduino.

Бібліотеку OneWire Library можна завантажити на OneWire Project Page (бажано завантажувати останню версію бібліотеки).

Обладнання

  • Як мінімум один цифровий датчик температури DS18B20;
  • Контролер Arduino (у цьому прикладі використовується Arduino Uno);
  • 3 конектора;
  • Монтажна плата (Breadboard);
  • USB кабель для підключення Arduino до персонального комп'ютера.

USB кабель необхідний для програмування нашого Arduino. Після того, як ви “заллєте” скетч на плату, можна підключати її до окремого джерела живлення.

Підключення DS18B20 до Arduino

Датчик підключається елементарно.

Контакт GND з DS18B20 підключається до GND Arduino.

Контакт Vdd з DS18B20 підключається до +5V на Arduino.

Контакт Data з DS18B20 підключається до будь-якого цифрового піну на Arduino. У цьому прикладі використовується пін 2.

Єдине, що необхідно додати із зовнішньої додаткової обв'язки – це підтягуючий резистор на 4.7 кому.

Схема підключення DS18B20 до Arduino показана нижче (у скетчі, який буде наведено нижче, перевірте рядки 10 і 65. У них вказані піни, до яких ви підключали контакт сигналу з датчика та режим живлення!):

Підключення DS18B20 до Arduino

На малюнку нижче наведено фотографію нашої простої схеми "в житті".

Підключення DS18B20 до Arduino 2

Паразитне та звичайне харчування

Є альтернативний варіант підключення – так зване паразитне підключення. У цьому випадку ми не підключатимемо пін +5V до піну Vdd на датчику DS18B20. Натомість ми підключимо контакт Vdd з датчика DS18B20 до GND. Переваги такого підключення очевидні: нам знадобиться лише два конектори!

Недоліком такого підключення є обмеження кількості сенсорів, що одночасно підключаються.. Кабелі для підключення мають бути максимально короткими!

В загальному, з "паразитним" підключенням треба бути акуратнішим і краще його все-таки не використовувати. Результати (значення температур) можуть виявитися несподіваними.

Ескіз для датчика Arduino та DS18B20

Встановлюємо бібліотеку OneWire Library

Після того як ви завантажили архів з бібліотекою, її треба імпортувати. Для цього в Arduino IDE виберіть “Sketch” – “Import Library” – “Add Library” та виберіть архів, який ви скачали. Якщо у вас виникли проблеми, з установкою бібліотеки, ознайомтеся з інструкцією з встановлення бібліотек в Arduino.

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

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

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

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

ПЗУ = 28 88 84 82 5 0 0 6A

Мікросхема = DS18B20

Дані = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1

Температура = 21.37 Цельсія, 70.47 Фаренгейта

Більше жодних адрес.

ПЗУ = 28 88 84 82 5 0 0 6A

Мікросхема = DS18B20

Дані = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1

Температура = 21.37 Цельсія, 70.47 Фаренгейта

Більше жодних адрес.

ПЗУ = 28 88 84 82 5 0 0 6A

Мікросхема = DS18B20

Дані = 1 56 1 4B 46 7F FF A 10 D1 CRC=D1

Температура = 21.37 Цельсія, 70.47 Фаренгейта

Більше жодних адрес.

Звичайне чи паразитне харчування?

DS18B20 може працювати у звичайному або так званому “паразитному” режимі. У звичайному режимі для підключення використовується 3 конектора, у “паразитному” режимі – у його лише 2.

Вам потрібно налаштувати правильний режим у скетчі, щоб зняти достовірні показання з датчика:

  • Для “паразитного” режиму у рядку 65 треба вказати: ds.write(0x44, 1);
  • Для звичайного режиму в рядку 65 вказується: ds.write(0x44);

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

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

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

#включити <OneWire.h>
// приклад використання бібліотеки OneWire DS18S20, DS18B20, DS1822
OneWire ds(2); // і сосна 10 (Потрібен резистор 4.7 КОм)
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
if ( !ds.search(addr)) {
Serial.println("No more addresses.");
Serial.println();
ds.reset_search();
delay(250);
return;
}
Serial.print("ROM =");
for( i = 0; я < 8; i++) {
Serial.write(' ');
Serial.print(addr[i], HEX);
}
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return;
}
Serial.println();
// первый байт определяет чип
switch (addr[0]) {
case 0x10:
Serial.println(" Chip = DS18S20"); // или более старый DS1820
type_s = 1 0 0;
break;
default:
Serial.println("Device is not a DS18x20 family device.");
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44); // починаємо перетворення, используя ds.write(0x44,1) с "паразитным" питанием
delay(1000); // 750 може бути достатньо, а може й не вистачить
// ми могли б використати тут ds.depower(), но reset позаботится об этом
present = ds.reset();
ds.select(addr);
ds.write(0xBE);
Serial.print(" Data = ");
Serial.print(present,  0; я < 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[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // дозвіл 9 бит по умолчанию
if (data[7] == 0x10) {
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
// при маленьких значеннях, малі біти не визначені, давайте их обнулим
if (cfg == 0x00) raw = raw & ~7; // дозвіл 9 WeMOS ARDUINO NANO TTGO XI 8F328P-U, 93.75 мс
else if (cfg == 0x20) raw = raw & ~3; // дозвіл 10 WeMOS ARDUINO NANO TTGO XI 8F328P-U, 187.5 мс
else if (cfg == 0x40) raw = raw & ~1; // дозвіл 11 WeMOS ARDUINO NANO TTGO XI 8F328P-U, 375 мс
//// дозвіл за замовчуванням дорівнює 12 WeMOS ARDUINO NANO TTGO XI 8F328P-U, час перетворення - 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 КОМ або навіть менше).

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

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

ПЗУ = 28 88 84 82 5 0 0 6A

Мікросхема = DS18B20

Дані = 1 51 1 4B 46 7F FF F 10 FE CRC=FE

Температура = 21.06 Цельсія, 69.91 Фаренгейта

ПЗУ = 28 ЯКЩО 27 5 0 0 49

Мікросхема = DS18B20

Дані = 1 4Е 1 4B 46 7F FF 2 10 D9 CRC=D9

Температура = 20.87 Цельсія, 69.57 Фаренгейта

Більше жодних адрес.

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

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

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

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

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

28 88 84 82 5 0 0 6І або 28 ЯКЩО 27 5 0 0 49 у прикладі вище.

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

Нормальний режим харчування

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

Нормальний режим харчування

Паразитний режим живлення

У “паразитному” режимі контакт Vdd залишається практично не задіяний. Живлення датчика здійснюється через контакт data.

Паразитний режим живлення

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

Посилання на джерело: http://arduino-diy.com/arduino-tsifrovoy-datchik-temperatury-DS18B20