DS18B20 это сказочный датчик температуры, который имеет цифровой интерфейс, а значит его не нужно калибровать и их можно подключить сразу много к одному пину ардуины, так как каждый DS18B20 имеет свой уникальный адрес, зашитый на заводе.
Выглядит эта мегасложная схема так:
Ну то есть надо резистор и все))) И вообще нет никаких калибровок температуры и ошибок монтажа, питание втыкать можно от 3 до 5 вольт. Просто сказка. А получение температуры — 3 строчки)) Внизу пример, ну очень подробно все расписано.
Качаем эту библиотеку: https://github.com/milesburton/Arduino-Temperature-Control-Library (зеркало Arduino-Temperature-Control-Library-master). Вот скетч (в примерах называется Single.pde):
#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 – то включать нужно параллельно (1 резистор на всех):
Здесь все то же самое, код в примере Multiple.pde. Различие в том, что используется несколько переменных с адресами термометров — и соответственно на 3 датчика 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");
Ну и вывода температур тоже по 3 раза.




Добавить комментарий