На главную страницу | Новости | FAQ | Ссылки | Для детей | Контакты
Приведена схема подключения цифрового датчика температуры DS18B20 к плате Arduino и описан процесс получения данных с датчика. Также случай нескольких датчиков описан.
Часто приходится измерять температуру окружающей среды, или, скажем, требуется сделать простой домашний термометр на базе Arduino. Для этих целей нам понадобится цифровой датчик температуры, совместимый с Ардуино. Имхо, датчик
-- интерфейс
-- измеряемая температура от -55 до +125 °C;
-- точность
-- температура считывается 9-ю битами данных;
-- время на конвертацию температуры -- 0.75 сек.
Как видно, у датчика три вывода: земля
На вывод DQ надо повесить резистор (в районе 4.7 кОм плюс-минус) и можно подключать его к плате ардуино. К какому цифровому выводу подключать - не суть важно - это задается в программе. Например, если подключать на pin 10 (как на рисунке), то надо в программе задать
OneWire ds(10);
Приведем полный текст программы для работы с датчиком:
#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.
Впрочем, можно обойтись и без библиотеки 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 - внешнее);
Информация об измеренной температуре хранится в
- 1 и 2 байты - хранят информацию о температуре.
- 3 и 4 байты - хранят соответственно верхний и нижний пределы температуры.
- 5 и 6 байты - зарезервированы.
- 7 и 8 байты - используются для сверхточного измерения температуры.
- 9 байт - хранит помехоустойчивый CRC код предыдущих 8 байт.
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.
- Посылаем импульс сброса и принимаем ответ термометра.
- Посылаем команду 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, либо код, что я привел выше.
Хорошая новость заключается в том, что к шине 1-wire можно подключать несколько датчиков, не обязательно одних и тех же. В этом случае шина должна быть подтянута одним резистором.
Вот как это выглядить на практике
здесь, правда, использовался пин 2, т.е.
OneWire ds(2);
Now 23.11.24 12:27:41, Your IP: 52.15.217.86; arduino.zl3p.com/modules/ds18b20
ePN