Ардуино: датчик температуры DS18B20 от ROC

В предыдущих уроках мы уже работали с датчиком температуры и влажности DHT11, а также с терморезистором. На этот раз попробуем разобраться ещё с одним популярным датчиком измеряющим температуру — DS18B20.

Это устройство позволяет измерять температуру в диапазоне от –55°C до +125°C с точностью ±0.5°C ( при температуре от –10°C до +85°C ). Питаться DS18B20 может как от 3.3, так и от 5 Вольт.

Сам по себе датчик — это микросхема, которая может встречаться в разных корпусах:

Датчик температуры DS18B20 ROC, корпуса

Также популярными являются готовые модули, на которых размещен датчик, резистор подтяжки и разъем.

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

Другой вариант — датчик в герметичной стальной капсуле с проводом:

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

1. Подключение модуля DS18B20-ROC к Ардуино

В этом уроке мы будем работать с модулем датчика температуры, разработанным в RobotClass. Подключать мы его будем к контроллеру Ардуино Уно.

Как и DHT11, датчик DS18B20 использует однопроводную шину (1-wire) для обмена данными с контроллером. Так что нам потребуется всего три провода чтобы подключить датчик к Ардуино.

Модуль DS18B20 GND VCC OUT
Ардуино Уно GND +5V 2

Принципиальная схема

Схема подключения DS18B20 к Ардуино

Внешний вид макета

Подключение DS18B20 к Ардуино

Примечание. В случае использования не модуля, а отдельной микросхемы, необходимо вывод микросхемы OUT соединить с контактом питания через резистор 4,7 КОм. В указанном выше модуле этот резистор уже установлен.

2. Программа для получения данных с датчика DS18B20

Напишем программу, которая будет каждую секунду считывать показания температуры с датчика и выводить их в COM-порт.

#include <OneWire.h>

OneWire ds(2);

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

void loop() {
    byte i;
    byte data[12];
    byte addr[8];
    float celsius;
 
    // поиск адреса датчика
    if ( !ds.search(addr)) {
        ds.reset_search();
        delay(250);
        return;
    }
 
    ds.reset();
    ds.select(addr);
    ds.write(0x44, 1); // команда на измерение температуры

    delay(1000);

    ds.reset();
    ds.select(addr); 
    ds.write(0xBE); // команда на начало чтения измеренной температуры

    // считываем показания температуры из внутренней памяти датчика
    for ( i = 0; i < 9; i++) {
        data[i] = ds.read();
    }

    int16_t raw = (data[1] << 8) | data[0];
    // датчик может быть настроен на разную точность, выясняем её 
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7; // точность 9-разрядов, 93,75 мс
    else if (cfg == 0x20) raw = raw & ~3; // точность 10-разрядов, 187,5 мс
    else if (cfg == 0x40) raw = raw & ~1; // точность 11-разрядов, 375 мс

    // преобразование показаний датчика в градусы Цельсия 
    celsius = (float)raw / 16.0;
    Serial.print("t=");
    Serial.println(celsius);
}

Процедура на первый взгляд может показать совершенно непонятной. На самом деле, все эти 0xBE, 0x44 и т.п. взяты из спецификации к датчику. Для удобства мы можем всю процедуру вычисления выделить в отдельную функцию или даже в отдельный модуль.

Загружаем программу на Ардуино и запускаем монитор COM-порта. В окне терминала мы должны увидеть данные о температуре, обновляющиеся раз в секунду:

t=23.15
t=23.47
t=23.32

Вот и всё, датчик работает!

Заключение

С помощью датчика температуры можно сделать простейшую систему автоматической вентиляции в квартире или в теплице. Достаточно добавить в программу оператор условия, который будет проверять достижение температурой определенного значения и включать вентилятор с помощью реле. Подобным же образом мы работали с датчиком освещенности в уроке про реле.

Следующий большой шаг — персональная погодная станция. Но перед тем как браться за такой сложный проект, попробуем сначала научиться сохранять данные о температуре на карте памяти типа micro-SD. Об этом читайте в нашем следующем уроке!


Изменено: