В асортименті нашого магазину з'явився датчик температури DALLAS 18B20 у вологозахищеному корпусі з широким діапазоном вимірюваних температур від -55 до + 125 ° С. Дані про вологозахищеністю і максимальній температурі в +125 градусів відразу наштовхнули на думку про екстремальний тестуванні в киплячій воді. Цим ми і займемося.
Даний датчик працює по шині 1-Wire.
Для пристроїв, що працюють по шині 1-Wire в середовищі Arduino IDE використовується бібліотека OneWire.
Останню версію бібліотеки, а також повну документацію можна знайти на сторінці розробників.
Кожне таке пристрій містить унікальний 64-бітний 'ROM' код, що складається з 8 бітів, що визначають код серії, 48 біт унікального номера і 8 біт перешкодостійкого CRC коду.
Інформація про виміряної температурі зберігається в оперативній пам'яті датчика, яка складається з 9 байт.
1 і 2 байти зберігають інформацію про температуру.
3 і 4 байти зберігають відповідно верхній і нижній межі температури.
7 і 8 байти використовуються для надточного вимірювання температури.
9 байт зберігає перешкодостійкий CRC код попередніх 8 байт.
Основні команди, які використовуються при роботі з бібліотекою:
Виконує пошук наступного 1-Wire пристрої, якщо пристрій знайдено, то в 8 байтний масив addressArray записується його ROM код, інакше повертає false.
Виконує новий пошук з першого пристрою.
Відновлення наведених шини, необхідно перед зв'язком з датчиком.
Виконує вибір пристрою після скидання, передається ROM Код пристрою.
Передає інформаційний байт на пристрій
Передає інформаційний байт на пристрій, що працює в паразитному режимі харчування
Зчитує інформаційний байт з пристрою
Обчислює CRC код байтів з масиву dataArray, довжиною length
За допомогою команди write, ми можемо передавати керуючі команди на датчик у вигляді байтів, розглянемо основні з них:
0x44 - провести вимірювання температури і записати дані в оперативну пам'ять
0x4E - записати 3 байта в 3й, 4й та 5й байти оперативної пам'яті
0xBE - вважати послідовно 9 байт оперативної пам'яті
0x48 - скопіювати 3й і 4й байти оперативної пам'яті в EEPROM
0xB8 - скопіювати дані з EEPROM В 3й і 4й байти оперативної пам'яті
0xB4 - поверне тип харчування (0 - паразитное, 1 - зовнішнє)
Підключення до Arduino
З датчика виходять три дроти:
Червоний: "+" харчування.
Чорний: "-" харчування
Білий: Висновок вихідного сигналу
Підключення датчика:
Червоний: на + 5 Вольт Arduino.
Чорний на будь-який з GND пинов Arduino.
Білий на любий цифровий вхід Arduino (в прикладі D10).
Для роботи датчика необхідно з'єднати сигнальний провід з проводом харчування резистором номіналом 4.7 кОм.
Для початку розглянемо найкорисніший приклад для роботи з датчиком - висновок показань температури в монітор порту.
Приклад програмного коду
Dallas18B20 екстремальне тестування
У схему було додано реле, для автоматичного відключення кип'ятильника при температурі 99.5 ° С. Щоб не різати дроти на кип'ятильник підключимо через розетку, всередині якої знаходиться вищезазначене реле.
OneWire ds (10); // Підключаємо датчик до 10 цифровому піну
void setup (void) Serial.begin (9600);
pinMode (3, OUTPUT);
// Включаємо кип'ятильник
digitalWrite (3, LOW);
>
void loop (void) byte i;
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;
>
// Перевіряємо чи не було перешкод при передачі
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");
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 (0xBE); // Прочитуємо оперативну пам'ять датчика
for (i = 0; i <9; i++) <
data [i] = ds.read (); // Заповнюємо масив ліченими даними
>
// Дані про температуру містяться в перших двох байтах, переведемо їх в одне значення і перетворимо в Шестнадцатіразрядное число
int16_t raw = (data [1] <<8) | data[0];
if (type_s) raw = raw <<3;
if (data [7] == 0x10) raw = (raw 0xFFF0) + 12 - data [6];
>
>
else byte cfg = (data [4] 0x60);
if (cfg == 0x00) raw = raw
7;
else if (cfg == 0x20) raw = raw
3;
else if (cfg == 0x40) raw = raw
1;
>
celsius = (float) raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
Serial.print ( "Temp =");
Serial.print (celsius);
Serial.print ( "C,");
Serial.print (fahrenheit);
Serial.println ( "F");
// Якщо температура досягає температури кипіння (з похибкою), відключаємо кип'ятильник
if (celsius> 99.5)
digitalWrite (3, HIGH);
>
>
Купити в РоссііDallas 18B20 у вологозахищеному корпусі