Общие сведения
Датчик температуры DS18B20+ — позволит измерять температуру окружающей среды.
Характеристики
- Диапазон измеряемой температуры: −55… 125 °C
- Напряжение питания: от 3 В до 5,5 В
- Точность: ±0,5°C (в пределах −10… 85 °C)
- Потребляемый ток при опросе: 1 мА
Подключение
Для удобства подключения к Arduino воспользуйтесь Trema Shield, Trema Power Shield, Motor Shield или Trema Set Shield.
- Красный — 5V;
- Черный — GND;
- Желтый — любой цифровой вывод Arduino;
Сигнальный провод (жёлтый) необходимо соединить с проводом питания (красный) через резистор 4.7кОм. При подключении только одного датчика можно воспользоваться резистором на 10кОм (в любом удобном Вам формате: стандартный или для макетирования).
Подробнее о датчике
Для работы с модулем предлагаем воспользоваться библиотекой OneWhire.
Подробнее про установку библиотеки читайте в нашей инструкции..
Примеры
Можно использовать готовую библиотеку iarduino_DS18XXX, для работы с датчиками температуры: «DS18S20», «DS18B20», «DS1822».
Или без нее, примеры ниже.
Вывод адреса, модели, температуры в монитор последовательного порта.
#include <OneWire.h> // подключаем библиотеку для работы с интерфейсом OneWire OneWire ds(2); // Создаём объект с именем ds, и указанием пина, к которому подключен датчик void setup(void) { Serial.begin(9600); // инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек } void loop(void) { byte i; // задаём переменную для счётчика byte present = 0; // Флаг сброса шины byte type_s; // Флаг модели датчика byte data[12]; // массив под значения температуры, считанные с датчика byte addr[8]; // массив под значение адреса датчика float celsius, fahrenheit; // переменные под значения температуры в градусах Цельсия и Фаренгейта if ( !ds.search(addr)) { // если функция принимает значение false, значит Serial.println("No more addresses."); // больше устройств не найдено. Выводит в монитор порта сообщение об этом. Serial.println(); // добавляем символ новой строки ds.reset_search(); // функция начинает новый поиск устройства. delay(250); // задержка 250 мсек return; } Serial.print("ROM ="); // выводим текст в монитор порта. "ROM" - это адрес устройства for ( i = 0; i < 8; i++) { // запускаем цикл Serial.write(' '); // между значениями добавляем пробел Serial.print(addr[i], HEX); // в монитор порта побайтово выводим адрес устройства в 16-ричной кодировке } if (OneWire::crc8(addr, 7) != addr[7]) { // выполяем проверка контрольной суммы CRC Serial.println("CRC is not valid!"); // если контрольная сумма не верна - отправляем в монитор порта сообщение об этом return; } Serial.println(); // добавляем символ новой строки switch (addr[0]) {// Модель датчика температуры Флаг типа модуля В данном блоке проверяем значение старшего байта полученного адреса и по нему определяем модель модуля case 0x10: Serial.println(" Chip = DS18S20"); type_s = 1; break; case 0x28: Serial.println(" Chip = DS18B20"); type_s = 0; break; case 0x22: Serial.println(" Chip = DS1822"); type_s = 0; break; default: Serial.println("Device is not a DS18x20 family device."); return; } ds.reset(); // производим сброс шины перед началом работы с модулем ds.select(addr); // указываем устройство, с которым далее будет работать код ds.write(0x44, 0); // отправка команды выполнить конвертацию delay(1000); // задержка в 1 сек (для выполнения конвертации) present = ds.reset(); // флаг сброса шины перед приёмом данных с модуля ds.select(addr); // указываем устройство, с которым далее будет работать код ds.write(0xBE); // считываем значение из scratchpad-памяти модуля Serial.print(" Data = "); // в монитор порта выводим текст "Значение" Serial.print(present, HEX); // выводим в монитор порта значение с модуля, в 16-ричной кодировке Serial.print(" "); // добавляем символ новой строки for ( i = 0; i < 9; i++) { // запускаем цикл считывания 9 байт информации с модуля data[i] = ds.read(); // побайтовое чтение значений с модуля Serial.print(data[i], HEX); // выводим в монитор порта значение байта, считанного с модуля Serial.print(" "); // между значениями добавляем пробел } Serial.print(" CRC="); // выводим в монитор порта текст CRC (контрольная сумма) Serial.print(OneWire::crc8(data, 8), HEX); // выводим в монитор порта значение CRC Serial.println(); // добавляем символ новой строки int16_t raw = (data[1] << 8) | data[0]; // конвертация значения температуры в 16-битный тип данных if (type_s) { // если подключена модель DS18S20 raw = raw << 3; // тогда сдвигаем значение на 3 влево для получения 12-битного разрешения точности температуры if (data[7] == 0x10) { // если указанный бит совпадает с условием, то raw = (raw & 0xFFF0) + 12 - data[6]; // пересчитываем сырое значение } } else { // для всех остальных моделей byte cfg = (data[4] & 0x60); // для задания разрешения вводится переменная (по умолчанию установлено 12-битное разрешение) if (cfg == 0x00) raw = raw & ~7; // если значение переменной и указанного бита совпадают, тогда устанавливается 9-битное разрешение точности else if (cfg == 0x20) raw = raw & ~3; // если значение переменной и указанного бита совпадают, тогда устанавливается 10-битное разрешение точности else if (cfg == 0x40) raw = raw & ~1; // если значение переменной и указанного бита совпадают, тогда устанавливается 11-битное разрешение точности } celsius = (float)raw / 16.0; // переводим значения в градусы Цельсия fahrenheit = celsius * 1.8 + 32.0; // переводим значения в градусы Фаренгейта Serial.println(" Temperature = "); // выводим в монитор порта текста Температура Serial.print(celsius); // выводим значения в градусах Цельсия Serial.println(" Celsius, "); // выводим в монитор порта текста "градусы Цельсия" Serial.print(fahrenheit); // выводим значения в градусах Фаренгейта Serial.println(" Fahrenheit"); // выводим в монитор порта текста "градусы Цельсия" }
В мониторе порта вы можете наблюдать:
- ROM - адрес устройства на шине OneWire;
- Chip - название модуля;
- Data - сырое значение с модуля
- Temperature Celsius - температура в градусах Цельсия;
- Temperature Fahrenheit - температура в градусах Фаренгейта;
Комплектация
- 1х датчик температуры DS18B20+;