View Categories

Термометр DS18B20

DS18B20 – очень популярный, надёжный и высокоточный цифровой датчик температуры - не подвержен помехам, в отличие от термистора и других аналоговых датчиков, не зависит от нелинейности АЦП и имеет постоянную точность на всём рабочем диапазоне температур. Выпускается в разных корпусах.

В наборе GyverKIT START IOT EXTRA
DS18b20

Характеристики:

  • Диапазон: -55.. 125 °C
  • Точность: 0.5 °C
  • Разрешение: 9.. 12 бит (0.48.. 0.06 °C)
  • Питание: 3-5.5V
  • Скорость измерения:
    • 750 мс при точности 12 бит
    • 94 мс при точности 9 бит
  • Интерфейс связи: 1-Wire (OneWire)
  • Возможность подключать несколько датчиков на один пин

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

Датчик имеет следующие назначения пинов:

Подключается к питанию и любому цифровому пину Arduino - пин должен быть подтянут к питанию резистором 4.7 кОм. На один пин можно подключить несколько датчиков DS18B20:

В рамках набора GyverKIT резистор на 4.7 кОм можно заменить двумя резисторами на 10 кОм (есть в комплекте), подключенными параллельно:

Библиотеки #

Для DS18B20 есть несколько библиотек:

  • DallasTemperature.h - самая известная, для работы также понадобится OneWire.h
  • GyverDS18 - моя библиотека, очень лёгкая и простая в использовании

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

GyverDS18 #

Один датчик
// асинхронный опрос одного датчика на пине

#include <GyverDS18.h>
GyverDS18Single ds(2);  // пин 2

void setup() {
    Serial.begin(115200);
    ds.requestTemp();  // первый запрос на измерение
}

void loop() {
    if (ds.ready()) {         // измерения готовы по таймеру
        if (ds.readTemp()) {  // если чтение успешно
            Serial.print("temp: ");
            Serial.println(ds.getTemp());
        } else {
            Serial.println("read error");
        }

        ds.requestTemp();  // запрос следующего измерения
    }
}
Чтение адреса датчика
// на пин должен быть подключен ОДИН датчик

#include <GyverDS18.h>
GyverDS18Single ds(2);  // пин 2

void setup() {
    Serial.begin(115200);

    uint64_t addr = ds.readAddress();
    if (addr) {
        Serial.print("address: ");
        gds::printAddress(addr, Serial);
        // пример вывода: 0xCF0417505B78FF28
    } else {
        Serial.println("read error");
    }
}

void loop() {
}
Несколько датчиков на пине
#include <GyverDS18Array.h>

// нужно получить адреса как в предыдущем примере,
// подключив по одному датчику на пин
uint64_t addr[] = {
    0xD20417515A42FF28,
    0x4D0417508099FF28,
    0xFE04175159CDFF28,
    0xCF0417505B78FF28,
};
GyverDS18Array ds(2, addr, 4);  // пин, массив, длина

void setup() {
    Serial.begin(115200);
    // Запрос ВСЕМ датчикам на линии
    ds.requestTemp();
}
void loop() {
    if (ds.ready()) {  // измерения готовы по таймеру
        // проходим по массиву
        for (int i = 0; i < ds.amount(); i++) {
            Serial.print("#");
            Serial.print(i);
            Serial.print(": ");
            // читаем по индексу
            if (ds.readTemp(i)) Serial.print(ds.getTemp());
            else Serial.print("read error");
            Serial.print(", ");
        }
        Serial.println();

        ds.requestTemp();  // запрос следующего измерения ДЛЯ ВСЕХ
    }
}

Полезные страницы #

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Прокрутить вверх