DS18B20 это сказочный датчик температуры, который имеет цифровой интерфейс, а значит его не  нужно калибровать и их можно подключить сразу много к одному пину ардуины, так как каждый DS18B20 имеет свой уникальный адрес, зашитый на заводе.

Выглядит эта мегасложная схема так:

image

 

Ну то есть надо резистор и все))) И вообще нет никаких калибровок температуры и ошибок монтажа, питание втыкать можно от 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 резистор на всех):

image

Здесь все то же самое, код в примере 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 раза.