DS18B20 это цифровой датчик температуры с интерфейсом 1-wire, с помощью этого датчика можно с легкостью
организовать считывание показаний температуры с одного или нескольких датчиков по одной линии данных.
DS18B20 подключение к Arduino — датчик температуры
DS18B20 подключение к Arduino — это фантастический датчик определения температурной составляющей с цифровым интерфейсом в своем составе — следовательно он не требует выполнения калибровки. Поэтому, такие устройства можно подключить одновременно в множественном количестве к одному контакту arduino. Такую возможность предоставляет оригинальный адрес, который был запрограммирован в схему DS18B20 при его изготовлении.
Вот так выглядит эта «супер-сложная» схема DS18B20 подключение к Arduino:
Здесь нужен всего один резистор и больше ничего))). К тому же здесь отсутствуют необходимость в калибровании температуры, а также исключаются возможные неточности при выполнении сборки. Питающее напряжение возможно подавать в диапазоне от 3v до 5v. Все элементарно. А отображение температурного значения — три строки)). Ниже показан образец, все досконально и четко расписано.
Вот отсюда нужно скачать библиотеку:
Arduino-Temperature-Control-Library
Зеркало: Arduino-Temperature-Control-Library-master. Вот скетч (в образцах у него название Single.pde):
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
#include <OneWire.h>
#include <DallasTemperature.h>
// Пин Arduino куда подключен датчик
#define ONE_WIRE_BUS 10
// Объявляем переменные
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// тут будет хранится адрес нашего датчика. Каждый DS18B20 имеет свой уникальный адрес, зашитый на заводе
DeviceAddress insideThermometer;
void setup(void)
{
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");
// Поиск устройств на выбранном пине
Serial.print("Поиск устройств...");
sensors.begin();
Serial.print("Found ");
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println(" штук.");
// определяемся с режимом питания датчиков. Они кстати могут питаться по тому же проводу, по которому отправляют данные
Serial.print("Parasite power is: ");
if (sensors.isParasitePowerMode()) Serial.println("ON");
else Serial.println("OFF");
// тут можно прописать адрес вручную
// Есть 2 варианта:
// 1) oneWire.search(deviceAddress) – сразу если известен адрес датчика
// 2) sensors.getAddress(deviceAddress, index) – по номеру подключения, начиная с 0
//insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
// Мы будем использовать 2 вариант – поищем первый датчик (номер=0):
if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Не найден адрес датчика 0");
// Показываем адрес, который нашли
Serial.print("Адрес датчика 0: ");
printAddress(insideThermometer);
Serial.println();
// устанавливаем разрешение датчика на 9 бит. Можно попробовать 10 поставить. Эта штука отвечает за точность показаний. Чем выше точность тем меньше скорость получения температуры.
sensors.setResolution(insideThermometer, 9);
Serial.print("Разрешение датчика 0: ");
Serial.print(sensors.getResolution(insideThermometer), DEC);
Serial.println();
}
// Эта волшебная функция пишет температуру в Serial
void printTemperature(DeviceAddress deviceAddress)
{
// вариант 1 - медленнее
//Serial.print("Temp C: ");
//Serial.print(sensors.getTempC(deviceAddress)); // в цельсиях
//Serial.print(" Temp F: ");
//Serial.print(sensors.getTempF(deviceAddress)); // в фаренгейтах. причем чтобы получить температуру в фаренгейтах мы делаем второй запрос к датчику.
// вариант 2 - быстрее
float tempC = sensors.getTempC(deviceAddress);
Serial.print("Temp C: ");
Serial.print(tempC);
Serial.print(" Temp F: ");
Serial.println(DallasTemperature::toFahrenheit(tempC)); // чтобы получить фаренгейты в этот раз мы не делаем второй запрос к DS18B20, а просто конвертим температуру по формуле.
}
void loop(void)
{
Serial.print("Получаем температуру...");
sensors.requestTemperatures(); // Отправка команды на получение температуры
Serial.println("готово");
// ну и теперь вывод данных
printTemperature(insideThermometer);
}
// А эта функция выводит адрес в Serial
void printAddress(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 8; i++)
{
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}
|
Подсоединение многочисленных DS18B20
При необходимости включения сразу множества DS18B20, то в таком случае необходимо включить по параллельной схеме одно сопротивление для всех модулей. Вот так как показано на изображении.
Тут все аналогично, код в образце Multiple.pde. Разница лишь в том, что применено некоторое количество переменных величин имеющих адреса термометров — следовательно на три датчика три переменные величины со своим адресом и аналогичный код для поиска:
Код:
1
2
3
|
if (!sensors.getAddress(Thermometer1, 0)) Serial.println("Не найден адрес датчика 0");
if (!sensors.getAddress(Thermometer2, 1)) Serial.println("Не найден адрес датчика 1");
if (!sensors.getAddress(Thermometer3, 2)) Serial.println("Не найден адрес датчика 2");
|
Естественно и вывода температурных составляющих также по три.