Датчик температуры и влажности ардуино dht11

Содержание

Скетч Arduino

В скетче используется две стандартные библиотеки Ардуино это DS18B20 и LiquidCrystal_I2C. Данные библиотеки вы можете найти в менеджере библиотек в меню Arduino IDE (см. Инструменты -> Управлять библиотеками). Так же данные дополнительно выводятся в последовательный порт, эти данные вы можете посмотреть используя стандартный монитор порта Arduino IDE (см. Инструменты -> Монитор порта). Не забудьте установить скорость порта равную 9600 бод/сек.

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

Вывод

Используя lcd 1602 и схему подключения lcd 1602 к Ардуино по I2C вы сможете применять данный LCD дисплей в различных примерах основанных на Arduino. Так же используя датчик температуры вы можете автоматизировать процессы основанные на контролировании температуры.

Основные функциональные способности датчика DS18B20

Термодатчик DS18B20 имеет в своем функционале сразу несколько важнейших команд:

  1. Навык преобразования температур. (Данная способность может поместить температуру в двух-байтный блок оперативной памяти, после чего датчик переходит в состояние низкого потребления. В этом состоянии DS18B20 считывает код данных и определяет режим состояния процесса);
  2. Команда записи памяти. (Она дает возможность сохранить три байта данных в оперативной памяти DS18B20. При это, следует уточнить, что ведущий прибор перебрасывает информацию с наименьшего бита);
  3. Способность чтения памяти. (Применяется для прочтения оперативной памяти памяти прибора. Сброс данных осуществляется с самых наименьших битов или байтов, при этом, в случае необходимости, эта команда способна прекратить сброс данных);
  4. Команда копирования памяти. (Она помогает скопировать все данные внутренней памяти устройства в блок EEPROM, что приводит к осуществлению в дальнейшем питательной способности системы);
  5. Способность перезагрузки EEPROM. (Дает возможность регистрам передохнуть, перезагружая все значения на блоках. Кроме того, только после перезагрузки DS18B20 происходит процесс прочтения оперативной памяти памяти прибора и сообщается о ее состоянии).

3Считывание данных с сенсора DHT11 при помощи Arduino

Давайте пойдём таким путём: скачаем библиотеку для датчика DHT11 (также приложил её в конце статьи, т.к. у обновлённой библиотеки изменились вызываемые функции), установим её стандартным способом (распаковав в директорию \libraries\ среды разработки для Arduino).

Напишем вот такой простенький скетч. Он будет выводить в последовательный порт компьютера каждые 2 секунды сообщения об относительной влажности и температуре, считанные с датчика DHT11.

#include <dht11.h> // подключаем библиотеку
dht11 sensor; // инициализация экземпляра датчика
#define DHT11PIN 8 // вывод 8 будет шиной DATA

void setup() {
  Serial.begin(9600);
}

void loop() {
  int chk = sensor.read(DHT11PIN);

  Serial.print("h=");
  Serial.print(sensor.humidity);
  Serial.print("%\t");

  Serial.print("t=");
  Serial.print(sensor.temperature);
  Serial.println("C");
  
  delay(2000);
}

Загрузим этот скетч в Arduino. Подключимся к Arduino с помощью монитора COM-порта и увидим следующее:

Данные о температуре и влажности, полученные с датчика DHT11

Видно, что данные и о влажности, и о температуре считываются и выводятся в терминалку.

Сборка метеостанции с дисплеем 1602 и DHT11

Для этого проекта нам потребуется:

  • плата Arduino UNO (NANO);
  • жидкокристаллический дисплей 1602 с I2C;
  • цифровой датчик DHT11 или DHT22;
  • провода «папа-мама», «папа-папа»;
  • макетная плата (при необходимости).

К Arduino Nano и Uno все датчики и дисплей подключаются по одной схеме — распиновка и подключение уже рассматривались на нашем сайте, поэтому не будем подробно останавливаться на этом моменте. Если у вас есть вопросы, то посмотрите следующие записи: Подключение DHT11 к Ардуино и Подключение LCD 1602 к Ардуино. Соберите метеостанцию на Ардуино с дисплеем 1602 и dht11, как на схеме ниже.

Только с помощью OneWire.h

Впрочем, можно обойтись и без библиотеки DallasTemperature, тогда нужно будет в ручную отправлять команды на датчик. Для этого нужно знать собственно команды. Посмотрим сначала на пример такого кода:

По сути здесь мы просто сами реализовали некоторые нужные нам функции, которые есть также в классе DallasTemperature (используемом в примере выше).

Внутри датчика DS18B20 стоит свой небольшой контроллер, с которым ардуина общается посредством команд. Команды передаются с помощью метода write класса OneWire:

write(byte) — основной метод класса OneWire, который передает байт данных на устройство. Байт представляет собой определенную команду. Для DS18B20 это следующие основные команды:

0x44 — провести измерение температуры и записать данные в оперативную память;

0x4E — записать 3 байта в 3й, 4й и 5й байты оперативной памяти;

0xBE — считать последовательно 9 байт оперативной памяти;

0x48 — скопировать 3й и 4й байты оперативной памяти в EEPROM;

0xB8 — скопировать данные из EEPROM В 3й и 4й байты оперативной памяти;

0xB4 — вернуть тип питания (0 — паразитное, 1 — внешнее);

Информация об измеренной температуре хранится в оперативной памяти датчика, которая состоит из 9 байт:

1 и 2 байты — хранят информацию о температуре.

3 и 4 байты — хранят соответственно верхний и нижний пределы температуры.

5 и 6 байты — зарезервированы.

7 и 8 байты — используются для сверхточного измерения температуры.

9 байт — хранит помехоустойчивый CRC код предыдущих 8 байт.

Вот список основных методов класса OneWire:

search(addressArray) — Выполняет поиск следующего 1-Wire устройства, если устройство найдено, то в 8-байтный массив addressArray записывается его ROM код, иначе возвращает false;

reset_search() — Выполняет новый поиск с первого устройства;

reset() — Выполняет сброс шины, необходимо перед связью с датчиком;

select(addressArray) — Выполняет выбор устройства после сброса, передается ROM Код устройства;

write(byte) — Передает информационный байт на устройство;

write(byte,1) — Передает информационный байт на устройство, работающее в паразитном режиме питания;

read() — Считывает информационный байт с устройства;

crc8(dataArray,length) — Вычисляет CRC код байтов из массива dataArray длиной length.

Порядок взаимодействия с DS18B20 для получения информации о температуре:

— Посылаем импульс сброса и принимаем ответ термометра.

— Посылаем команду Skip ROM .

— Посылаем команду Convert T .

— Формируем задержку минимум 750мс.

— Посылаем импульс сброса и принимаем ответ термометра.

— Посылаем команду Skip ROM .

— Посылаем команду Read Scratchpad .

— Читаем данные из промежуточного ОЗУ (8 байт) и CRC.

— Проверяем CRC, и если данные считаны верно, вычисляем температуру.

При этом происходит следующее:

1) МК генерирует сигнала reset, удерживая шину 1-wire в состоянии лог. 0 в течении 480 мкс.

2) Ждем не менее 15 мкс, но не более 60 мкс. За это время подтягивающий резистор поднимает уровень на шине до лог. 1.

3) Датчик удерживает шину в состоянии лог. 1 в течении не менее 60 микросекунд. Если за это время шина не сменит свое состояние на лог. 0, то значит на шине ошибка либо датчик нерабочий (это помогает выявить неисправный датчик).

Короче, здесь всё достаточно мудрено. Чтобы не париться, используем готовую библиотеку DallasTemperature, либо код, что я привел выше.

1Технические характеристики датчика температуры и влажности DHT11

Итак, датчик DHT11 имеет следующие характеристики:

  • диапазон измеряемой относительной влажности – 20..90% с погрешностью до 5%,
  • диапазон измеряемых температур – 0..50°C с погрешностью до 2°C;
  • время реакции на изменения влажности – до 15 секунд, температуры – до 30 секунд;
  • минимальный период опроса – 1 секунда.

Габаритные размеры и внешний вид датчика температуры и влажности DHT11

Как видно, датчик DHT11 не отличается особой точностью, да и диапазон температур не охватывает отрицательные значения, что вряд ли подойдёт для наружных измерений в холодное время года при нашем климате. Однако малая стоимость, малый размер и простота работы с ним частично перекрывают эти недостатки. На рисунке приведён внешний вид датчика и его размеры в миллиметрах.

DHT11 против DHT22/AM2302

У нас есть две версии серии датчиков DHTxx. Они выглядят немного похоже и имеют одинаковую распиновку, но имеют разные характеристики. Вот подробности.

DHT22 является более дорогой версией, которая, очевидно, имеет лучшие характеристики. Диапазон измерения температуры составляет от -40°C до +80°C с точностью ±0,5 градуса, а диапазон температур DHT11 составляет от 0°C до 50°C с точностью ±2 градуса. Также датчик DHT22 имеет более широкий диапазон измерения влажности, от 0 до 100% с точностью 2-5%, в то время как диапазон измерения влажности DHT11 составляет от 20 до 80% с точностью 5%.

Сравнение спецификаций DHT11 и DHT22/AM2302
 
  DHT11 DHT22
Рабочее напряжение от 3 до 5 В от 3 до 5 В
Максимальный рабочий ток 2,5 мА макс 2,5 мА макс
Диапазон измерения влажности 20-80% / 5% 0-100% / 2-5%
Диапазон измерения температуры 0-50°C / ± 2°C от -40 до 80°C / ± 0,5°C
Частота выборки 1 Гц (чтение каждую секунду) 0,5 Гц (чтение каждые 2 секунды)
Размер корпуса 15,5 мм х 12 мм х 5,5 мм 15,1 мм х 25 мм х 7,7 мм
Преимущество Ультра низкая стоимость Более точный

Хотя DHT22/AM2302 более точен и работает в большем диапазоне температур и влажности; есть три вещи, в которых DHT11 сильно превосходит DHT22. Он более дешевый, меньше по размеру и имеет более высокую частоту выборки. Частота выборки DHT11 составляет 1 Гц, то есть одно чтение каждую секунду, в то время как частота выборки DHT22 составляет 0,5 Гц, то есть одно чтение каждые две секунды.

Рабочее напряжение обоих датчиков составляет от 3 до 5 вольт, в то время как максимальный ток, используемый во время преобразования (при запросе данных), составляет 2,5 мА. И самое приятное, что датчики DHT11 и DHT22/AM2302 являются «взаимозаменяемыми», то есть, если вы создаете свой проект с одним датчиком, вы можете просто отключить его и использовать другой датчик. Ваш код, возможно, придется немного изменить, но, по крайней мере, схема не изменится!

Для получения более подробной информации обратитесь к техническим описаниям датчиков DHT11 и DHT22/AM2302.

Сборка конструкции проекта

Как вы можете видеть из первой картинки в этой статье, мы решили упаковать наш бесконтактный термометр внутрь металлического корпуса, поэтому мы использовали для сборки конструкции проекта перфорированные платы: на одной из них мы разместили плату Arduino Nano, модуль DS3231 и все пассивные компоненты схемы, а на другой – датчики MLX90615 и TCRT500.

При сборке проекта убедитесь в том, что у вас хватит места внутри корпуса для установки ЖК дисплея, светодиодов, датчиков и зуммера. Внешний вид получившейся у нас конструкции проекта показан на следующем рисунке (кроме платы с датчиками).

Примеры работы для Arduino

Один датчик

Рассмотрим простой пример — подключения одного датчика.

Сенсор подключается к управляющей плате через один сигнальный пин.
При подключении к Arduino в компактном формфакторе, например Arduino Micro или Iskra Nano Pro, воспользуйтесь макетной платой и парочкой нажимных клеммников.

Между сигнальным проводом и питанием установите сопротивление 4,7 кОм.

При коммуникации сенсора со стандартными платами Arduino формата Rev3, Arduino Uno или Iskra Neo, используйте Troyka Slot Shield совместно с модулем подтяжки.

Код программы

Выведем температуру сенсора в Serial-порт.

simple.ino
// библиотека для работы с протоколом 1-Wire
#include <OneWire.h>
// библиотека для работы с датчиком DS18B20
#include <DallasTemperature.h>
 
// сигнальный провод датчика
#define ONE_WIRE_BUS 5
 
// создаём объект для работы с библиотекой OneWire
OneWire oneWire(ONE_WIRE_BUS);
 
// создадим объект для работы с библиотекой DallasTemperature
DallasTemperature sensor(&oneWire);
 
void setup(){
  // инициализируем работу Serial-порта
  Serial.begin(9600);
  // начинаем работу с датчиком
  sensor.begin();
  // устанавливаем разрешение датчика от 9 до 12 бит
  sensor.setResolution(12);
}
 
void loop(){
  // переменная для хранения температуры
  float temperature;
  // отправляем запрос на измерение температуры
  sensor.requestTemperatures();
  // считываем данные из регистра датчика
  temperature = sensor.getTempCByIndex();
  // выводим температуру в Serial-порт
  Serial.print("Temp C: ");
  Serial.println(temperature);
  // ждём одну секунду
  delay(1000);
}

Серия датчиков

Каждый сенсор DS18B20 хранит в своей памяти уникальный номер, такое решение позволяет подключить несколько датчиков к одному пину.

Добавим к предыдущем схемам подключения ещё по паре датчиков в параллель.

Код программы

Просканируем все устройства на шине и выведем температуру каждого сенсора отдельно в Serial-порт.

multipleSensors.ino
// библиотека для работы с протоколом 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 = ; i < 8; i++){
    if (deviceAddressi < 16) Serial.print("0");
    Serial.print(deviceAddressi, HEX);
  }
}
 
void setup(){
  // инициализируем работу Serial-порта
  Serial.begin(9600);
  // ожидаем открытия Serial-порта
  while(!Serial);
  // начинаем работу с датчиком
  sensors.begin();
  // выполняем поиск устройств на шине
  countSensors = sensors.getDeviceCount();
  Serial.print("Found sensors: ");
  Serial.println(countSensors);
  // выделяем память в динамическом массиве под количество обнаруженных сенсоров
  sensorsUnique = new DeviceAddresscountSensors;
 
  // определяем в каком режиме питания подключены сенсоры
  if (sensors.isParasitePowerMode()) {
    Serial.println("Mode power is Parasite");
  } else {
    Serial.println("Mode power is Normal");
  }
 
  // делаем запрос на получение адресов датчиков
  for (int i = ; i < countSensors; i++) {
    sensors.getAddress(sensorsUniquei, i);
  }
  // выводим полученные адреса
  for (int i = ; i < countSensors; i++) {
    Serial.print("Device ");
    Serial.print(i);
    Serial.print(" Address: ");
    printAddress(sensorsUniquei);
    Serial.println();
  }
  Serial.println();
  // устанавливаем разрешение всех датчиков в 12 бит
  for (int i = ; i < countSensors; i++) {
    sensors.setResolution(sensorsUniquei, 12);
  }
}
 
void loop(){
  // переменная для хранения температуры
  float temperature10;
  // отправляем запрос на измерение температуры всех сенсоров
  sensors.requestTemperatures();
  // считываем данные из регистра каждого датчика по очереди
  for (int i = ; i < countSensors; i++) {
    temperaturei = sensors.getTempCByIndex(i);
  }
  // выводим температуру в Serial-порт по каждому датчику
  for (int i = ; i < countSensors; i++) {
    Serial.print("Device ");
    Serial.print(i);
    Serial.print(" Temp C: ");
    Serial.print(temperaturei);
    Serial.println();
  }
  Serial.println();
  // ждём одну секунду
  delay(1000);
}

Исходный код программы

Чтобы написать код программы для нашего цифрового термометра, мы должны написать код для Arduino, датчика температуры LM35 и ЖК дисплея 16×2. Сначала подключим библиотеку для ЖК дисплея, а затем определим контакты данных и управления для подключения ЖК дисплея и датчика температуры.

После получения аналогового значения напряжения на аналоговом входе A0 мы считываем это значение и сохраняем его в переменной с помощью команды float analog_value=analogRead(analog_pin). После этого мы преобразуем его в цифровое значение температуры по следующей формуле:

float Temperature=analog_value*factor*100

где factor=5/1023, analog_value – аналоговое значение напряжение с выхода датчика температуры.

То есть получаем код вида:

Символ градуса формируем используя стандартный метод с помощью следующего кода:

Далее представлен полный исходный код программы нашего цифрового термометра.

Arduino

#include<LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);
#define sensor A0
byte degree =
{
0b00011,
0b00011,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
void setup()
{
lcd.begin(16,2);
lcd.createChar(1, degree);
lcd.setCursor(0,0);
lcd.print(» Digital «);
lcd.setCursor(0,1);
lcd.print(» Thermometer «);
delay(4000);
lcd.clear();
lcd.print(» Circuit Digest «);
delay(4000);
lcd.clear();
}
void loop()
{
/*———Temperature——-*/
float reading=analogRead(sensor);
float temperature=reading*(5.0/1023.0)*100;
delay(10);

/*——Display Result——*/
lcd.clear();
lcd.setCursor(2,0);
lcd.print(«Temperature»);
lcd.setCursor(4,1);
lcd.print(temperature);
lcd.write(1);
lcd.print(«C»);
delay(1000);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

#include<LiquidCrystal.h>

LiquidCrystallcd(7,6,5,4,3,2);

#define sensor A0

bytedegree8=

{

0b00011,

0b00011,

0b00000,

0b00000,

0b00000,

0b00000,

0b00000,

0b00000

};

voidsetup()

{

lcd.begin(16,2);

lcd.createChar(1,degree);

lcd.setCursor(,);

lcd.print(»    Digital    «);

lcd.setCursor(,1);

lcd.print(»  Thermometer   «);

delay(4000);

lcd.clear();

lcd.print(» Circuit Digest  «);

delay(4000);

lcd.clear();

}

voidloop()

{

/*———Temperature——-*/

floatreading=analogRead(sensor);

floattemperature=reading*(5.01023.0)*100;

delay(10);

/*——Display Result——*/

lcd.clear();

lcd.setCursor(2,);

lcd.print(«Temperature»);

lcd.setCursor(4,1);

lcd.print(temperature);

lcd.write(1);

lcd.print(«C»);

delay(1000);

}

Необходимые компоненты

Arduino

В этом проекте мы используем микроконтроллер для контроля всего процесса, который размещен на плате Arduino. Некоторые называют Arduino микроконтроллером, но это не совсем так, потому что Arduino представляет собой операционную систему или начальный загрузчик, который работает на основе микроконтроллера AVR. Если говорить шире, то Arduino – это аппаратная платформа с открытым исходным кодом, которая очень удобна для реализации многих практических проектов в электронике.

Датчик температуры LM35

Номер контакта Функция Обозначение
1 Питающее напряжение; 5V (+35V to -2V) Vcc
2 Выходное напряжение (+6V to -1V) Output
3 Земля (0V) Ground

Питание

Плата Arduino уже имеет встроенный модуль подачи питания, поэтому здесь нам необходимо только подсоединить адаптер на 9 или 12 вольт к плате, или можно запитать ее от USB-порта компьютера или ноутбука.

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

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

Обмен информацией в 1-Wire происходит благодаря следующим операциям:

  • Инициализация – определение последовательности сигналов, с которых начинается измерение и другие операции. Ведущее устройство подает импульс сброса, после этого датчик должен подать импульс присутствия, сообщающий о готовности к выполнению операции.
  • Запись данных – происходит передача байта данных в датчик.
  • Чтение данных – происходит прием байта из датчика.

Для работы с датчиком нам понадобится программное обеспечение:

  • Arduino IDE;
  • Библиотека OneWire, если используется несколько датчиков на шине, можно использовать библиотеку DallasTemperature. Она будет работать поверх OneWire.

Из оборудования понадобятся:

  • Один или несколько датчиков DS18B20;
  • Микроконтроллер Ардуино;
  • Коннекторы;
  • Резистор на 4,7 кОм (в случае подключения одного датчика пойдет резистор номиналом от 4 до 10K);
  • Монтажная плата;
  • USB-кабель для подключения к компьютеру.

К плате Ардуино UNO датчик подключается просто: GND с термодатчика присоединяется к GND Ардуино, Vdd подключается к 5V, Data – к любому цифровому пину.

Простейшая схема подключения цифрового датчика DS18B20 представлена на рисунке.

В режиме паразитного питания контакт Vdd с датчика подключается к GND на Ардуино – в этом случае пригодятся только два провода. Работу в паразитном режиме лучше не использовать без необходимости, так как могут ухудшиться быстродействие и стабильность.

Сборка термометра в корпусе

После тестирования и отладки «железа» и кода программы мы начали сборку нашего проекта в закрытом корпусе. Для этих целей мы спроектировали и изготовили металлический корпус для нашего настенного термометра. При проектировании размеров корпусов учитывались размеры ЖК дисплея, светодиодов и других компонентов проекта. После изготовления корпуса на специальном станке мы нанесли на него порошковое покрытие чтобы улучшить его эстетический вид.

После изготовления корпуса мы закрепили в нем ЖК дисплей, соединительные провода, светодиоды и другие компоненты проекта. При установке компонентов проектов в металлический корпус убедитесь в том, что все электронные части нашего проекта не соприкасаются (хорошо изолированы) с металлическим корпусом. Внешний вид корпуса термометра с окончательно установленными в него электронными компонентами показан на следующем рисунке.

Использование

// Дефайны настроек (перед подключением библиотеки)
#define DS_TEMP_TYPE [float / int]          // Тип данных для температуры (точность / экономия flash) (По умолч. float)
#define DS_CHECK_CRC [true / false]         // Проверка подлинности принятых данных (По умолч. true)
#define DS_CRC_USE_TABLE [true / false]     // Использовать таблицу для CRC. Быстрее, но +256 байт flash (<1мкс VS ~6мкс) (По умолч. false)

// Методы
void setAddress(uint8_t *addr);             // установить (сменить) адрес
void setResolution(uint8_t resolution);     // Установить разрешение термометра 9-12 бит
void readAddress(uint8_t *addressArray);    // Прочитать уникальный адрес термометра в массив
void requestTemp(void);                     // Запросить новое преобразование температуры
uint16_t getRaw(void)                       // Прочитать "сырое" значение температуры
[int/float] getTemp(void);                  // Прочитать значение температуры
[int/float] calcRaw(uint16_t data);         // Преобразовать "сырое" значение в температуру
[int/float] - настраивается дефайном. По умолчанию float

// внешние функции
int DS_rawToInt(uint16_t data);             // преобразовать raw данные в температуру int
float DS_rawToFloat(uint16_t data);         // преобразовать raw данные в температуру float

// Время преобразования от точности
точность | время
12 бит   | 750 мс
11 бит   | 375 мс
10 бит   | 187 мс
9 бит    | 93 мс

Общие принципы работы датчика температуры DS18B20

DS18B20 представляет собой однопроводный цифровой датчик температуры от компании Maxim IC. Выдает значение температуры в градусах Цельсия, способен измерять температуру с 9-12 битной точностью в диапазоне от -55 до 125 градусов Цельсия с точностью +/-0.5 градуса. Каждый датчик DS18B20 имеет 64-битный уникальный номер (Serial number), вытравленный на корпусе датчика, что позволяет подключать огромное число подобных датчиков к одной шине данных. С помощью данного датчика можно измерять температуру воздуха, жидкостей и земли. В некоторых магазинах датчик продается в комплекте с резистором сопротивлением 4,7 кОм.

Особенности датчика DS18B20:

  • однопроводный интерфейс (1-Wire interface), что позволяет использовать для подключения датчика только один контакт микроконтроллера (в нашем случае платы Arduino Uno);
  • каждый датчик имеет 64-битный уникальный последовательный код (номер), хранящийся в ПЗУ (ROM) датчика;
  • способность подключения к одной шине множества датчиков позволяет создавать на его основе приложения для распределенного (в пространстве) измерения температуры;
  • не требует никаких внешних компонентов;
  • может быть запитан от линии данных;
  • поддерживает напряжение питания от 3.0V до 5.5V;
  • способен измерять температуру в диапазоне от –55°C до +125°C (–67°F до +257°F) с точностью ±0.5°C (в диапазоне от –10°C до +85°C);
  • можно выбрать разрешающую способность (разрешение) датчика: от 9 до 12 бит;
  • преобразует значение температуры в 12-битное цифровое слово длительностью 750 мс (max.);
  • можно настраивать энергонезависимую (nonvolatile, NV) сигнализацию (сигнал тревоги);
  • опции сигнала тревоги позволяют идентифицировать и определить адрес датчика, чья температура не соответствует запрограммированным границам;
  • может применяться в устройствах термоконтроля, промышленных системах, потребительских продуктах, термометрах и в любых других системах, где требуется измерение температуры.

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

Назначение выводов

Как уже говорилось, есть два варианта поставки термодатчика — микросхема с 8 ножками (8-PIN SOIC) или 3 (ТО-92). Из рисунка ниже видно, какие контакты для чего предназначены, включая их полную распиновку.

Линия связи при подключении должна быть задействована через подтягивающий резистор 4.7 кОм. Требование обуславливается работой самого протокола 1-Wire. Питание корпуса, хоть это и не рекомендуется для температур свыше 100 °С, можно организовать от линии данных шины:

Работа вышеописанной схемы обеспечивается внутренним конденсатором Cpp, накапливающим заряд от линии. Ее минус — в моменты трансляции измеренных данных в цифровой вид, из-за повышенного потребления, мощности может просто не хватить на само устройство. Поэтому и рекомендуется использовать схемы с раздельным питанием.

Схема подключения с использованием внешнего источника будет выглядеть по-другому:

Или же, следуя советам профессионалов, выполнить подключение можно также таким образом:

В представленном варианте, схема будет работать от сохраненного через диод заряда в конденсаторе. К сожалению, необходимость в двух проводах никуда не делась.

Если возникает необходимость в определении именно вида поступающего питания на сенсор, то можно произвести опрос самого термодатчика DS18B20, отправив сначала ему команду CС следом B4. На выходе будет 0, если применяется паразитное питание или 1 при раздельном.