В предыдущих уроках мы уже работали с датчиком температуры и влажности DHT11, а также с терморезистором. На этот раз попробуем разобраться ещё с одним популярным датчиком измеряющим температуру — DS18B20.
Это устройство позволяет измерять температуру в диапазоне от –55°C до +125°C с точностью ±0.5°C ( при температуре от –10°C до +85°C ). Питаться DS18B20 может как от 3.3, так и от 5 Вольт.
Сам по себе датчик — это микросхема, которая может встречаться в разных корпусах:
Также популярными являются готовые модули, на которых размещен датчик, резистор подтяжки и разъем.
Другой вариант — датчик в герметичной стальной капсуле с проводом:
Список необходимых компонентов
Для выполнения всех экспериментов в данном уроке, кроме самого датчика DS18B20 от RobotClass, потребуются: Ардуино-совместимый контроллер и немного проводов вилка-розетка. Необходимые компоненты можно добавить в корзину прямо здесь, и затем оформить заказ в нашем интернет-магазине.
1. Подключение модуля DS18B20-ROC к Ардуино
В этом уроке мы будем работать с модулем датчика температуры, разработанным в RobotClass. Подключать мы его будем к контроллеру Ардуино Уно.
Как и DHT11, датчик DS18B20 использует однопроводную шину (1-wire) для обмена данными с контроллером. Так что нам потребуется всего три провода чтобы подключить датчик к Ардуино.
Модуль DS18B20 | GND | VCC | OUT |
Ардуино Уно | GND | +5V | 2 |
Принципиальная схема
Внешний вид макета
Примечание. В случае использования не модуля, а отдельной микросхемы, необходимо вывод микросхемы 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. Об этом читайте в нашем следующем уроке!