1-wire-интерфейс

Polling cycle↑

The polling cycle can be set for each sensor. For most applications a value of 60 seconds is recommended. Depending on the number of sensors, however, it is not possible to set a short polling cycle for each sensor.

For applications with slow temperature changes (e.g. room temperature), the scanning cycle can also be set to e.g. 300 seconds. For applications such as the control of a flow temperature, a polling cycle of 5 seconds may be necessary.

In general, therefore, the polling cycle of a sensor should only be set as short as necessary. Shorter polling cycles can be achieved with fewer sensors.

WIRING

A characteristic of one wire sensors is how simple they are to use. However, please do pay attention to the following wiring instructions to ensure you get the optimum signal transfer for your sensor.

  • When installing the sensor, use a cable with a cross-section of at least 0.6mm (we recommend using CAT7 Cable).
  • We recommend a maximum of 20 sensors on one 1-Wire extension regardless of wiring topology.
  • The following wiring instructions should be treated as a guide only. Depending on the environmental factors, including cable length and the number of sensors these instructions can vary.

We recommend you use data cable (Cat5e, Cat6 or Cat7), and you need to use one twisted pair for GND and data.
For longer distances or when running alongside mains cables use STP (shielded twisted pair) cable. DQ and GND should be connected using a twisted pair so the data signal is twisted against GND.

Где применяется протокол I2C

Протокол I2C используется для передачи информации только на короткие расстояния. Он обеспечивает достаточно надежную передачу данных из-за наличия в нем сигнала синхронизации. Обычно данный протокол используется для передачи информации от датчиков или других устройств ведущим устройствам. В данном случае несомненным удобством использования протокола I2C является то, что при обмене данными с ведомыми устройствами ведущий микроконтроллер использует минимум линий (контактов). Если вам нужна связь на более далекие расстояния, то вам необходимо присмотреться к протоколу RS232, если же вам нужна более надежная связь чем в протоколе I2C, то вам лучше использовать протокол SPI.

Supported sensors↑

The 1-Wire Sealed Sensor can be used universally for heating/ventilation/air conditioning.It is typically used with an immersion sleeves or attached directly to a pipe.

The 1-Wire Temperature Sensor Set contains compact sensors, which can be placed e.g. in a wall box behind a switch or in another housing. Concealed mounting results in a delay in the detection of the temperature, which is usually tolerable in applications such as the control of room temperature.It is important to seal the conduits to the wall box in order to prevent incorrect measurements due to draft air.

Sensor type (Family Code) Description
DS1822 (22) Temperature sensor
DS18B20 (28) Temperature sensor
DS18S20 (10) Temperature sensor
DS1963S (18) iButton
DS1990 (01) iButton
DS2438 (26) Smart Battery Monitor

All 1-wire Extensions since production date 2015 are periodically resetting the supply of the 1-wire bus to prevent measured values from freezing. These short interruptions in the power supply can cause issues with combined sensors containing microcontrollers. Such sensors should be supplied with 5V from a separate power supply unit.

Практическая часть

Модуль, содержащий процедуру поиска можно скачать по этой ссылке:

Архив содержит следующие модули:

1-Wire.asm — Замечательный модуль программной реализации 1-Wire. Автор — Radoslaw Kwiecien, http://avr-mcu.dxp.pl

wait.asm — модуль временных задержек. Необходим в модуле 1-Wire.asm. Автор тот же.

1-Wire Search.asm — модуль, содержащий непосредственно процедуру поиска устройств на шине 1-Wire на AVR-ассемблере. Автор — ваш покорный слуга.

Зачем столько? Во-первых не могу не поделиться очень удобными модулями реализации протокола 1-Wire от Radoslaw Kwiecien. Я их перевел, там все понятно. Если кто-то не желает их использовать — милости прошу. Но тогда прочитайте внимательно вступление в модуле 1-Wire Search.asm — там написано, какие внешние подпрограммы используются и обмен между ними.

Если же вы решите воспользоваться моими библиотеками целиком — то достаточно подключить к вашему проекту только модуль 1-Wire.asm. Остальные  подключаются внутри него.

Ну, и напоследок — пример использования поиска:

; ...

#define F_CPU (4000000) ; Определяем константу с тактовой частотой кристалла - она необходима в модуле 1-Wire.asm

; ...

.include "1-wire.asm" ; Подключаем модули 1-Wire

; ...

rcall OWClearROM_NO ; Обнуляем буфер кода ПЗУ
rcall OWFirst ; Ищем первое устройство на шине

sbrs search_flags, search_result ; Если ошибка - то поиск прерываем
rjmp  EndOfExample

loop1:
; ... Здесь делаем с найденным кодом ПЗУ все что нам угодно ...

rcall OWNext ; ищем следующее устройство на шине. БУФЕР ОЧИЩАТЬ НЕЛЬЗЯ!
sbrs search_flags, search_result ; Если ошибка - то поиск прерываем
rjmp EndOfExample

rjmp loop1 ; и так до тех пор, пока все коды ПЗУ не вычислим.

EndOfExample:

; ... идем дальше ...

Вот и весь пример. Засим  — прощаюсь. Будут вопросы — милости просим. Отвечу.

Поделиться с друзьями:

Протокол I2C в Arduino

На следующем рисунке показаны контакты платы Arduino UNO, которые используются для связи по протоколу I2C.

Линия протокола I2C Контакт платы Arduino UNO
SDA A4
SCL A5

Для осуществления связи по протоколу I2C в плате Arduino используется библиотека <Wire.h>. В ней содержатся следующие функции для связи по протоколу I2C.

1. Wire.begin(address).

Эта команда производит инициализацию библиотеки Wire и осуществляет подключение к шине I2C в качестве ведущего (master) или ведомого (slave). 7-битный адрес ведомого в данной команде является опциональным и если он не указан , то устройство (плата Arduino) подключается к шине I2C в качестве ведущего (master).

2. Wire.read().

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

3. Wire.write().

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

От ведомого ведущему (Slave to Master): ведомый записывает (передает) данные ведущему когда в ведущем работает функция Wire.RequestFrom().

От ведущему ведомому (Master to Slave): в этом случае функция Wire.write() должна использоваться между вызовами функций Wire.beginTransmission() и Wire.endTransmission().

Функцию Wire.write() можно использовать в следующих вариантах:

  • Wire.write(value); value — значение передаваемого одиночного байта;
  • Wire.write(string) – для передачи последовательности байт;
  • Wire.write(data, length); data – массив данных для передачи в виде байт, length – число байт для передачи.

4. Wire.beginTransmission(address).

Эта функция используется для начали передачи по протоколу I2C устройству с заданным адресом ведомого (slave address). После этого вызывается функция Wire.write() с заданной последовательностью байт для передачи, а после нее функция endTransmission() для завершения процесса передачи.

5. Wire.endTransmission().

Эта функция используется для завершения процесса передачи ведомому устройству, который до этого был инициирован функциями beginTransmission() и Wire.write().

6. Wire.onRequest().

Эта функция вызывается когда ведущий запрашивает данные с помощью функции Wire.requestFrom() от ведомого устройства. В этом случае мы можем использовать функцию Wire.write() для передачи данных ведущему.

7. Wire.onReceive().

Эта функция вызывается когда ведомое устройство получает данные от ведущего. В этом случае мы можем использовать функцию Wire.read() для считывания данных передаваемых ведущим.

8. Wire.requestFrom(address,quantity).

Эта функция используется в ведущем устройстве чтобы запросить байты (данные) с ведомого устройства. После этого используется функция Wire.read() чтобы принять данные переданные ведомым устройством.
address: 7-битный адрес устройства, с которого запрашиваются байты (данные).
quantity: число запрашиваемых байт.

1-Wire. Работа с DS18B20. Часть 1

     Все (и в том числе я) называют DS18B20 цифровым датчиком температуры. Однако это не просто датчик, это программируемый цифровой термометр.

Он измеряет температуру в диапазоне от –55 до +125 градусов Цельсия, имеет программируемое температурное разрешение от 9 до 12 бит и позволяет задавать верхний и нижний температурные пороги, в случае превышения которых,  устанавливается флаг аварии.

   Каждый термометр DS18B20 имеет уникальный 64 битный серийный номер, который используется для его адресации на 1-Wire шине. Это позволяет объединять на одной шине несколько независимо работающих термометров и осуществлять между ними и микроконтроллером обмен данными по 1-Wire протоколу. 

   Также особенностью данного термометра является то, что его можно запитывать не только от источника питания, но и от сигнального провода. Это так называемый режим паразитного питания. В этом режиме для подключения DS18B20 требуется всего два провода — сигнальный и возвратный (земляной, GND).

      Схема подключения нескольких датчиков DS18B20 с внешним питанием.    1-Wire шина  должна быть обязательно подтянута к плюсу питания через резистор номиналом 4,7 Ком. Напряжение источника питания от 3 до 5 Вольт. 

   Схема подключения датчика DS18B20 в режиме паразитного питания. 

   Вывод Vdd соединяется с GND, а 1-Wire шина дополнительно подключается к источнику питания через полевой транзистор. 

   Когда датчик DS18B20 выполняет преобразование температуры или копирует данные из ОЗУ в EEPROM память, он потребляет ток до 1,5 мА. Этот ток может вызывать недопустимое снижение напряжения на 1-Wire шине. Чтобы этого не происходило, 1-Wire шину на время выполнения этих операций подключают к источнику питания. Для этого и нужен полевой транзистор.   

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

Это низкоскоростной двунаправленный полудуплексный последовательный протокол обмена данными использующий всего один сигнальный провод.

   Имеется несколько типов сигналов, определенных 1-Wire протоколом – импульс сброса, импульс присутствия, запись 0, запись 1, чтение 0 и чтение 1. Все эти сигналы, за исключением импульса присутствия, формируются на шине главным устройством — MASTERом . В нашем случае это  микроконтроллер AVR. 

  Принцип формирования сигналов во всех случаях одинаковый. В начальном состоянии 1-Wire шина с помощью резистора подтянута к плюсу питания. Главное устройство «проваливает» на определенное время 1-Wire шину в ноль, затем «отпускает» ее и, если нужно, «слушает» ответ подчиненного (SLAVE) устройства. В нашем случае подчиненное устройство – термометр DS18B20. 

  Физически это реализуется так. 

  Операция записи бита: Вывод микроконтроллера устанавливается в режим выхода и на нем устанавливается логический ноль. Выдерживается пауза, длительность которой зависит от значения передаваемого бита (0 или 1), затем вывод переводится в режим входа в состоянии Hi-z и снова выдерживается пауза. 

   Все сеансы связи микроконтроллера с датчиком DS18B20 начинаются с сигнала сброса.  Микроконтроллер на 480 мкс «проваливает» 1-Wire шину в ноль, а затем «отпускает» ее. Если к шине подключен термометр DS18B20, то он  обнаруживает положительный перепад и после паузы в 15-60 мкс отвечает микроконтроллеру импульсом присутствия — «проваливает» шину в ноль на время от 60 до 240 мкс. 

   Обмен данными по 1-Wire шине происходит последовательно, младшим битом вперед. Передача или прием одного бита данных выполняются в течении фиксированного промежутка времени, так называемого тайм слота (time slot). Различают тайм слоты записи и тайм слоты чтения. Длительность всех тайм слотов должна быть > 60 мкс, а пауза между тайм слотами  > 1 мкс.   

   Для передачи нуля микроконтроллер «проваливает» 1-Wire шину на время от 60 до 120 мкс. Затем «отпускает» ее и перед записью следующего бита выдерживает паузу >1  мкс.

   DS18B20 является подчиненным устройством и может передавать данные, только когда микроконтроллер формирует на 1-Wire шине тайм слоты чтения.

Для формирования тайм слота чтения микроконтроллер «проваливает» 1-Wire шину на время от 1 до 15 мкс, а затем «отпускает» ее, передавая  управление состоянием 1-Wire шины датчику DS18B20.

Если DS18B20 передает ноль, он удерживает шину в «проваленном» состоянии (в состоянии логического нуля) до конца тайм слота. Если он передает 1, он оставляет шину в «подтянутом» состоянии. 

   Микроконтроллер может считывать данные датчика DS18B20 через 15 мкс после начала тайм слота чтения. 

Протокол 1-Wire

Протокол 1-Wire – это протокол, используемый для управления устройствами, которые производятся компанией Dallas Semiconductor (ныне Maxim). Хотя 1-Wire является приприетарным протоколом и торговой маркой Dallas, программисты, использующие драйверы 1-Wire, не обязаны делать за это никаких выплат.

Сеть 1-Wire, которую Dallas называет MicroLan (торговая марка), состоит из одного ведущего устройства, к которому при помощи единственной линии передачи данных подключено одно или несколько ведомых устройств. Эту линию, помимо прочего, можно использовать для электропитания ведомых устройств (ситуацию, когда устройства подпитываются через шину 1-Wire, называют «паразитным питанием»).

Среди прочих устройств, работающих через протокол 1-Wire, особенно популярны температурные датчики – они недороги, просты в использовании и позволяют напрямую считывать откалиброванные цифровые температурные данные. Кроме того, они терпимы к длинным проводам, которыми часто приходится пользоваться при создании цепи с Arduino. Один из примеров ниже демонстрирует, как работать с 1-Wire на примере цифрового термометра DS18S20. Многие чипы 1-Wire могут работать и через паразитное, и через нормальное питание.

iButton Toegangscontrole↑

Door middel van iButtons kan een toegangsoplossing worden gerealiseerd. Hiervoor wordt een iButton sleutellezer op de 1-wire Extension aangesloten. Voor elk toegangspunt (ingang, deur, poort) is een 1-wire Extension en een sleutellezer nodig. De iButtons zelf zijn 1-wire sensoren met een uniek serienummer. Een willekeurig aantal van deze iButtons kan worden aangeleerd en toegewezen aan verschillende gebruikers. De iButton dient dus als sleutel.

De iButton sleutellezer wordt aangesloten op de 1-wire Extension met GND en DQ, maar bevat ook een rode en groene LED, die apart aan te sturen zijn. Als u de sleutellezer van Loxone heeft aangeschaft, heeft deze sinds 2015 ingebouwde serieweerstanden, zodat de LED’s direct met 24VDC kunnen worden aangestuurd. Sluit de sleutellezer aan volgens het volgende schema:

Voor het aanlezen van iButtons in Loxone Config klikt u eerst op de 1-wire Extension en activeert u vervolgens de 1-wire monitor.

Houd vervolgens de gewenste iButton enkele malen kort op de sleutellezer, zodat deze wordt weergegeven in de 1-wire monitor aan de onderkant van het Loxone Config-venster:

Markeer nu de gewenste iButton, selecteer een gebruiker in het keuzeveld aan de rechterkant en klik op Gebruiker toewijzen. Als alternatief kan ook een digitale ingang worden gemaakt met Apparaat aanmaken.

Voor het overnemen slaat u het programma achteraf op in de Miniserver.

Zendcyclus↑

De zendcyclus kan voor elke sensor worden ingesteld. Voor de meeste toepassingen is de waarde van 60 seconden voldoende. Afhankelijk van het aantal sensoren kan echter niet voor elke sensor een willekeurig korte zendcyclus worden bereikt.

Voor toepassingen met een traag temperatuurgedrag (bv. kamertemperatuur) kan de zendcyclus ook worden ingesteld op bv. 300 seconden. Omgekeerd kan een zendcyclus van 5 seconden nodig zijn voor toepassingen zoals het regelen van een aanvoertemperatuur.

Stel daarom de zendcyclus van een sensor in het algemeen slechts zo kort als nodig is. Kortere zendcycli kunnen worden bereikt met minder sensoren.

Считывание данных с устройства типа 1-Wire

Чтобы прочесть данные с устройства типа 1-Wire, нужно выполнить несколько шагов. Каких именно шагов – зависит от самого устройства, т.к. разные устройства могут отсылать разные значения. Популярный DS18B20, к примеру, считывает данные о температуре, а DS2438 – о напряжении, силе тока и температуре.

Два основных этапа при считывании данных

Конверсия

Эта команда шлется устройство, чтобы оно начало выполнять операцию конверсии. В случае DS18B20 этой командой будет байт 0x44 (команда «Convert T»). В библиотеке OneWire за это отвечает функция ds.write(0x44), где ds – это экземпляр класса OneWire. После получения этой команды устройство начинает считывать данные с внутреннего АЦП, а затем копирует их в регистры оперативной (scratchpad) памяти.

Чтение оперативной (scratchpad) памяти

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

Синхронные и асинхронные запись/считывание

Большинство программ и скетчей для девайсов типа 1-Wire (в особенности те, что написаны для Arduino) используют простой алгоритм «конверсия, ожидание, считывание» – даже при использовании нескольких устройств. Это может стать причиной ряда проблем:

Синхронизация с другими функциями

Если в скетче жестко прописано время ожидания, то ведущее устройство во время конверсии должно просто остановиться и ждать (за исключением случаев, когда используется многопоточность). Это влечет серьезную проблему и в том случае, если в скетче есть другие процессы, привязанные к времени, и в том случае, если их нет – многим программам нужно ждать ввода данных, обработки данных и выполнения многих других операций, которые не терпят задержек, необходимых для конверсии температурных данных. Как упоминалось выше, 12-битная конверсия в DS18B20 требует задержки в 750 миллисекунд. Поэтому в использовании ожидания, пока датчик выполнит процесс конверсии, никакого смысла нет. Гораздо разумнее будет послать команду конверсии, а за ее результатом вернуться позже, когда конверсия уже будет завершена – прочитав этот результат при помощи команды «Read Scratchpad».

Подгонка времени ожидания ко времени конверсии

Самый эффективный и быстрый способ считывания информации с девайса типа 1-Wire – это учитывать еще и время конверсии, что можно делать при помощи функции ds.read(). К примеру, в одном из скетчей ниже указана в задержка в 1000 миллисекунд, тогда как в даташите максимальным временем конверсии указано 750 миллисекунд, а фактически это происходит за 625 миллисекунд или меньше. Но важнее то, что это значение должно соответствовать разрешению, с которым происходит конверсия. Конверсия с разрешением 9 бит, например, занимает до 94 миллисекунд, поэтому ожидание в течение 1000 миллисекунд просто не имеет смысла.

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

Aanleren van 1-wire sensoren↑

Om sensoren in Loxone Config aan te leren, klikt u eerst op de 1-wire Extension en vervolgens op 1-wire zoeken.

In de 1-wire zoekresultaten onderaan het Loxone Config-venster staan alle aangesloten 1-wire sensoren vermeld:

Markeer nu een sensor, voer een naam in en klik vervolgens op Apparaat creëren.

Om sensoren te identificeren zijn er verschillende mogelijkheden. De 1-wire temperatuursensor outdoor die bij Loxone verkrijgbaar is, heeft een label met een bedrukt serienummer, waardoor deze tijdens het aanleren kan worden toegewezen. Of u kunt slechts één sensor per keer aansluiten en altijd de nieuw toegevoegde sensor aanleren. Een andere optie is om eerst alle sensoren aan te leren en de opvraagcyclus van de sensoren tijdelijk op één seconde in te stellen. Daarna kan de sensor worden toegewezen door hem aan te raken op basis van de temperatuursverandering.

Voor het overnemen slaat u het programma achteraf op in de Miniserver.

Daarna zijn de toegevoegde sensoren klaar voor gebruik en beschikbaar in Loxone Config.

3 Signal character

When going through the whole communication process from the master side, the write process acquire the master to do the following thing:

3.1 Write a bit

To write a bit, it’s required to:

  1. transmit a low voltage for at least 1us,

  2. transmit the corresponding signal.

The whole transmit time slot should takes longer than 60us, The following image is a good illustration of the whole process.

In the left half, the master is sending a zero bit, it should send a low level for more than 1 us, then keep the level at low for at least another (60-1) us. After writing zero bit, the master should release the data line, otherwise if the data line keep at low level for more than 480us, then the device would start another initializing process.

In the right part, the process is almost the same to send a one bit, but actually the device don’t have to release the data lane, since the data line is kept at high when the line is leased.

The gray square in the image give a typical operating time, in the first 15us, the master should keep the data line at low level for at least 1us, and then keep it to the corresponding level for at least 15+30 us (which is the sampling time slot for ds18b20 device). After sampling, the master need to release data line.

3.2 Read a bit

The following image demonstrate how to read from the slave device, which is quite similar to the process above.

Before the master decide to read a bit from the slave device, it should:

  1. send a low level signal for at least 1us,

  2. release the data line for some time and sample the signal level on the bus.

The whole reading process of reading a bit should takes longer than 60us, after that the slave device would release the data line and make preparation for next bit.

Интерфейс 1-Wire

В этой статье я попытаюсь рассказать о потрясающей вещи – интерфейсе 1-Wire. Что в нем потрясающего? В нем данные передаются всего по одному проводу! Только вдумайтесь, куча датчиков может быть подключена к однопроводной шине.

Интерфейс One-Wire (встречается и такая нотация) был разработан компанией Dallas Semiconductor и применен в виде огромного количества устройств изготовленной данной компанией. Думаю практически все знают температурные датчики c 1-Wire интерфейсом – DS18B20.

Каждое устройство 1-Wire имеет собственный уникальный идентификатор, что обуславливает применение данных устройств в качестве устройств идентификации личности, маркировки оборудования и пр.

Как же передаются данные по однопроводной шине в обе стороны?

Данный вопрос очень удобно (и практично) рассмотреть на примере работы с датчиком температуры DS18B20.Вот так выглядит схема его подключения:

Есть еще вариант с питанием датчика от линии данных, в таком случае вы получаете рабочий датчик температуры подключенный всего при помощи двух проводов!

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

Как видно из временной диаграммы (я позаимствовал её из даташита на датчик), мастер (т.е. контроллер устанавливает на шине нулевой потенциал на временя не менее 480 мкс, после чего устанавливает её в единичный потенциал.

После чего необходимо подождать 15-60мкс, чтобы датчик получил передний фронт и отправил импульс присутствия (presence pulse) длиной 60-240мкс.

Если данный импульс не получен, значит на шине нет датчиков готовых к обмену данными.

Теперь рассмотрим процедуру отправки и приема бита.

Операция чтения бита очень похожа на операцию записи. Мы также должны установить шину в низкий потенциал, по крайней мере на 1мкс.

После чего переводим ножку микроконтроллера в режим приема данных и ожидаем 14мкс. После этого можно считать состояние линии. Она будет в высоком состоянии если передается “1” и в никзом, если “0”.

Наконец мы должны подождать ещё 45мкс до окончания периода в 60мкс.

Операция отправки/приема байта производиться в цикле, путем отправки/приема бита и сдвигов операнда.

Также существует режим работы с шиной 1-Wire при помощи USART:

Такой режим намного удобнее для stm32 контроллеров. Там проблем с нехваткой USART’ов нет, да ножек хоть отбавляй.