Использование onewire. встроенная библиотека

mikroPascal for AVR. Урок 5. Использование OneWire. Встроенная библиотека

Это уже наш 5 урок по mikroPascal for AVR, и в нем будет рассмотрен интерфейса OneWire, применительно к среде разработки mikroPascal. А точнее, встроенная библиотека «One_Wire».

Как вы наверное уже догадались, слово «встроенная» тут ничего хорошего не предвещает, а именно, доступно всего три процедуры: сбросить линию (ow_reset), отправить байт (ow_write) и принять байт (ow_read). Вот собственно и все,видимо разработчики посчитали что этого должно хватить. Да, для базовых операций этого как раз таки хватает, но не более. В качестве наглядного пособия будем использовать DS18B20, ведь многие будут собирать свой первый цифровой термометр именно на нем (или уже собрали 🙂 ).

И так, начнем с самого начала. Что такое 1-wire?

1-Wire — двунаправленная шина связи для устройств с низкоскоростной передачей данных , в которой данные передаются по цепи питания (то есть всего используются два провода — один для з аземл ения , а второй для п итания и д анных ; в некоторых случаях используют и отдельный провод питания). Разработана корпорацией Dallas Semiconductor (с 2001 года — Maxim Integrated ).

То есть, на одном проводе может быть большое количество различных устройств. Кроме того, большинство устройств 1-Wire поддерживает т.н. «паразитное питание» (имеют префикс «PAR»). Соответственно, для радиолюбителей они привлекательны по той причине, что для нескольких датчиков нужна всего 1 нога микроконтроллера. Полный разбор 1-Wire можно найти в поиске на сайте, или по ссылке: http://cxem.net/comp/comp53.php

Так как в этом уроке цель — поработать с библиотекой, то рассмотрим следующие ситуации: датчик всего один, датчиков много (на разных пинах), датчиков много (на одном пине), запись / чтение конфигурации в память датчика.

Начнем с одного датчика.

Последовательность команд можно легко найти в интернете, вот она:

  1. Посылаем команду сброса;
  2. Посылаем общую команду;
  3. Посылаем функциональную команду;

Вот схема (одинакова для всех примеров) и код :

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

В данном случае, используется датчик U2 (верхний левый угол схемы).

Следующий шаг — подключение нескольких устройств 1-Wire (в нашем случае DS18B20), к микроконтроллеру. Для подключения использованы различные пины МК. В принципе, можно было сделать несколько различных процедур для считывания температуры (по одной на каждый датчик), но это было бы очень громоздко и неэффективно. По этому, задача была решена таким способом:

А вот скрин Proteus’a:

Как видите, различия в коде невелики. В основном, они относятся к введению переменной, для выбора пина порта, на который «подвешен» датчик.

Следующий пример будет сложнее, так как мы будем считывать температуру с 4-х датчиков, подключенных на 1 пин. Сложность состоит в том, что использование одного провода требует определения ROM кодов всех устройств, находящихся на линии, для правильной адресации команд. Но вся беда в том, что встроенная библиотека не позволяет провести поиск всех устройств (об этом будет рассказано в следующем уроке). Приходится узнавать ROM коды устройств по очереди: подключил одно — считал, подключил второе — считал и т.д. Так сейчас и поступим.

Предлагаю вашему вниманию следующий код:

Как видите, код не намного сложнее предыдущего варианта. Последовательность работы следующая: нужно по очереди подключать датчики и нажимать на кнопку. После того, как будет «сохранен» последний (4-й) датчик нажатие на кнопку запустит измерение температуры. Вот результат:

Ну и на последок, еще один примерчик — запись и чтение в регистры DS18B20. Если кто-то не знает, то регистров в этом датчике всего 3 (доступных для чтения/записи): TH, TL, регистр конфигурации. Нас сейчас интересует именно последний. В регистре конфигурации можно изменить всего 2 бита — они отвечают за разрешение датчика и как следствие, за длительность конвертирования. С помощью периведенного ниже кода можно настроить датчик на 9 бит (наименьшая точность и наивысшая скорость — 91 мс).

Вот такой маленький, но полезный код. Ниже приведены скриншоты окна Proteus’a. Первый — без записи в регистр, а второй с записью разрешения 9 бит.

Вот и все. Урок подошел к концу, спасибо всем тем, кто его прочитал/просмотрел! Следующий урок тоже буде на тему 1_Wire, но будет рассмотрена другая библиотека, я сейчас занимаюсь ее портированием / дописыванием. В ней (скорее всего) будут «из коробки» доступны такие функции как: поиск датчиков, определение количества датчиков, подключен датчик или нет и т.д. В любом случае, она будет более удобна чем эта.

Датчик температуры DS18B20,Arduino и библиотека OneWire.

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

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

Особенности датчика :

  • Простой интерфейс подключения 1-Wire .
  • Наличие уникального 64-битного адреса датчика, для использование систем с большим числом датчиков.
  • Напряжение питания от 3 V до 5.5 V .
  • Точность в ±0,5 С, для диапазона -10…+85 С . Для диапазона -55… +125 точность ± 2 С.
  • Возможность паразитного питания (Parasite power).

Более подробно можно почитать в Datasheet или на русском . Мы не будем заморачиваться с паразитным питание и подключим датчик всем тремя проводами. Если у вас не готовый модуль о вам придется поставить еще подтягивающий резистор для работы по 1-Wire.

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

Кодинг.

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

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

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

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

  • 1 – если устройство подключено к шине (был ответный импульс присутствия);
  • – если устройство отсутствует на шине (ответного импульса не было).

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

  • v – байт;
  • power – признак выбора режима питания;
    power = – питание от внешнего источника.
    power = 1 – “паразитное” питание.

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

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

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

Читайте также  Подключение камеры ov9655

uint8_t.read_bytes(buf, 9) — Чтение 9 ти байтов данных.

Основные команды библиотеке OneWire :
  • search(addressArray) – ищет температурный датчик, при нахождении в массив addressArray записывается его код, в ином случае – false.
  • reset_search() – производится поиск на первом приборе.
  • reset() – выполнение сброса шины перед тем, как связаться с устройством.
  • select(addressArray) – выбирается устройство после операции сброса, записывается его ROM код.
  • write(byte) – производится запись байта информации на устройство.
  • write(byte, 1) – аналогично write(byte), но в режиме паразитного питания.
  • read() – чтение байта информации с устройства.
  • crc8(dataArray, length) – вычисление CRC кода. dataArray – выбранный массив, length – длина кода.

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

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

  • Все
  • Тематические

    Библиотека OneWireSlave позволяет использовать ардуину на линии 1-Wire в качестве ведомого устройства. Подробнее о OneWire можно прочитать здесь . Теоретически на линии может быть до 2^48 или 281 триллионов ведомых устройств.
    С помощью этой библиотеки на одну линию совместно с датчиками температуры и прочими устройствами, использующими протокол 1-Wire, можно подключить несколько ардуин.

    — конструктор, параметром указывается пин ардуины для OneWire линии.
    — устанавливает тип и адрес устройства. Если библиотека скомпилирована с поддержкой расчета контрольной суммы crc8, то она подсчитывается и заносится в последний байт rom.
    — функция блокирует выполнение программы и ожидает обращения к текущему устройству. Функция возвращает управление программе, если ведущее устройство отправило команду MATCH ROM с адресом текущего устройства или команду SKIP ROM. Во время ожидания функция принимает участие в поисковых запросах ведущего устройства и отвечает на команду READ ROM. Таким образом обеспечивается поддержка базового протокола. Если параметр ignore_errors установлен, то функция будет игнорировать ошибки чтения/записи, иначе вернет FALSE.
    — функция ждет RESET импульса на линии, после чего возвращает управление программе. Параметр timeout_ms устанавливает время в миллисекундах, по истечение которого функция принудительно вернет управление программе. Если timeout_ms равен 0, то программа будет вечно ожидать RESET импульс, пока не дождется. Стандартное значение timeout_ms — 1000. Возвращает TRUE, если принят сигнал RESET, в случае слишком короткого или слишком длинного сигнала или по истечение времени ожидания вернет FALSE.
    — функция посылает сигнал PRESENCE согласно протоколу. Если в конце передачи сигнала на линии по какой-либо причине будет низкий уровень сигнала, функция вернет FALSE.
    — функция участвует в процедуре поиска устройств, описанной в документации протокола OneWire. Возвращает TRUE, если при поиске было найдено текущее устройство, иначе FALSE.
    — отсылает на линию указанный объем данных. Возвращает количество отосланных байт данных.
    — считывает с линии указанный объем данных и заносит их в указанный буфер. Возвращает количество успешно считанных байт данных.
    — отсылает на линию один байт данных.
    — считывает с линии один байт данных.
    — отсылает на линию один бит данных.
    — считывает с линии один бит данных.
    — функция подсчитывает контрольную сумму по алгоритму crc8 указанного объема данных.
    Если выполнение функции закончилось неудачей, то она занесет номер ошибки в эту переменную.

    Ошибки:
    ONEWIRE_NO_ERROR при выполнении функции не возникло никаких исключений.
    ONEWIRE_READ_TIMESLOT_TIMEOUT истекло время ожидания таймслота от ведомого устройства при чтении с линии. Устанавливается функциями recv*.
    ONEWIRE_WRITE_TIMESLOT_TIMEOUT истекло время ожидания таймслота от ведомого устройства при записи на линию. Устанавливается функциями send*.
    ONEWIRE_WAIT_RESET_TIMEOUT истекло время ожидания импульса RESET на линии. Устанавливается функцией waitReset.
    ONEWIRE_VERY_LONG_RESET импульс RESET принят, но оказался слишком длинным (возможно это не RESET, а что-то другое). Устанавливается функцией waitReset.
    ONEWIRE_VERY_SHORT_RESET импульс RESET оказался слишком коротким. Такая ошибка может появиться, если при ожидании RESET сигнала другое устройство начало передачу данных.
    ONEWIRE_PRESENCE_LOW_ON_LINE по окончании передачи PRESENCE сигнала на линии оказывается низкий уровень сигнала. Согласно протоколу все устройства в момент считывания сигнала с линии должны были прекратить передачу импульса PRESENCE.

    Пример скетча, эмулирующего работу ключа ibutton с микросхемой DS1990A

    В данном случае функция waitForRequest вернет FLASE с ошибкой ONEWIRE_READ_TIMESLOT_TIMEOUT, т.к. домофон (или его эмулятор) не выбирает устройство, а только считывает его адрес.

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

    Заметка: с реальным домофоном без дополнительной обвязки ардуина работать не будет, т.к. в современные домофоны устанавливаются защиты от копированных ключей. Защита срабатывает на основе некоторых электрических и возможно временных параметров.

    Обзор шины 1-WIRE для создания умного дома


    В предыдущих статьях мы рассматривали само понятие умного дома и обзор шины KNX, теперь же перейдем к самой простой платформе для создания умного дома — 1-WIRE. Платформа разрабатывалась с конца 80-х до конца 90-х годов компанией Dallas Semiconductor (с 2001 года — Maxim Integrated) и предназначалась для задач контактной идентификации объектов, в т.ч. с функциями измерения и регистрации температуры, влажности, параметров автономного электропитания, а также с функциями съема, хранения и переноса данных. Пожалуй, самым известным примером применения этой платформы является iButton — ключ-таблетка для домофона:

    В данном случае компонент 1-Wire размещается внутри небольшой «таблетки» из нержавеющей стали и подключается к системам шины 1-Wire посредством розеток с контактами, которые касаются «крышки» и «дна» таблетки. Однако в дальнейшем, благодаря умению работы с температурой, шину стали использовать при создании умного дома, в первую очередь в системах контроля микроклимата.

    Архитектура платформы 1-WIRE

    Интерфейс 1-Wire имеет всего два провода — один общий (GND, земля), второй для питания и данных; в некоторых случаях используют и отдельный провод питания. Шина двунаправленная, скорость обычно 15,4 Кбит/с, максимум 125 Кбит/с в режиме overdrive. Напряжение питания абонентов при этом формируется путем пикового детектирования напряжения на сигнальном проводе, т.е. используется «паразитное» питание (сигнал, который является скачком напряжения, и питает устройства на шине) — это оказывается возможно благодаря низкому энергопотреблению разработанной для 1-Wire элементной базы. Но, разумеется, в сети могут быть устройства с собственным источником питания, а так же для устройств, имеющих повышенное энергопотребление, питание подается по отдельной линии.

    Возможность подключения устройств в «горячем» режиме

    Протокол 1-Wire предусматривает выдачу устройством, подключаемым к магистрали в «горячем» режиме, импульса, оповещающего о появлении на магистрали нового устройства. Иными словами, в сеть можно добавлять новые устройства и они тут же смогут работать.

    Уникальный идентификатор устройства

    Каждая микросхема 1-Wire содержит уникальный 64-битный код, записываемый на этапе производства. Данный код позволяет индивидуализировать все выпускаемые устройства 1-Wire, для чего производитель гарантирует отсутствие одинаковых кодов (аналогично MAC-адресам сетевых адаптеров). При подключении к магистрали данный код считывается контроллером и используется для идентификации связанного с этим устройством объекта, а также для определения типа устройства. При подключении к магистрали нескольких устройств их коды могут использоваться в качестве их адресов, что позволяет строить технологические сети, получившие название MicroLAN.

    Топология

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

    Так как шина двунаправленная, то при наличии одного контроллера топология (принцип устройства сети) — линия, то есть все устройства нанизаны на один общий кабель. Однако при наличии нескольких взаимосвязанных контроллеров возможно сделать и и ветвящуюся древовидную структуру.

    Основные параметры интерфейса 1-Wire следующие:

    • максимальная длина магистрали при использовании витой пары — до 300 м;
    • максимальное количество абонентов на магистрали максимальной длины — до 250;
    • скорость обмена по магистрали максимальной длины — до 16,3 кбит/c.

    Принцип работы сети

    Обмен данными по магистрали включает три фазы:

    • фазу сброса, включающую импульс сброса от контроллера и ответный импульс подтверждения присутствия от абонента (абонентов);
    • фазу выборки устройства, включающую команду его выборки (по коду, без кода, групповую, поиска) и его код, если командой он предусмотрен;
    • фазу записи/чтения данных, включающую код команды и данные.

    Логика всех устройств тактируется отрицательным фронтом сигналов контроллера как в режиме записи, так и в режиме чтения. Биты кодируются длительностью положительного импульса: «1» передается длинным импульсом, а «0» — коротким. В режиме записи все импульсы данных формируются контроллером. В режиме чтения контроллер формирует последовательность единиц, а абонент накладывает на них свою маску нулей:

    Иными словами контроллер пускает в сеть последовательность единиц, подключенное к сети устройство в нужном месте меняет 1 на 0 (тем самым обеспечивая себе питание), а на контроллер приходит последовательность нулей и единиц — ответ от слэйва.

    Программное обеспечение

    Фирма Maxim Integrated (создатель шины 1-WIRE) предоставляет для программирования систем на базе 1-Wire библиотеки API и SDK для широкого ряда платформ — персональных компьютеров с ОС Windows/Linux/MacOS, мобильных устройств, микроконтроллеров, .NET и JAVA. Так же предлагается программный cканер сети OneWire Viewer, позволяющий находить и идентифицировать подключенные к сети устройства и отображать полный перечень их параметров и данных.

    Из сторонних разработок наибольший интерес представляют следующие:

    • OWFS — One Wire File System. Свободно распространяется по лицензии GPLv2. Предназначен для UNIX-платформ, но при использовании UNIX-эмулятора cygWin может работать и в среде Windows. Имеет веб-интерфейс, что делает возможным удаленный доступ, например, через Интернет. OWFS является самой популярной программной средой для домашней автоматизации на базе платформы 1-Wire.
    • Бенукс — программная среда для различных задач автоматизации. Является коммерческим продуктом. Позволяет взаимодействовать с системой автоматизации по различным каналам, в т.ч. с помощью веб-интерфейса и SMS. Предоставляет возможности автоматизированного управления по сценариям.
    • jHomeNet — свободно распространяемый программный комплекс для сервера 1-Wire на Java.

    Форум сайта mypractic.ru

    Обсуждение и вопросы по темам сайта.

    • Темы без ответов
    • Активные темы
    • Поиск
    • Наша команда

    Время выполнения функций библиотеки OneWire (для управления термодатчиками DS18B20).

    Время выполнения функций библиотеки OneWire (для управления термодатчиками DS18B20).

    Сообщение Эдуард » 11 дек 2016, 18:59

    Функции библиотеки Ардуино для работы с интерфейсом 1-Wire достаточно сложные и явно требуют для выполнения значительного времени. К тому же функции работают с последовательным интерфейсом, а значит, в цикле повторяются многочисленные операции с передачей и приемом битов, что вносит еще больше неопределенности по поводу времени выполнения.

    Если программа Ардуино строится по традиционному принципу – последовательное выполнение программных блоков, то время выполнений операций с шиной 1-Wire не имеет большого значения. Одна, две, десять миллисекунд. Какая разница, если все происходит в цикле, например, 1 сек.

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

    При разработке Ардуино контроллера элемента Пельтье я вынужден был реализовывать параллельное выполнение нескольких задач с разными временными циклами.
    Остро встали вопросы:

      Сколько времени выделять на управление датчиками температуры DS18B20?
      Как организовывать обмен данными по 1-Wire шине?

    Пришлось определить время выполнения функций класса OneWire. Я сделал это двумя способами:

      Посчитал теоретически, исходя из временных требований к операциям на шине 1-Wire.
      Измерил специальной программой. Я писал о ней в этой теме.

    Для измерения времени выполнения функций библиотеки OneWire я подкорректировал программу, добавил библиотеку и объявление класса OneWire.

    // определение времени выполнения функций OneWire

    OneWire sensD (16); // датчик подключен к выводу 16 (A2)
    unsigned int timerValue; // значение таймера
    byte bufData[9]; // буфер данных

    void setup() <
    Serial.begin(9600); // инициализируем порт
    // установки таймера 1
    TCCR1A = 0;
    TCCR1B = 0;
    >

    void loop() <
    noInterrupts(); // запрет прерываний
    TCNT1H = 0; // сброс таймера
    TCNT1L = 0;
    TCCR1B = 1; // разрешение работы таймера

    // ———- исследуемый программный блок ———

    // sensD.reset(); // сброс шины
    // sensD.write(0xCC, 1); // пропуск ROM
    // sensD.write(0x44, 1); // инициализация измерения

    // sensD.reset(); // сброс шины
    // sensD.write(0xCC, 1); // пропуск ROM
    // sensD.write(0xBE, 1); // команда чтения памяти датчика
    // sensD.read_bytes(bufData, 9); // чтение памяти датчика, 9 байтов
    // bufData[0]= sensDs.read(); // чтение памяти датчика, 9 байтов

    // if ( OneWire::crc8(bufData, 8) == bufData[8] ) < bufData[8]=0; >// проверка CRC
    // else bufData[8]=1;

    TCCR1B = 0; // остановка таймера
    timerValue = (unsigned int)TCNT1L | ((unsigned int)TCNT1H

    По очереди открывал от комментариев функции и получал время выполнения. Результаты я свел в таблицу.

    Функция Назначение Расчетное время Измеренное время
    reset() Инициализация обмена 960 мкс 966 мкс
    write() Запись байта 480 — 960 мкс 548 мкс
    read() Чтение байта 480 — 960 мкс 522 мкс
    read_bytes() Чтение блока байтов (9байтов) 4320 — 8640 мкс 4700 мкс
    crc8 Вычисление контрольной суммы 7,3 мкс

    Получается, что последовательность самой простой инициализации измерения датчика DS18B20 требует 2063 мкс.

    sensD.reset(); // сброс
    sensD.write(0xCC, 1); // пропуск ROM
    sensD.write(0x44, 1); // инициализация измерения

    А на чтение температуры из датчика DS18B20 и проверку контрольной суммы требуется 6,8 мс.

    sensD.reset(); // сброс
    sensD.write(0xCC, POWER_MODE); // пропуск ROM
    sensD.write(0xBE, POWER_MODE); // команда чтения памяти датчика
    sensD.read_bytes(bufData, 9); // чтение памяти датчика, 9 байтов
    if ( OneWire::crc8(bufData, 8) == bufData[8] ) < // проверка CRC

    Re: Время выполнения функций библиотеки OneWire (для управления термодатчиками DS18B20).

    Сообщение dok » 11 дек 2017, 22:30

    Приветствую, Эдуард. Большое спасибо за уроки. Классно ! У меня вопрос по датчикам DS18B20. Наваял я по Вашим урокам «нечто» с тремя датчиками. По дилетантски. Хочу родителям в деревню в баню термометр сделать. Парилка, моечная и предбанник по очереди. Хотелось, чтобы перед выводом температуры в парной , сначала выводилось слово «ПАР», например. Но к сожалению, чужеродный код не вставляется , а если компилируется, то не работает. Второй вариант: зажигать 3 отдельных светодиода напротив надписей «Парилка», «Моечная» , «Предбанник» Как пишут у Вас на форумах: Всю голову сломал. Помогите, пожалуйста.

    // термометр, 3 датчикa DS18B20
    #include
    #include
    #include

    #define POWER_MODE 0 // режим питания, 0 — внешнее, 1 — паразитное

    // тип индикатора 1; выводы разрядов 5,4,3,2; выводы сегментов 6,7,8,9,10,11,12,13
    Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

    OneWire sensDs (14); // датчик подключен к выводу 14
    OneWire sensDs2 (15); // датчик подключен к выводу 15
    OneWire sensDs3 (16); // датчик подключен к выводу 16

    byte bufData[9]; // буфер данных
    byte bufData2[9]; // буфер данных 2
    byte bufData3[9]; // буфер данных 3
    float temperature; // измеренная температура
    float temperature2; // измеренная температура 2
    float temperature3; // измеренная температура 3

    void setup() <
    MsTimer2::set(2, timerInterrupt); // задаем период прерывания по таймеру 2 мс
    MsTimer2::start(); // разрешаем прерывание по таймеру
    Serial.begin(9600); // инициализируем порт, скорость 9600
    >

    void loop() <
    sensDs.reset(); // сброс шины
    sensDs.write(0xCC, POWER_MODE); // пропуск ROM
    sensDs.write(0x44, POWER_MODE); // инициализация измерения
    delay(900); // пауза 0,9 сек
    sensDs.reset(); // сброс шины
    sensDs.write(0xCC, POWER_MODE); // пропуск ROM
    sensDs.write(0xBE, POWER_MODE); // команда чтения памяти датчика
    sensDs.read_bytes(bufData, 9); // чтение памяти датчика, 9 байтов

    if ( OneWire::crc8(bufData, 8) == bufData[8] ) < // проверка CRC
    // данные правильные
    temperature= (float)((int)bufData[0] | (((int)bufData[1]) = 0)<

    Использование onewire. встроенная библиотека

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

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

    Эта книга задумана как продолжение бестселлера «Programming Arduino: Getting Started with Sketches». Несмотря на то что эта книга включает краткое повторение основ из книги «Programming Arduino», она познакомит читателя с более продвинутыми аспектами программирования плат Arduino.

    Книга: Программируем Arduino. Профессиональная работа со скетчами.

    8. Взаимодействие с устройствами 1-Wire

    8. Взаимодействие с устройствами 1-Wire

    Шина 1-Wire служит целям, похожим на цели шины I2C (глава 7), то есть она обеспечивает возможность взаимодействий микроконтроллеров с периферийными устройствами посредством минимального количества линий передачи данных. Стандарт 1-Wire, разработанный в компании Dallas Semiconductor, свел потребность в линиях до логического минимума — всего одной. Шина имеет более низкое быстродействие, чем I2C, но обладает интересной особенностью — паразитным питанием (parasitic power), позволяющее подключать периферийные устройства к микроконтроллеру всего двумя проводами: GND (ground — земля) и комбинированным проводом питания и передачи данных.

    Шина 1-Wire поддерживается более узким диапазоном устройств, чем I2C. Большинство из них производят компании Dallas Semiconductor и Maxim. К их числу относятся устройства идентификации картриджей для принтеров, флеш-память и ЭСППЗУ, а также АЦП. Однако наибольшую популярность среди устройств 1-Wire у радиолюбителей завоевал температурный датчик DS18B20 компании Dallas Semiconductor.

    Аппаратная часть 1-Wire

    На рис. 8.1 показано, как подключить датчик DS18B20 к плате Arduino, используя всего два контакта и режим паразитного питания DS18B20.

    Рис. 8.1. Подключение устройства 1-Wire к плате Arduino

    1-Wire — это именно шина, а не соединение «точка–точка». К ней можно подключить до 255 устройств, взяв за основу схему, изображенную на рис. 8.1. Если вы пожелаете использовать устройство в режиме нормального питания, то сопротивление 4,7 кОм можно убрать, а вывод Vdd датчика DS18B20 вместо GND соединить непосредственно с контактом 5 В на плате Arduino.

    Протокол 1-Wire

    Так же как I2C, интерфейс 1-Wire использует понятия ведущего и ведомого устройств. Микроконтроллер играет роль ведущего, а периферийные устройства — ведомых. Каждое ведомое устройство еще на заводе получает уникальный идентификационный номер, который часто называют адресом, чтобы его можно было идентифицировать на шине, к которой подключено множество ведомых. Адрес имеет размер 64 бита, что позволяет иметь примерно 1,8 ? 1019 разных идентификационных номеров.

    Подобно I2C, протокол 1-Wire предусматривает переключение режима работы шины ведущим устройством на ввод и вывод, чтобы иметь возможность двусторонних взаимодействий. Однако в шине 1-Wire отсутствует отдельная линия передачи тактовых сигналов, поэтому нули и единицы передаются длинными и короткими импульсами. Импульс длительностью 60 мкс обозначает 0, а длительностью 15 мкс — 1.

    Обычно линия данных находится под напряжением с уровнем HIGH, но, когда микроконтроллеру (ведущему) требуется послать команду устройству, он генерирует специальный импульс сброса с уровнем LOW длительностью не менее 480 мкс. Вслед за ним следует последовательность импульсов 1 и 0.

    Библиотека OneWire

    Работу с интерфейсом 1-Wire здорово упрощает библиотека OneWire, которая доступна по адресу http://playground.arduino.cc/Learning/OneWire.

    Инициализация 1-Wire

    Чтобы инициализировать Arduino как ведущее устройство на шине 1-Wire, сначала нужно подключить библиотеку OneWire:

    Затем создать экземпляр OneWire и указать, какой контакт Arduino будет использоваться как линия данных на шине 1-Wire. Эти два действия можно объединить в одну команду, а в роли линии данных использовать любой контакт на плате Arduino — достаточно просто передать номер контакта в виде параметра:

    В данном случае роль линии данных шины будет играть контакт D10.

    Сканирование шины

    Поскольку каждое ведомое устройство, подключенное к шине, имеет уникальный идентификационный номер, присвоенный на заводе, нужен какой-то способ определить адреса устройств, подключенных к шине. Было бы неблагоразумно «зашивать» адреса устройств в скетч, потому что в случае замены новое ведомое устройство будет иметь уже другой адрес и скетч не сможет обращаться к нему. Поэтому ведущее устройство (Arduino) должно создать своеобразную опись устройств на шине. Здесь следует отметить, что первые 8 бит в адресе определяют «семейство», которому принадлежит устройство, то есть по ним можно определить, является ли устройство, например, датчиком DS18B20 или относится к какому-то другому типу.

    В табл. 8.1 перечислены некоторые из наиболее известных кодов семейств для шины 1-Wire. Полный список можно найти на странице http://owfs.sourceforge.net/family.html.

    Таблица 8.1. Коды семейств устройств для шины 1-Wire

    Код семейства (шестнадцатеричный) Семейство Описание
    06 iButton 1993 Идентификационный ключ
    10 DS18S20 Высокоточный температурный датчик с разрешающей способностью 9 бит
    28 DS18B20 Высокоточный температурный датчик с разрешающей способностью 12 бит
    1C DS28E04-100 ЭСППЗУ емкостью 4 Кбайт

    В библиотеке OneWire имеется функция search, которую можно использовать для поиска всех ведомых устройств на шине. Следующий пример выводит адреса всех устройств на шине в монитор последовательного порта:

    byte address[8]; // 64 бита

    На рис. 8.2 показан результат выполнения этого скетча при наличии двух температурных датчиков DS18B20, подключенных к Arduino. Обратите внимание на то, что оба устройства имеют один и тот же код семейства в первом байте, равный 28 (в шестнадцатеричном формате).

    Рис. 8.2. Список ведомых устройств 1-Wire

    Для работы функции search требуется массив размером 8 байт, куда она могла бы поместить следующий найденный адрес. После последнего обнаруженного устройства она возвращает 0. Это позволяет выполнять итерации в цикле while, как в предыдущем примере, пока не будут определены все адреса. Последний байт адреса в действительности является циклической контрольной суммой (Cyclic Redundancy Check, CRC), позволяющей проверить целостность адреса. Библиотека OneWire включает специальную функцию для проверки контрольной суммы CRC.

    Использование DS18B20

    Следующий пример иллюстрирует использование библиотеки OneWire с температурным датчиком DS18B20. На рис. 8.3 изображена схема подключения DS18B20 к плате Arduino. Обратите внимание на то, что у самого датчика всего три контакта и он имеет вид обычного транзистора.

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