DS18B20 подключение к Arduino

DS18B20 подключение к Arduino — датчик температуры

DS18B20 подключение к Arduino-1

DS18B20 подключение к Arduino — это фантастический датчик определения температурной составляющей с цифровым интерфейсом в своем составе — следовательно он не требует выполнения калибровки. Поэтому, такие устройства можно подключить одновременно в множественном количестве к одному контакту arduino. Такую возможность предоставляет оригинальный адрес, который был запрограммирован в схему DS18B20 при его изготовлении.

Вот так выглядит эта «супер-сложная» схема DS18B20 подключение к Arduino:

DS18B20 подключение к Arduino-2

Здесь нужен всего один резистор и больше ничего))). К тому же здесь отсутствуют необходимость в калибровании температуры, а также исключаются возможные неточности при выполнении сборки. Питающее напряжение возможно подавать в диапазоне от 3v до 5v. Все элементарно. А отображение температурного значения — три строки)). Ниже показан образец, все досконально и четко расписано.

Вот отсюда нужно скачать библиотеку:

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, то в таком случае необходимо включить по параллельной схеме одно сопротивление для всех модулей. Вот так как показано на изображении.

DS18B20 подключение к Arduino-3 DS18B20 подключение к Arduino-4

Тут все аналогично, код в образце Multiple.pde. Разница лишь в том, что применено некоторое количество переменных величин имеющих адреса термометров — следовательно на три датчика три переменные величины со своим адресом и аналогичный код для поиска:

Код:

if (!sensors.getAddress(Thermometer1, 0)) Serial.println("Не найден адрес датчика 0"); 
if (!sensors.getAddress(Thermometer2, 1)) Serial.println("Не найден адрес датчика 1");
if (!sensors.getAddress(Thermometer3, 2)) Serial.println("Не найден адрес датчика 2");

Естественно и вывода температурных составляющих также по три.