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

13-12-2020, 16:31 0 комментариев

В этой статье обсуждаем подключение датчика температуры DS18B20 к Arduino. О подобных устройствах мы говорили мало, но это не означает, что их редко задействуют в современных проектах. Датчики температуры необходимы для контроля не только температурных показателей в помещениях, но и твердых объектов, жидкостей, металлов и т.д. Такие модули легки в сборке и настройке, доступны по цене, функциональны (считывают значения в пределах от −55 до +125 °C), а потому достойны нашего внимания.

Давайте рассмотрим одно из таких устройств – цифровой температурный датчик DS18B20.

Его технические параметры:

  • напряжение: 3,3-5V;
  • наибольшее разрешение: 12 бит;
  • диапазон рабочих температур: 55 ... +125 С;
  • погрешность ∕ точность: 0,5 С (не более);
  • SRAM (оперативная память, сохранение полученных измерений) и EEPROM (энергонезависимая);
  • имеется уникальный серийный код;
  • длина провода: 10см.

Распиновка микросхемы:

Распиновка микросхемы

Разберем схему подключения, в которой использованы следующие аппаратные компоненты:

  1. плата расширения Arduino Uno;
  2. датчик DS18B20;
  3. коннекторы;
  4. резистор на 4,7 кОм;
  5. макетная плата;
  6. USB-кабель (для подключения к ПК).

Схема подключения датчика DS18B20 к Arduino

Схема подключения датчика DS18B20 к Arduino

Скетч для подключения датчика DS18B20 к Arduino

В скетче, который зальем ниже, будет использоваться библиотека OneWire. Ее следует скачать и инсталлировать в папку libraries среды разработки Arduino IDE.

Прописываем скетч:


#include <OneWire.h>
/*
* Описание взаимодействия с цифровым датчиком ds18b20 
* Подключение ds18b20 к Arduino через пин 8  
*/
OneWire ds(8); // Создаем объект OneWire для шины 1-Wire, с помощью которого будет осуществляться работа с датчиком
void setup(){
  Serial.begin(9600);
}
void loop(){
  // Определяем температуру от датчика DS18b20
  byte data[2]; // Место для значения температуры
  
  ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
  ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство 
  ds.write(0x44); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память
  
  delay(1000); // Микросхема измеряет температуру, а мы ждем.  
  
  ds.reset(); // Теперь готовимся получить значение измеренной температуры
  ds.write(0xCC); 
  ds.write(0xBE); // Просим передать нам значение регистров со значением температуры
  // Получаем и считываем ответ
  data[0] = ds.read(); // Читаем младший байт значения температуры
  data[1] = ds.read(); // А теперь старший
  // Формируем итоговое значение: 
  //    - сперва "склеиваем" значение, 
  //    - затем умножаем его на коэффициент, соответсвующий разрешающей способности (для 12 бит по умолчанию - это 0,0625)
  float temperature =  ((data[1] << 8) | data[0]) * 0.0625;
  
  // Выводим полученное значение температуры в монитор порта
  Serial.println(temperature);
   
}

Особенностью именно этого модуля является способность передавать данные на управляющую плату всего через 1 пин. Это означает, что можно одновременно подключить до 127 таких датчиков (параллельно).

Как подключить несколько датчиков DS18B20 к Arduino

Рассмотрим вариант, когда нам необходимо в одной сборке использовать серию датчиков. Для примера, возьмем три датчика темпиротуры DS18B20.

Мы заменили микроконтроллер на Micro:

Схема подключения нескольких датчиков DS18B20 к Arduino

Принципиальная схема:

Схема подключения нескольких датчиков DS18B20 к Arduino

Пример скетча:


// библиотека для работы с протоколом 1-Wire
#include <OneWire.h>
// библиотека для работы с датчиком DS18B20
#include <DallasTemperature.h>
 
// сигнальный провод датчика
#define ONE_WIRE_BUS 5
 
// создаём объект для работы с библиотекой OneWire
OneWire oneWire(ONE_WIRE_BUS);
// создадим объект для работы с библиотекой DallasTemperature
DallasTemperature sensors(&oneWire);
// создаём указатель массив для хранения адресов датчиков
DeviceAddress *sensorsUnique;
// количество датчиков на шине
int countSensors;
 
// функция вывода адреса датчика
void printAddress(DeviceAddress deviceAddress){
  for (uint8_t i = 0; i < 8; i++){
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}
 
void setup(){
  // инициализируем работу Serial-порта
  Serial.begin(9600);
  // ожидаем открытия Serial-порта
  while(!Serial);
  // начинаем работу с датчиком
  sensors.begin();
  // выполняем поиск устройств на шине
  countSensors = sensors.getDeviceCount();
  Serial.print("Found sensors: ");
  Serial.println(countSensors);
  // выделяем память в динамическом массиве под количество обнаруженных сенсоров
  sensorsUnique = new DeviceAddress[countSensors];
 
  // определяем в каком режиме питания подключены сенсоры
  if (sensors.isParasitePowerMode()) {
    Serial.println("Mode power is Parasite");
  } else {
    Serial.println("Mode power is Normal");
  }
 
  // делаем запрос на получение адресов датчиков
  for (int i = 0; i < countSensors; i++) {
    sensors.getAddress(sensorsUnique[i], i);
  }
  // выводим полученные адреса
  for (int i = 0; i < countSensors; i++) {
    Serial.print("Device ");
    Serial.print(i);
    Serial.print(" Address: ");
    printAddress(sensorsUnique[i]);
    Serial.println();
  }
  Serial.println();
  // устанавливаем разрешение всех датчиков в 12 бит
  for (int i = 0; i < countSensors; i++) {
    sensors.setResolution(sensorsUnique[i], 12);
  }
}
 
void loop(){
  // переменная для хранения температуры
  float temperature[10];
  // отправляем запрос на измерение температуры всех сенсоров
  sensors.requestTemperatures();
  // считываем данные из регистра каждого датчика по очереди
  for (int i = 0; i < countSensors; i++) {
    temperature[i] = sensors.getTempCByIndex(i);
  }
  // выводим температуру в Serial-порт по каждому датчику
  for (int i = 0; i < countSensors; i++) {
    Serial.print("Device ");
    Serial.print(i);
    Serial.print(" Temp C: ");
    Serial.print(temperature[i]);
    Serial.println();
  }
  Serial.println();
  // ждём одну секунду
  delay(1000);
}

Создавайте собственные проекты с термометрами – это увлекательно и несложно! А мы прощаемся – до новых встреч!

Поделись в социальных сетях:
О авторе
Калугин Антон

Программист микроконтроллеров с 8-ми летним стажем, работал в таких компаниях как IBM, ASUS, Microsoft.

В комментариях с радостью отвечу на ваши вопросы.

Все статьи автора
Похожие новости

Сегодня поговорим о том, как воплотить в жизнь подключение FPM10A к Arduino, что это за модуль, где используется, каковы параметры его работы и т.д. Речь идет...

Преобразователь на базе микросхемы Max6675 – отличное решение для внедрения в любой современный проект. Данное устройство широко применяется для измерения как...

Сегодня поговорим о таком цифровом устройстве как акселерометр, его технических характеристиках и схеме подключения к Ардуино. Для чего обычно необходимы...

На повестке дня - подключение LM35 к Arduino. Сегодня мы рассмотрим модуль устройства, его базовые характеристики, область применения и схему подключения. И...

Для подключения RTC часов DS1302 понадобится немного вашего времени и терпения. В результате вы получите отличную хронометрическую систему для отслеживания и...

Оставить комментарий