Проект 20: Датчик температури DS18B20

В цьому експерименті ми розглянемо популярний цифровий датчик температури DS18B20, що працює по протоколу 1-Wire, і створимо проект виведення показань датчика на екран РКІ WH1602.

Необхідні компоненти:

DS18B20 - цифровий термометр з програмованим дозволом від 9 до 12 бітів, яке може зберігатися в EEPROM-пам'яті приладу. DS18B20 обмінюється даними по шині 1-Wire і при цьому може бути як єдиним пристроєм на лінії, так і працювати в групі. Всі процеси на шині управляються центральним мікропроцесором.

Діапазон вимірювань датчика: від -55 ° C до +125 ° C з точністю 0,5 ° C в діапазоні від -10 ° C до +85 ° C. На додаток DS18B20 може виводиуватися напругою лінії даних (так зване живлення від паразитного джерела) при відсутності зовнішнього джерела напряженія.Каждий датчик типу DS18B20 має унікальний 64-бітний послідовний код, який дозволяє спілкуватися з безліччю датчиків DS18B20, встановлених на одній шині. Перші 8 бітів - код серії (для DS18B20 - 28h), потім 48 бітів унікального номера, і в кінці 8 бітів CRC-коду. Такий принцип дозволяє використовувати один мікропроцесор, щоб контролювати безліч датчиків DS18B20, розподілених за великим участку.В нашому експерименті ми будемо зчитувати дані з датчика температури DS18B20 і виводити на екран РКІ WH1602, який ми розглядали в експерименті 16. Схема підключення датчика температури DS18B20 і WH1602 до плати Arduino показана на рис. 20.1.


Рис. 20.1. Схема підключення датчика температури DS18B20 і WH1602 до Arduino

Приступимо до написання скетчу. Для роботи з пристроями 1-Wire в Arduino є стандартна бібліотека OneWire. Вміст скетчу для читання даних з датчика і виведення на екран індикатора WH1602 показано в лістингу 20.1.

Послідовність даних для читання даних з пристроїв 1-Wire наступна:

  1.  Провести RESET і пошук пристроїв на лінії 1-Wire.
  2.  Видати команду 0x44, щоб запустити конвертацію температури датчіком.
  3.  Почекати не менше 750 мс.
  4.  Видати команду 0xBE, щоб вважати ОЗУ датчика (данни про температуру будуть в перших двох байтах).


#include <OneWire.h>
OneWire ds (10); // лінія 1-Wire буде на pin 10
#include <LiquidCrystal.h>
// ініціалізація із зазначенням контактів підключення
LiquidCrystal lcd (12, 11, 7, 6, 5, 4);
void setup (void)
{
Serial.begin (9600);
// встановити розмірність дисплея
lcd.begin (16, 2);
lcd.clear ();
}
void loop (void)
{
int t = get_temp ();
lcd.setCursor (0,1); lcd.print ( "");
lcd.setCursor (0,1);
lcd.print (t / 16); lcd.print ( "."); lcd.print ((t% 16) * 100/16);
}
// отримання даних з датчика DS18B20
int get_temp ()
{
byte i;
byte present = 0;
byte data [12];
byte addr [8];
int Temp;
if (! ds.search (addr))
{Serial.print ( "No more addresses. \ N");
ds.reset_search ();
return -1;
}
// вивід в монітор унікальну адресу 1-Wire пристрої
lcd.setCursor (0,0);
lcd.print ( "R =");
for (i = 0; i <8; i ++)
{Lcd.print (addr [i], HEX); lcd.print ( "");}
if (OneWire: crc8 (addr, 7)! = addr [7])
{
Serial.print ( "CRC is not valid! \ N");
return -1;
}
if (addr [0]! = 0x28)
{
Serial.print ( "Device is not a DS18S20 family device. \ N");
return -1;
}
ds.reset ();
// запустити конвертацію температури датчиком
ds.write (0x44,1);
delay (750); // чекаємо 750 мс
present = ds.reset ();
ds.select (addr);
ds.write (0xBE); /
// зчитуємо ОЗУ датчика
for (i = 0; i <9; i ++)
{Data [i] = ds.read ();}
Temp = (data [1] << 8) + data [0];
return Temp;
}

Порядок підключення:

  1.  Підключаємо датчик DS18B20 і WH1602 за схемою на рис. 20.1.
  2.  Завантажуємо в плату Arduino скетч з лістингу 20.1.
  3.  Дивимося на екрані дисплея показання датчика температури.