В попередньому уроці ми розглянули, як підключити датчик температури DS18B20 до Arduino та вивести показання на дисплей. Розглянемо детальніше, як змінити точність вимірювання та підключити кілька датчиків.
Основні параметри датчика DS18B20:
- Унікальний інтерфейс 1-Wire: вимагає тільки один контакт для зв’язку
- Кожний пристрій має унікальну 64-бітову серійну адресу пристрою, яка зберігається в ROM
- Живлення датчика в діапазоні від 3 В до 5,5 В
- Діапазон вимірюваних температур від -55 °C до +125 °C
- Доступний в трьох варіантах корпусів 8-pin SO (150 mils), 8-pin µSOP і 3-pin TO-92
Схема датчика DS18B20
Датчик температури DS18B20 працює з Arduino через протокол передачі даних 1-Wire і дозволяє підключити кілька датчиків на одну шину.
Датчики підключаються до Arduino двома способами:
- · Зовнішнє підключення (через три проводи)
- · Паразитне підключення (через два проводи)
Ми розглянемо зовнішнє підключення. в якому обмін даними здійснюється через середній вивід датчика DQ. Між виводами DQ і VDD треба підключити резистор номіналом 4,7 кОм. Живлення підключається до виводів VDD і GND, тобто, VDD підключаємо к + живлення 5 вольт, а GND - до мінусу живлення (земля). DQ підключаємо до цифрового виводу 2 на Arduino UNO.
Якщо треба підключити більше датчиків, то додаємо додаткові датчики за схемою:
Кожний датчик температури має унікальну 64-бітову адресу пристрою, за якою у нас є можливість опитати визначений датчик і прочитати з нього значення температури.
Для роботи з датчиком рекомендується бібліотека DallasTemperature, як більш зручна та практична. Як встановити бібліотеку ми розглядали на попередніх уроках.
Після успішного завантаження бібліотеки і встановлення, запускаємо Arduino IDE, переходимо до прикладів роботи с датчиком, і вибираємо приклад Multiple:
Звертаємо увагу на рядок #define ONE_WIRE_BUS 2, де 2 - це номер цифрового виводу Arduino, до якого підключений датчик (якщо ми вибрали інший вивід. То змінюємо значення 2 на інше) і заливаємо скетч в нашу плату Arduino.
Відкриваємо монітор послідовного порту (Tools -> Serial Monitor):
Відкриваємо монітор порту, знімаємо позначку з “Автопрокрутка” і переміщуємося в самий верх вікна монітору порту:
Бачимо рядки:
- · Locating devices…Found 2 devices – кількість підключених датчиків 2 штуки
- · Parasite power is: OFF – паразитне підключення відключене (у нас датчики підключені зовнішнім підключенням)
- · Device 0 Address: 280054B604000092 – адреса першого підключеного датчика
- · Device 1 Address: 289E95B504000057 – адреса другого підключеного датчика
- · Device 0 Resolution: 9 – режим вимірювання першого датчика
- · Device 1 Resolution: 9 – режим вимірювання другого датчика
Далі рядки:
- · Requesting temperatures…DONE – запит отримання температури з датчиків
- · Device Address: 280054B604000092 Temp C: 7.00 Temp F: 44.60 – адреса датчика, температура в градусах Цельсія і температура по Фаренгейту
- · Device Address: 289E95B504000057 Temp C: 27.50 Temp F: 81.50 – адреса датчика, температура в градусах Цельсія і температура по Фаренгейту
Датчики, як бачимо, працюють і ми отримуємо температуру.
Для зручного відображення температури і зчитування даних з одного датчика без використання бібліотеки, можна використати простіший код, Додамо в код кілька рядків, які дозволять задавати точність АЦП датчика, а також вкажемо рекомендовану затримку перетворення, яку треба збільшувати з ростом точності перетворення:
#include <OneWire.h>
OneWire ds(2);
void setup()
{
Serial.begin(9600);
// встановлюємо розрядність АЦП 9 біт, для прикладу, бо така розрядність за замовчуванням
sensors.setResolution(insideThermometer, 9);
Serial.print("Device 0 Resolution: ");
Serial.print(sensors.getResolution(insideThermometer), DEC);
Serial.println();
}
void loop()
{
byte data[2];
ds.reset();
ds.write(0xCC);
ds.write(0x44);
delay(750); // Для розрядності 10 – не менше 200 мс, для 11 – 400 мс, а для 12 – не менше 750 мс
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
data[0] = ds.read();
data[1] = ds.read();
int Temp = (data[1]<< 8)+data[0];
Temp = Temp>>4;
Serial.println(Temp);
}
Підключення кількох датчиків
Для відображення температури з двох і більше датчиків рекомендується використати наведений нижче код:
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer1 = {
0x28, 0x00, 0x54, 0xB6, 0x04, 0x00, 0x00, 0x92 }; // адреса датчика DS18B20 280054B604000092
DeviceAddress Thermometer2 = {
0x28, 0x9E, 0x95, 0xB5, 0x04, 0x00, 0x00, 0x57 };
void setup()
{
sensors.begin();
sensors.setResolution(Thermometer1, 10);
sensors.setResolution(Thermometer2, 10);
Serial.begin(9600);
// встановлюємо розрядність АЦП 9 біт
sensors.setResolution(insideThermometer, 9);
Serial.print("Device 0 Resolution: ");
Serial.print(sensors.getResolution(insideThermometer), DEC);
Serial.println();
}
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
Serial.println(tempC);
}
void loop()
{
sensors.requestTemperatures();
Serial.print("Sensor1 ");
printTemperature(Thermometer1);
Serial.print("Sensor2 ");
printTemperature(Thermometer2);
delay(100);
}
В рядку #define ONE_WIRE_BUS 2 вказуємо номер використаного виводу 2, завантажуємо код, відкриваємо монітор порту:
6
Де у нас Sensor1 7.50 температура в градусах Цельсія на датчику 1, який доступний за адресою 0x28, 0x00, 0x54, 0xB6, 0x04, 0x00, 0x00, 0x92, а Sensor2 27.75 - температура другого датчика, доступного за адресою 0x28, 0x9E, 0x95, 0xB5, 0x04, 0x00, 0x00, 0x57.
Якщо ж треба підключити три і більше датчиків, то ми змінюємо код. Для початку нам треба запустити тестовий скетч Multiple, потім записати адреси всіх датчиків (наприклад, 280054B604000086, яку потім переводимо в формат адреси 0x28, 0x00, 0x54, 0xB6, 0x04, 0x00, 0x00, 0x86).
Після цього в скетчі вище, після рядка
DeviceAddress Thermometer2 = {
0x28, 0x9E, 0x95, 0xB5, 0x04, 0x00, 0x00, 0x57 };
додаємо рядок з адресою нашого третього датчика:
DeviceAddress Thermometer3 = {
0x28, 0x00, 0x54, 0xB6, 0x04, 0x00, 0x00, 0x86 };
потім в void setup() додаємо рядок:
sensors.setResolution(Thermometer3, 10);
і переходимо до циклу void loop(), в який додаємо рядки, які відповідають за відображення температури з третього датчика:
Serial.print("Sensor3 ");
printTemperature(Thermometer3);
Для відображення, наприклад, п’яти датчиків, просто дописуємо код, як це робили вище.
За матеріалами: arduino-project.net