domvpavlino.ru

Подключение датчика ds18b20 к arduino. Ардуино: датчик температуры DS18B20 от ROC. Скетч для работы с датчиком ds18b20 без delay

В этом уроке мы будем использовать датчик температуры DS18B20 с Arduino UNO для создания термометра. Датчик DS18B20 является хорошим вариантом, когда в проекте с высокой точностью требуется хорошая реакция. Мы покажем как подключить DS18B20 к вашему и отобразить данные температуры на ЖК-дисплее 16x2.

Обзор датчика DS18B20

Датчик DS18B20 взаимодействует с Arduino через 1-проводную шину. По определению для связи с Arduino требуется только одна линия данных (и земля).

Каждый DS18B20 имеет уникальный 64-битный последовательный код или адрес, который позволяет нескольким DS18B20s работать на той же однопроводной шине. Поэтому использование микропроцессора упрощает управление несколькими DS18B20, распределенными по большой площади. Приложения для этой функции включают в себя экологический контроль, системы контроля температуры в зданиях и механическом оборудовании.

Особенности DS18B20

  • Необходим только один однопроводный интерфейс для связи между микроконтроллером и датчиком.
  • Требуется только один внешний компонент: резистор 4,7 кОм.
  • Может питаться от линии передачи данных напрямую, требуя напряжения от 3,0 до 5,5 В.
  • Каждое устройство имеет уникальный 64-битный последовательный код, хранящийся на встроенном ПЗУ.
  • Может измерять температуру в диапазоне от -55° C до + 125° C (от -67° F до + 257° F).
  • Точность ± 0,5° C в диапазоне от -10° C до + 85° C.

В этом проекте используется DS18B20, который поставляется в форме температурного зонда, который является водонепроницаемым. Использование водонепроницаемого датчика расширяет возможности - датчик температуры сможет измерить температуру жидкостей, таких как вода, химикаты, чай и кофе.

Требования к комплектующим

Требования к оборудованию для вашего термометра достаточно стандартные, нам пригодятся:

  • ЖК-дисплей 16х2
  • Датчик температуры DS18B20
  • Провода для перемычек
  • Резистор 1K
  • Макетная плата

Схема соединения

Сделайте соединения согласно приведенной ниже схеме.

Соединяем датчик и Ардуино

  • VCC -> Arduino 5V, плюс резистор 4,7K, идущий от VCC к Data
  • Data -> Пин 7 Arduino
  • GND -> GND Arduino

Соединения для ЖК-дисплея и Arduino UNO

  • Пин 1 -> GND
  • Пин 2 -> VCC
  • Пин 3 -> Arduino Пин 3
  • Пин 4 -> Arduino Пин 33
  • Пин 5 -> GND
  • Пин 6 -> Arduino Пин 31
  • Пин 7-10 -> GND
  • Пин 11 -> Arduino Пин 22
  • Пин 12 -> Arduino Пин 24
  • Пин 13 -> Arduino Пин 26
  • Пин 14 -> Arduino Пин 28
  • Пин 15 -> VCC через резистор 220 Ом
  • Пин 16 -> GND

Подключите потенциометр, как показано выше, к контакту 3 на ЖК-дисплее, для управления контрастностью.

Этот проект работает на температурах до 125° C. В случае наличия некоторого диссонанса в значении показанной температуры дважды проверьте соединения с резистором, подключенным к DS18B20. После соединения всего, что описано выше, мы можем перейти к программированию.

Исходный код для термометра

Перед загрузкой исходного кода вам нужно настроить две библиотеки, необходимые для запуска этого кода в среде Arduino.

  • Первая библиотека называется - OneWire ().
  • Вторая библиотека называется - DallasTemperature ().

После скачивания обеих библиотек переместите файлы в папку библиотек Arduino по умолчанию. Затем скопируйте код в и загрузите его после двойной проверки правильности подключения вашего датчика.

//Code begins #include #include #include #define ONE_WIRE_BUS 7 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); float tempC = 0; float tempF = 0; LiquidCrystal lcd(12,11,5,4,3,2); void setup() { sensors.begin(); lcd.begin(16,2); lcd.clear(); pinMode(3, OUTPUT); analogWrite(3, 0); Serial.begin(9600); } void loop() { sensors.requestTemperatures(); tempC = sensors.getTempCByIndex(0); tempF = sensors.toFahrenheit(tempC); delay(1000); Serial.println(tempC); lcd.setCursor(0,0); lcd.print("C: "); lcd.print(tempC); lcd.print(" degrees"); lcd.setCursor(0,1); lcd.print("F: "); lcd.print(tempF); lcd.print(" degrees"); }

Примерно это выглядит так:

Мы смогли измерить температуру до 100°C с помощью этого датчика! Он очень отзывчив.

После того, как вы создали проект, потестируйте устройство, погрузив датчик в горячую и холодную воду.

Рассмотрим как при помощи Arduino считывать показания с цифрового датчика температуры DS18B20 или DS18S20. В настоящий момент м/с DS18B20 фирмы Dallas является наиболее распространенным и доступным цифровым датчиком температуры. Работает по протоколу . Даташит датчика:

Схема подключения датчика DS18B20 к Arduino приведена ниже. Подтягивающий Pull-Up резистор номиналом 4.7 кОм (5 кОм) включается между выводом DQ (Data) и питанием датчика Vdd.

Рабочий скетч представлен ниже. Необходима библиотека OneWire, последнюю версию которой можно скачать .

После установки библиотеки, в меню появиться рабочий пример, которым и можно воспользоваться.

#include "OneWire.h" // OneWire DS18S20, DS18B20, DS1822 Temperature Example // // http://www.pjrc.com/teensy/td_libs_OneWire.html // // The DallasTemperature library can do all this work for you! // http://milesburton.com/Dallas_Temperature_Control_Library OneWire ds(10); // on pin 10 (a 4.7K resistor is necessary) void setup(void) { Serial.begin(9600); } void loop(void) { byte i; byte present = 0; byte type_s; byte data; byte addr; float celsius, fahrenheit; if (!ds.search(addr)) { Serial.println("No more addresses."); Serial.println(); ds.reset_search(); delay(250); return; } Serial.print("ROM ="); for(i = 0; i < 8; i++) { Serial.write(" "); Serial.print(addr[i], HEX); } if (OneWire::crc8(addr, 7) != addr) { Serial.println("CRC is not valid!"); return; } Serial.println(); // the first ROM byte indicates which chip switch (addr) { case 0x10: Serial.println(" Chip = DS18S20"); // or old DS1820 type_s = 1; break; case 0x28: Serial.println(" Chip = DS18B20"); type_s = 0; break; case 0x22: Serial.println(" Chip = DS1822"); type_s = 0; break; default: Serial.println("Device is not a DS18x20 family device."); return; } ds.reset(); ds.select(addr); ds.write(0x44, 1); // start conversion, with parasite power on at the end delay(1000); // maybe 750ms is enough, maybe not // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad Serial.print(" Data = "); Serial.print(present, HEX); Serial.print(" "); for (i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } Serial.print(" CRC="); Serial.print(OneWire::crc8(data, 8), HEX); Serial.println(); // Convert the data to actual temperature // because the result is a 16 bit signed integer, it should // be stored to an "int16_t" type, which is always 16 bits // even when compiled on a 32 bit processor. int16_t raw = (data << 8) | data; if (type_s) { raw = raw << 3; // 9 bit resolution default if (data == 0x10) { // "count remain" gives full 12 bit resolution raw = (raw & 0xFFF0) + 12 - data; } } else { byte cfg = (data & 0x60); // at lower res, the low bits are undefined, so let"s zero them if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms //// default is 12 bit resolution, 750 ms conversion time } celsius = (float)raw / 16.0; fahrenheit = celsius * 1.8 + 32.0; Serial.print(" Temperature = "); Serial.print(celsius); Serial.print(" Celsius, "); Serial.print(fahrenheit); Serial.println(" Fahrenheit"); }

Так исторически сложилось, что на текущий момент одним из самых популярных цифровых температурных датчиков является датчик DS18B20 корпорации Dallas Semiconductor. Конечно же и мы не можем обойти его стороной.

Вся память DS18B20 включает в себя оперативную (SRAM) и энергонезависимую (EEPROM) память. В EEPROM хранятся регистры TH, TL и регистр конфигурации. Если функция тревожного сигнала не используется, то регистры TH и TL могут использоваться как регистры общего назначения. В режиме термостата TH содержит значение верхнего порога температуры, TL соответственно нижнего порога.

Кодинг.

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

Любое общение с датчиком начинается с команды Reset . То есть МК прижимает шину данных в состояние логический «0» на 480 µs, потом отпускает ее. Датчик отвечает на это сигналом присутствия, после чего мы отправляем команду Skip ROM (0xCC) . Тое сть обратимся ко всем датчика которые присутствуют на шине.

OneWire(uint8_t pin);

Конструктор, Pin – номер вывода, к которому подключен датчик.

uint8_t reset(void);

Инициализация операции на шине. С этой команды должна начинаться любая операция обмена данными. Возвращает:

  • 1 – если устройство подключено к шине (был ответный импульс присутствия);
  • 0 – если устройство отсутствует на шине (ответного импульса не было).
void write(uint8_t v, uint8_t power = 0);

Запись байта. Передает байт в устройство на шине.

Отправим команду 0x44 инициализации измерения температуры.

Пауза 1 сек . Ожидание на время, необходимое для выполнения датчиком преобразования температуры. Это время зависит от выбранной разрешающей способности датчика. Разрешение 12 бит установлено в датчике по умолчанию. Время преобразования для него – 750 мс.

Затем мы отправляем команду Reset , Skip ROM (0xCC) , а замет команду 0xBE чтения памяти датчика.

Вот и сам код из библиотеке:

#include // OneWire DS18S20, DS18B20, DS1822 Temperature Example // // http://www.pjrc.com/teensy/td_libs_OneWire.html // // The DallasTemperature library can do all this work for you! // http://milesburton.com/Dallas_Temperature_Control_Library OneWire ds(10); // датчик на выводе 10 (а резистор 4.7 K является необходимым) void setup(void) { Serial.begin(9600); } void loop(void) { byte i; byte present = 0; //переменные byte type_s; byte data; byte addr; float celsius, fahrenheit; if (!ds.search(addr)) { Serial.println("No more addresses."); Serial.println(); ds.reset_search(); delay(250); return; } Serial.print("ROM ="); for(i = 0; i < 8; i++) { Serial.write(" "); Serial.print(addr[i], HEX); } if (OneWire::crc8(addr, 7) != addr) { Serial.println("CRC недопустимый!"); return; } Serial.println(); // первый байт ROM указывает, какой чип (8 бит код чипа, 48 бит серийный номер, 8 бит CRC) switch (addr) { case 0x10: Serial.println(" Chip = DS18S20"); // or old DS1820 type_s = 1; break; case 0x28: Serial.println(" Chip = DS18B20"); type_s = 0; break; case 0x22: Serial.println(" Chip = DS1822"); type_s = 0; break; default: Serial.println("Не является устройством семейства DS18x20."); return; } ds.reset(); ds.select(addr); ds.write(0x44, 0); // старт преобразования с питание от внешнего источника. delay(1000); // ждем конца преобразования. // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(addr); ds.write(0xBE); // Читаем память. Serial.print(" Data = "); Serial.print(present, HEX); Serial.print(" "); for (i = 0; i < 9; i++) { // нам нужно 9 байт data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } Serial.print(" CRC="); Serial.print(OneWire::crc8(data, 8), HEX); Serial.println(); // Преобразование данных в фактическую температуру //поскольку результатом является 16-разрядное целое число со знаком // ранится в типе "int16_t", который всегда составляет 16 бит // даже при компиляции на 32-битном процессоре. int16_t raw = (data << 8) | data; if (type_s) { raw = raw << 3; // 9 бит разрешение по умолчанию у датчиков DS18S20 or old DS1820 if (data == 0x10) { // "количество остается" дает полное разрешение 12 бит raw = (raw & 0xFFF0) + 12 - data; } } else { byte cfg = (data & 0x60); // при более низком разрешении низкие биты не определены, поэтому давайте обнуляем их. if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms //// default is 12 bit resolution, 750 ms conversion time } celsius = (float)raw / 16.0; fahrenheit = celsius * 1.8 + 32.0; Serial.print(" Temperature = "); Serial.print(celsius); Serial.print(" Celsius, "); Serial.print(fahrenheit); Serial.println(" Fahrenheit"); }

Собственно это библиотека подходить для всех датчиков семейства DS18 (DS18B20, DS18S20, DS1820, DS1822) подключение не чем не отключаются. Ну а некоторые различия можно уже узнать из datesheet к ним.

В процессе изучения микроконтроллеров рано или поздно возникает необходимость измерения такого метеорологического параметра окружающей среды, как ее температура. Современный мировой рынок электронных комплектующих предлагает широкий ассортимент датчиков температуры. Основные отличия между ними состоят в диапазоне измеряемой температуры, напряжении питания, области применения, габаритных размерах, способах преобразования температуры, интерфейсом для взаимодействия с пользовательской управляющей системой. Так исторически сложилось, что на текущий момент одним из самых популярных температурных датчиков является датчик DS18 B20 корпорации Dallas Semiconductor. О нем следующее повествование.

DS18 B20 – цифровой датчик температуры с программируемым разрешением преобразования.

Отличительные особенности:

1) Использование интерфейсной шины данных 1-Wire для взаимодействия с управляющей системой;
2) Наличие уникального 64-битного последовательного идентификационного кода, расположенного во внутренней ROM-памяти и предназначенной для многоточечных систем, где необходимо адресовать конкретный датчик;
3) Напряжение питания составляет 3-5,5В, что позволяет использовать его не только в 5-вольтовых системах, но и в 3,3 (большинство микроконтроллеров);
4) Диапазон измеряемой температуры составляет -55…+125 о С;
5) Точность в ±0,5 о С, правда это верно только для диапазона -10…+85 о С;
6) Разрешение преобразования определяется пользователем и составляет 9…12 бит;
7) Имеет внутренние регистры триггеров верхнего и нижнего порогов срабатывания с вырабатыванием сигнала тревоги для систем, использующих термостатическую логику работы;
8) Эти датчики программно совместимы с DS1822 и широко применяются в промышленных термостатических регуляторах, индустриальных системах, в потребительской электронике и других термочувствительных системах.

Описание и принцип работы устройства:

В своей статье я опишу пример работы с датчиком, выполненном в корпусе TO-92.

Выглядит он таким образом:

Внутри эта штуковина устроено очень просто, взгляните сами:

Рассмотрим поподробнее эту блок-схему.

Однако питание таким способом вносит некоторые ограничения на временные параметры датчика. Удержание линии данных некоторое время разрядит конденсатор, что приведет к обесточиванию линии INTERNAL Vdd, а соответственно и датчика в целом. Поэтому в неиспользуемое время на линии DQ должен поддерживаться высокий логический уровень. Следует отметить одно важное замечание. При операциях преобразования температуры и копирования данных из Scratchpad в EEPROM (в один из регистров), потребляемый линией INTERNAL Vdd ток может достигать 1,5мА, что непосильно внутреннему конденсатору, а на резисторе подтяжки будет большое падение напряжения, что недопустимо скажется на работе устройства в целом. Для этого необходимо организовать линии DQ схему мощной подтяжки, реализуемой по вот такой схеме:

После выдачи команды Convert T или Copy Scratchpad необходимо включить мощную подтяжку MOSFET-транзистором линии DQ не позднее 10мкс(макс.), как утверждают разработчики датчика, после чего выждать время преобразования (Tconv) или время передачи данных (Twr=10мс), причем в это время никаких действий при включенной мощной подтяжке на линии DQ быть не должно!

Про стандартное питание нужно мало что сказать, ведь тут все просто, и даже MOSFET не нужен вовсе:

Подсистема «64-BIT ROM AND 1-Wire PORT» содержит в себе уникальный 64-битный последовательный идентификационный код, расположенный в энергонезависимой памяти ROM, также в этом узле расположен интерфейс взаимодействия с управляющей системой 1-Wire. Подсистема «Memory Control Logic» осуществляет передачи данных между подсистемой интерфейса 1-Wire и памятью типа Scratchpad, которая, в свою очередь, имеет доступ к регистрам температурного датчика, регистрам установки верхнего и нижнего порогов срабатывания сигнала тревоги, конфигурационному регистру и регистру генератора 8-битноой контрольной суммы для защиты системы от неправильных данных.

При включении питания по умолчанию датчик имеет разрешение преобразования 12 бит, и сразу входит в режим пониженного энергопотребления. Для инициирования преобразования ведущее устройство должно передать команду Convert T . После преобразования температуры в цифровой код, этот код располагается в Scratchpad-памяти в виде двухбайтного слова, и датчик снова переходит в энергосберегающий режим.

Преобразование температуры.

Теперь разберемся, как преобразуется температура в датчике. По сути, внутри самого температурного сенсора располагается АЦП, и выходные данные, расположенные в регистре температуры, переносятся в Scratchpad-память. Данные о температуре имеют следующий формат:

Флаг S – флаг знака, используется для указания знака числа (S=0 – число, содержащееся в битах 10-0 положительно, и S=1, если число, содержащееся в тех же битах отрицательно, т.е. в данном случае температура представляется в дополнительном коде (коде дополнения до двух)).

При настройке на разрешение преобразования 12 бит все 12 бит (bit 11- bit 0) задействованы и содержат достоверные данные. При настройке на разрешение 11 бит содержимое бита 0 не следует принимать в расчет, при настройке на 10 бит не следует принимать в расчет биты 0 и 1 и т.д.

Сигнал тревоги – функция термостата.

Для этого предусмотрено 2 8-битных регистра, Th и Tl. В Th содержится значение верхнего порога температуры, а в Tl – соответственно нижнего. Если температура выше значение Th или ниже Tl устанавливается флаг тревоги. Этот флаг тревоги обнаруживается ведущим устройством посредством выдачи команды Alarm Search на линию DQ. Флаг тревоги обновляется при после каждой операции преобразования температуры. Кстати, только биты с 11 по 4-й регистра температуры используются в сравнении с регистром Th или Tl, отсюда следует, что функция термостата работает только для целых значений температуры. Регистры физически являются EEPROM памятью, поэтому они сохраняют свои значения при выключении питания. Сами регистры аналогичны регистру температуры, только они 8-битные, флаг S имеет абсолютно такое же значение, как и в предыдущем случае:

Этот код, как отмечалось ранее, необходим для идентификации каждого устройства на линии в системах многоточечного измерения температуры.

Формат этой памяти такой:

Младшие 8 бит отводятся для обозначения семейства, и содержат значение 0х28.Следующие 48 бит содержат уникальный серийный номер устройства. Самый старший байт содержит значение контрольной суммы CRC, рассчитываемой для младших 56 бит ROM-памяти.

Организация памяти.

Память датчика состоит из пространства памяти блокнотного типа (Scratchpad) и EEPROM-памяти для хранения данных конфигурации и значений регистров верхнего и нижнего порогов сигнала тревоги.

При выключении питания данные байта 2, 3 и 4 сохраняют свое значение в EEPROM. Ну а при включении, значение в них остаются неизменными. Байт 0 и 1 содержат значение преобразованной температуры, байты 5, 6, 7 зарезервированы для внутреннего использования и не могут быть доступны пользователю для его нужд.

8-й байт содержит значение, генерируемое встроенной логикой формирования CRC-кода для байтов с 0 по 7, что сводит к минимуму возможность ошибочного определения температуры в конечном итоге.

Следует отметить, что если функция термостата не используется, то регистры Th и Tl могут использоваться как память общего назначения – в них вы можете хранить любую информацию.

Данные записываются в байты 2, 3 и 4 начиная с младшего бита байта 2 при помощи команды Write Scratchpad . Для проверки целостности записанных данных, можно их прочитать, для чего необходимо передать датчику команду Read Scratchpad , после чего ведущее устройство должно принимать данные начиная с младшего бита байта 0.

Для сохранения данных старшего, младшего регистров термостата а так же регистра конфигурации в EEPROM-памяти, ведущее устройство должно передать датчику команду Copy Scratchpad .

Как отмечалось ранее, данные, уже записанные в EEPROM, при выключении питания сохраняются. Но при включении питания из соответствующих EEPROM-ячеек значения автоматически загружаются в соответствующие регистры памяти scratchpad. Удобно, не правда ли?:)

Кроме всего, данные, записанные в EEPROM, в любое время могут быть перезаписаны в scratchpad-память. Это необходимо например для того, когда вы изменили конфигурацию в процессе работы, а потом вам надо встать на «штатный режим работы», т.е. вернуть ту конфигурацию работы, которая была до изменения содержимого регистров памяти scratchpad. Вот собственно для этого ведущее устройство должно передать датчику команду Recall E 2 .

В регистре конфигурации пользователем могут определяться только 2 бита: R0 и R1. Эти биты определяют разрешение преобразования температуры, и по дефолту установлены в 1, что и определяет изначальную настройку на 12-битное разрешение преобразования.

Все возможные конфигурации этих битов и соответствующие разрешения представлены в таблице ниже. Следует отметить, что чем больше разрешение преобразования, тем больше время преобразования, например, для 12-битного разрешение время преобразования составляет 750мс (макс.).

Взаимодействие с управляющей системой.

DS18B20, как отмечалось ранее, для связи с ведомым устройством используют интерфейсную шину данных 1-Wire. Поэтому для его подключения управляющая система должна обеспечивать выход с открытым стоком или с Hi-Z состоянием линии.

Внутренняя конфигурация интерфейса датчика показана ниже:

В неактивном состоянии (в состоянии простоя) линия DQ подтянута резистором к «+» питания. Таким образом между транзакциями (передачами данных) эта линия всегда должна удерживаться в этом состоянии. Если по какой-либо причине транзакции должны быть приостановлены, линия DQ должна удерживаться в высоком логическом уровне, если эта передача дальше будет возобновлена. В процессе остановки транзакции мы сколько угодно долго можем держать линию DQ в высоком логическом уровне, начиная с 1мкс. Но, если шина данных будет удержана в низком логическом уровне дольше 480мкс, произойдет полный сброс всех датчиком, присутствующих на этой шине.

Последовательность операций для обмена.

Каждый раз при обращении управляющей системы к датчику должна быть соблюдена следующая последовательность действий:

1) Инициализация;
2) Команда ROM (за которым следует необходимый обмен данными);
3) Функциональная команда датчика (за которой следует необходимый обмен данными).

Если какой либо шаг при обращении к датчику отсутствует – датчик не будет реагировать. Исключение составляют команды Search ROM [ F 0 h ] и Alarm Search [ ECh ] , после их выполнения мастер должен вернуться к первому шагу управляющей последовательности.

Итак. Все транзакции начинаются с инициализации. Эта операция сопровождается выработкой ведущим устройством импульса сброса, на который ведомые устройства (в данном случае датчик(-и)) передают ведущему импульс присутствия, которые дают ему знать, что датчики подключены и готовы к работе.

Вообще интерфейсная шина 1-Wire, реализуемая в датчике, определяет несколько типов сигналов на линии данных: импульс сброса, импульс присутствия, запись 0, запись 1, чтение 0, чтение 1. Все эти операции реализует ведущее устройство, за исключением импульса присутствия. Его формирует только датчик(-и).

Итак, для начала ведущее устройство переходит в режим передатчика и устанавливает линию DQ в 0 на время не менее 480мкс (выделено жирным черным цветом). Это сбрасывает датчик. Затем линию необходимо отпустить, и перевести ведущее устройство в режим приемника, при этом подтягивающий резистор установит линию данных в высокий логический уровень (выделено тонким черным цветом). После того, как датчик почует нарастающий фронт, датчик выждет время 15-60мкс и своим аппаратным интерфейсом сбросит линию данных в 0, и будет ее держать в течение 60-240мкс. По истечении этого времени датчик отпустит линию и она установится в уровень логической 1 в течение не менее 480мкс после обнаружения датчиком импульса сброса.

Теперь поговорим о том, как осуществляется процесс передачи данных. Вообще, передачи бита. Дело в следующем. Берется отрезок времени, и в течение этого времени мастер смотрит, что там у нас на линии, допустим 1 – значит записали 1, если 0 – значит записали ноль. Но это только абстрактное объяснение. На самом деле там есть некоторые нюансы, связанные с временными рамками всего этого дела.

Смотрим картинки:

Все начинается с того, что ведущий должен опустить линию данный в низкий логический уровень, и с этого момента начинается слот записи/чтения 1/0, длящийся от 60 до 120мкс. Между слотами записи/чтения линия данных обязательно должна установиться в 1 на время, не меньшее времени восстановления (1мкс). Для организации слота записи 0 необходимо все время слота держать линию данных в 0, если же необходимо записать в датчик 1, то сначала сбрасываем линию данных в 0, затем ждем не менее 1мкс и отпускаем линию в 1, в течение слота записи 1 (60-120мкс) будет записана 1 в датчик (см. верхний правый рисунок).

Собственно говоря, если в течение 15-60мкс после старта будет обнаружена 1 на линии данных, то запишется 1, а если в течение 60-240мкс обнаружится 0 – то и запишется 0.

Чтение данных сопровождается ведущим устройством, когда он сбрасывает линию, ждет не менее 1мкс, и в течение 15мкс смотрит, что на линии творится: если остался 0, то датчик передает 0, если переключилась в 1, - то и передалась 1.

Команды.

ROM-команды.

Эти команды должны следовать за последовательностью инициализации и содержат инструкции поиска соответствующего датчика и т.д. Разрядность каждой команды 8бит. После выполнения соответствующей команды можно передать функциональную команду датчику.

SEARCH ROM

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

READ ROM

Эта команда используется только тогда, когда на шине имеется лишь один датчик. Это позволяет ведущему устройству считать содержимое 64 бит ROM-памяти не используя команду ее поиска. А если же вы попробуете использовать эту команду при подключенном количестве датчиков, более 1, все они начнут передавать содержимое этой памяти, что приведет к нежелательным последствиям.

MATCH ROM

Это команда соответствия ROM. Мастер выпускает 64 бита соответствующей памяти ROM подключенного к шине датчика, и там уже определяется, что с ним делать (измерить температуру, и т.д.). Другие датчики на шине будут в это время ждать своей очереди.

SKIP ROM

Это команда пропуска ROM. Не принимает в расчет адрес какого-либо конкретного датчика на шине, а обращается сразу ко всем. После этой команды, можно выдать, например, команду преобразования температуры, и все датчики начнут преобразование. Однако вывести команду чтения памяти после вызова этой команды приведет к непредсказуемым результатам (потому что сразу все датчики будут передавать данные). Значит, только при одном подключенном датчике возможна такая ситуация.

ALARM SEARCH

Эта команда идентична первой в этой таблице за исключением того, что осуществляет поиск датчиков на шине с установленным флагом тревоги.

Функциональные команды.

Эти команды осуществляют функциональные операции каких либо процессов, например, запуск операции преобразования температуры, копирование памяти и т.д. Всего команд 6, разрядность каждой 8бит.

CONVERT T

Запуск преобразования температуры. После выполнения этой команды 2-байтные данные заносятся в регистр температуры.

WRITE SCRATCHPAD

Записывает данные в регистры 2-4 начиная со второго, младшим битом вперед. Во время передачи данные в три регистра необходимо следить, чтобы мастер не сбросил датчики, потому что возможна потеря данных.

READ SCRATCHPAD

Инициирует процесс передачи данных всех регистров памяти scratchpad, начиная с младшего бита байта 0 и заканчивая старшим битом байта 8 (CRC).

COPY SCRATCHPAD

Эта команда копирует содержимое регистров байта 2, 3 и 4 в соответствующие EEPROM-ячейки.

RECALL E 2

Эта команда копирует данные из EEPROM в соответствующие места в блокнотной памяти scratchpad. Как отмечалось ранее, при включении питания эта операция происходит автоматически.

READ POWER SUPPLY

Вот, собственно, и вся премудрость работы с датчиком температуры DS18B20. За более детальной информацией обращаемся в даташит (). Теперь необходимо все это дело реализовать в железе.

Принципиальная схема устройства:

Сборочный чертеж печатной платы (извиняюсь за качество, делал лишь бы работало, для отладки):

Не забудьте правильно отзеркалить плату

Поскольку это макетка, я вытащил ее из старого проекта, поэтому на плате, приведенной выше – немного не то, что у меня (на своей я сейчас убрал все лишнее и оно стало точь-в-точь как на рисунках выше).

Вот что вышло у меня:

Получился этакий бутерброд

Исходный код программы был написан в среде разработки . Я не старался использовать максимум готовых библиотек avr-gcc компилятора, а писал все, как говорится, «от руки». Моя цель – это не демонстрация виртуозного владения Си, а всего лишь пример, написанный за час, способный предоставить новичкам общее представление по работе с датчиком.
Устройство предназначено для использования в комнате, поэтому не предусматривает измерение отрицательных температур.

Скачать исходники и печатную плату LAY вы можете ниже

Все дополнительные вопросы, пожелания жду по адресу: [email protected]

В предыдущих уроках мы уже работали с датчиком температуры и влажности DHT11, а также с терморезистором. На этот раз попробуем разобраться ещё с одним популярным датчиком измеряющим температуру — DS18B20. Это устройство позволяет измерять температуру в диапазоне от –55°C до +125°C с точностью ±0.5°C (при температуре от –10°C до +85°C). Питаться DS18B20 может как от 3.3, так и от 5 Вольт. Сам по себе датчик — это микросхема, которая может встречаться в разных корпусах: Также популярными являются готовые модули, на которых размещен датчик, резистор подтяжки и разъем.
Другой вариант — датчик в герметичной стальной капсуле с проводом:

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

В этом уроке мы будем работать с модулем датчика температуры, разработанным в RobotClass. Подключать мы его будем к контроллеру Ардуино Уно. Как и DHT11, датчик DS18B20 использует однопроводную шину (1-wire) для обмена данными с контроллером. Так что нам потребуется всего три провода чтобы подключить датчик к Ардуино. Принципиальная схема Внешний вид макета
Примечание. В случае использования не модуля, а отдельной микросхемы, необходимо вывод микросхемы OUT соединить с контактом питания через резистор 4,7 КОм. В указанном выше модуле этот резистор уже установлен.

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

Напишем программу, которая будет каждую секунду считывать показания температуры с датчика и выводить их в COM-порт. #include OneWire ds(2); void setup() { Serial.begin(9600); } void loop() { byte i; byte data; byte addr; 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 << 8) | data; // датчик может быть настроен на разную точность, выясняем её byte cfg = (data & 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 Вот и всё, датчик работает!

Заключение

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