На главную страницу | Новости | FAQ | Ссылки | Для детей | Контакты

ARDUINO ROBOTS
Arduino для начинающих электронщиков. Модули и проекты на базе Arduino. Разработка роботов


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


Приведена схема подключения цифрового датчика температуры DS18B20 к плате Arduino и описан процесс получения данных с датчика. Также случай нескольких датчиков описан.

Часто приходится измерять температуру окружающей среды, или, скажем, требуется сделать простой домашний термометр на базе Arduino. Для этих целей нам понадобится цифровой датчик температуры, совместимый с Ардуино. Имхо, датчик DS18B20 - лучший в своем роде по соотношению качества/цена. Стоит он около доллара и имеет достаточно хорошую точность, плюс-минус 0.5 градуса.

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

Технические характеристики датчика DS18B20:


-- интерфейс 1-Wire (т.обр., занимает один пин на ардуине для его подключения);

-- измеряемая температура от -55 до +125 °C;

-- точность 0.5 град. в диапазоне от -10 до +85 °С;

-- температура считывается 9-ю битами данных;

-- время на конвертацию температуры -- 0.75 сек.

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


Подключение_DS18B20_к_Arduino

Как видно, у датчика три вывода: земля GND, питание VDD и вывод DQ для передачи данных по линии 1-Wire.

На вывод DQ надо повесить резистор (в районе 4.7 кОм плюс-минус) и можно подключать его к плате ардуино. К какому цифровому выводу подключать - не суть важно - это задается в программе. Например, если подключать на pin 10 (как на рисунке), то надо в программе задать

OneWire ds(10); 

Простой пример работы с DS18B20 (с помощью библиотек)


Приведем полный текст программы для работы с датчиком:

 #include < OneWire.h >
 #include < DallasTemperature.h >
 #define ONE_WIRE_PIN 10 // номер пина для 1-wire линии
OneWire ds(ONE_WIRE_PIN);  // создаем объект ds для работы с датчиком 
DallasTemperature sensors(&ds);  // передаем ссылку на ds в объект sensors, через который будем управлять датчиком
 
void setup(void)
{
  Serial.begin(9600);
  Serial.println("DS18B20 Demo");
  sensors.begin();
}
 
 
void loop(void)
{
  Serial.print(" Requesting temperatures...");
  sensors.requestTemperatures(); // запрос на получение данных
  Serial.println("DONE");
  Serial.print("Temperature for Device 1 is: ");
  Serial.print(sensors.getTempCByIndex(0)); // получаем температуру и печатаем
}

- здесь самый высокоуровневый способ работы с датчиком, когда используется не только библиотека OneWire, но и библиотека DallasTemperature.

Скачать эти библиотеки можно отсюда:

https://github.com/milesburton/Arduino-Temperature-Control-Library

https://github.com/PaulStoffregen/OneWire

Конечно, OneWire обычно идет вместе со средой, так что нужно только DallasTemperature.

Только с помощью OneWire.h


Впрочем, можно обойтись и без библиотеки DallasTemperature, тогда нужно будет в ручную отправлять команды на датчик. Для этого нужно знать собственно команды. Посмотрим сначала на пример такого кода:

 #include < OneWire.h >  // подключаем библиотеку
OneWire ds(10); // подключаем датчик ds18b20 к выводу 10

void dallas_start() // start conversion
{
  ds.reset(); 
  ds.write(0xCC);
  //ds.select(addr); 
  ds.write(0x44); // start conversion, with parasite power on at the end
}

float dallas_temp() 
{
  byte data[3];
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE);    // Read Scratchpad
  data[0] = ds.read(); 
  data[1] = ds.read();
  data[2] = ds.read();
  int Temp = (data[1] << 8) + data[0];
  float temp = Temp / 16.0;
  return temp;
}

dallas_start();

void loop()
{
	temp_ds = dallas_temp();
	delay(1000); // не менее 750 мс
	Serial.println(temp_ds);
}

По сути здесь мы просто сами реализовали некоторые нужные нам функции, которые есть также в классе DallasTemperature (используемом в примере выше).


Внутри датчика DS18B20 стоит свой небольшой контроллер, с которым ардуина общается посредством команд. Команды передаются с помощью метода write класса OneWire:

write(byte) - основной метод класса OneWire, который передает байт данных на устройство. Байт представляет собой определенную команду. Для DS18B20 это следующие основные команды:

0x44 - провести измерение температуры и записать данные в оперативную память;

0x4E - записать 3 байта в 3й, 4й и 5й байты оперативной памяти;

0xBE - считать последовательно 9 байт оперативной памяти;

0x48 - скопировать 3й и 4й байты оперативной памяти в EEPROM;

0xB8 - скопировать данные из EEPROM В 3й и 4й байты оперативной памяти;

0xB4 - вернуть тип питания (0 - паразитное, 1 - внешнее);


Информация об измеренной температуре хранится в оперативной памяти датчика, которая состоит из 9 байт:

- 1 и 2 байты - хранят информацию о температуре.

- 3 и 4 байты - хранят соответственно верхний и нижний пределы температуры.

- 5 и 6 байты - зарезервированы.

- 7 и 8 байты - используются для сверхточного измерения температуры.

- 9 байт - хранит помехоустойчивый CRC код предыдущих 8 байт.

Вот список основных методов класса OneWire:


search(addressArray) - Выполняет поиск следующего 1-Wire устройства, если устройство найдено, то в 8-байтный массив addressArray записывается его ROM код, иначе возвращает false;

reset_search() - Выполняет новый поиск с первого устройства;

reset() - Выполняет сброс шины, необходимо перед связью с датчиком;

select(addressArray) - Выполняет выбор устройства после сброса, передается ROM Код устройства;

write(byte) - Передает информационный байт на устройство;

write(byte,1) - Передает информационный байт на устройство, работающее в паразитном режиме питания;

read() - Считывает информационный байт с устройства;

crc8(dataArray,length) - Вычисляет CRC код байтов из массива dataArray длиной length.

Порядок взаимодействия с DS18B20 для получения информации о температуре:


- Посылаем импульс сброса и принимаем ответ термометра.

- Посылаем команду Skip ROM [CCh].

- Посылаем команду Convert T [44h].

- Формируем задержку минимум 750мс.

- Посылаем импульс сброса и принимаем ответ термометра.

- Посылаем команду Skip ROM [CCh].

- Посылаем команду Read Scratchpad [BEh].

- Читаем данные из промежуточного ОЗУ (8 байт) и CRC.

- Проверяем CRC, и если данные считаны верно, вычисляем температуру.

При этом происходит следующее:


1) МК генерирует сигнала reset, удерживая шину 1-wire в состоянии лог. 0 в течении 480 мкс.

2) Ждем не менее 15 мкс, но не более 60 мкс. За это время подтягивающий резистор поднимает уровень на шине до лог. 1.

3) Датчик удерживает шину в состоянии лог. 1 в течении не менее 60 микросекунд. Если за это время шина не сменит свое состояние на лог. 0, то значит на шине ошибка либо датчик нерабочий (это помогает выявить неисправный датчик).


Короче, здесь всё достаточно мудрено. Чтобы не париться, используем готовую библиотеку DallasTemperature, либо код, что я привел выше.

Схема подключения двух и более датчиков температуры DS18B20 к одной плате Ардуино


Хорошая новость заключается в том, что к шине 1-wire можно подключать несколько датчиков, не обязательно одних и тех же. В этом случае шина должна быть подтянута одним резистором.

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

Фото подключения датчика


Вот как это выглядить на практике

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

здесь, правда, использовался пин 2, т.е.

OneWire ds(2); 




Платы ARDUINO по низкой цене

Нажми на изображение, чтобы заказать в интернет-магазине:


arduino NANO купить дешево arduino UNO купить дешево arduino UNO R3 ORIG купить дешево arduino MEGA купить дешево arduino DUE купить дешево



Now 28.11.20 22:28:23, Your IP: 100.24.113.182; arduino.zl3p.com/modules/ds18b20