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

В этом эксперименте мы рассмотрим популярный цифровой датчик температуры DS18B20, работающий по протоколу 1-Wire, и создадим проект вывода показаний датчика на экран ЖКИ WH1602.

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

контроллер Arduino UNO R3;
плата для прототипирования;
датчик DS18B20;
LCD-экран WH1602;
резистор 50 Ом;
• потенциометр 1 кОм;
провода папа-папа.
внешний блок питания +5 В.

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.

цифровой датчик температуры DS18B20
Рис. 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 ds(10); // линия 1-Wire будет на pin 10
#include
// инициализация с указанием контактов подключения
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. Смотрим на экране дисплея показания датчика температуры.

Листинги программ скачать


 

Вверх