Подключение датчика температуры DS18B20 к Arduino
В этой статье обсуждаем подключение датчика температуры DS18B20 к Arduino. О подобных устройствах мы говорили мало, но это не означает, что их редко задействуют в современных проектах. Датчики температуры необходимы для контроля не только температурных показателей в помещениях, но и твердых объектов, жидкостей, металлов и т.д. Такие модули легки в сборке и настройке, доступны по цене, функциональны (считывают значения в пределах от −55 до +125 °C), а потому достойны нашего внимания.
Давайте рассмотрим одно из таких устройств – цифровой температурный датчик DS18B20.
Его технические параметры:
- напряжение: 3,3-5V;
- наибольшее разрешение: 12 бит;
- диапазон рабочих температур: 55 ... +125 С;
- погрешность ∕ точность: 0,5 С (не более);
- SRAM (оперативная память, сохранение полученных измерений) и EEPROM (энергонезависимая);
- имеется уникальный серийный код;
- длина провода: 10см.
Распиновка микросхемы:
Разберем схему подключения, в которой использованы следующие аппаратные компоненты:
- плата расширения Arduino Uno;
- датчик DS18B20;
- коннекторы;
- резистор на 4,7 кОм;
- макетная плата;
- USB-кабель (для подключения к ПК).
Схема подключения датчика 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:
Принципиальная схема:
Пример скетча:
// библиотека для работы с протоколом 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);
}
Создавайте собственные проекты с термометрами – это увлекательно и несложно! А мы прощаемся – до новых встреч!
Сегодня поговорим о том, как воплотить в жизнь подключение FPM10A к Arduino, что это за модуль, где используется, каковы параметры его работы и т.д. Речь идет...
Преобразователь на базе микросхемы Max6675 – отличное решение для внедрения в любой современный проект. Данное устройство широко применяется для измерения как...
Сегодня поговорим о таком цифровом устройстве как акселерометр, его технических характеристиках и схеме подключения к Ардуино. Для чего обычно необходимы...
На повестке дня - подключение LM35 к Arduino. Сегодня мы рассмотрим модуль устройства, его базовые характеристики, область применения и схему подключения. И...
Для подключения RTC часов DS1302 понадобится немного вашего времени и терпения. В результате вы получите отличную хронометрическую систему для отслеживания и...