Цифровой термометр DS18B20 (Trema-модуль v2.0)

Общие сведения:

Trema-модуль цифровой термометр DS18B20 -  позволит измерять температуру окружающей среды. Исполнен в линейке Trema-модулей, благодаря этому вам не придется ничего паять и собирать на макетной плате.

Спецификация:

  • Диапазон измеряемой температуры: −55… 125 °C
  • Напряжение питания: от 3 В до 5,5 В
  • Точность: ±0,5°C (в пределах −10… 85 °C)
  • Потребляемый ток при опросе: 1 мА
  • Габариты: 31×31 мм

Все модули линейки "Trema" выполнены в одном формате

Подключение:

Датчик подключается к любому из цифровых выводов.

В комплекте имеется кабель для быстрого и удобного подключения к Trema Shield.

Модуль удобно подключать 3 способами, в зависимости от ситуации:

Способ - 1 :  Используя проводной шлейф и Piranha UNO

Используя провода «Папа — Мама», подключаем  напрямую к контроллеру Piranha UNO

Способ - 2 :  Используя Trema Set Shield

Модуль можно подключить к любому из цифровых входов Trema Set Shield.

Способ - 3 :  Используя проводной шлейф и Shield

Используя 3-х проводной шлейф, к  Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.

Подробнее о модуле:

Модуль выполнен на основе микросхемы DS18B20 . Он работает в диапазоне температур от −55 °C до 125 °C.

Цифровой сигнал более устойчив от наводок в отличии от аналогового датчика температуры.

Для работы с модулем предлагаем воспользоваться библиотекой OneWhire.

Подробнее про установку библиотеки читайте в нашей инструкции..

Примеры:

Вывод адреса, модели, температуры в монитор последовательного порта.

#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 - название модуля, подключенного к Piranha UNO;
  • Data - сырое значение с модуля
  • Temperature Celsius - температура в градусах Цельсия;
  • Temperature Fahrenheit - температура в градусах Фаренгейта;

Применение:

  • Метеостанции
  • Проекты климат-контроля

Ссылки:

Обсуждение