1-провод — 1-wire

Troubleshooting↑

If sensors are not or only partially found, or provide invalid values, it is often due to incorrect wiring.It is helpful to know the wiring of the installation well.Using e.g. the Device Status, check whether only sensors in a certain room, or sensors beyond a certain point in the wiring are affected.The voltage on the 1-wire bus can be measured at the various terminal connections. Between VDD and GND the voltage is always 5VDC. DQ carries a clocked signal, usually the measurements between DQ and GND fluctuate between 1-5VDC, depending on data traffic. These voltages must be present at each sensor.This will help localize and identify possible causes such as faulty connections or reversed data lines.

On an iButton reader, the central contact area is connected to DQ and the outer ring is connected to GND. The voltage can also be measured here.

Пример использования

Устройства 1-Wire доступны в различных корпусах: интегральные схемы , транзистор в стиле TO-92 и портативная форма, называемая iButton или Dallas key, которая представляет собой небольшой корпус из нержавеющей стали, напоминающий батарейку для часов . Производители также производят устройства более сложные, чем отдельный компонент, которые используют шину 1-Wire для связи.

Устройства 1-Wire могут размещаться в разных местах системы. Это может быть один из многих компонентов на печатной плате продукта. Это также может быть отдельный компонент в устройстве, таком как датчик температуры. Он может быть подключен к контролируемому устройству. Некоторые лабораторные системы подключаются к устройствам 1-Wire с помощью кабелей с модульными разъемами или кабеля CAT-5 . В таких системах популярны ( модульные разъемы 6P2C или 6P4C , обычно используемые для телефонов).

Системы датчиков и исполнительных механизмов могут быть построены путем соединения множества компонентов 1-Wire. Каждый компонент 1-Wire содержит всю логику, необходимую для работы на шине 1-Wire. Примеры включают регистраторы температуры , таймеры, датчики напряжения и тока, мониторы батарей и память . Их можно подключить к ПК с помощью преобразователя шины. Интерфейсы последовательного порта USB , RS-232 и параллельного порта являются популярными решениями для подключения MicroLan к главному компьютеру. Устройства 1-Wire также могут напрямую подключаться к микроконтроллерам различных производителей.

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

Каждая микросхема 1-Wire имеет уникальный идентификационный код. Эта особенность делает микросхемы, особенно iButton, подходящими электронными ключами. Некоторые виды использования включают в себя замки, охранную сигнализацию, компьютерные системы, одобренные производителем аксессуары и часы. iButtons использовались в качестве смарт-билетов Akbil для общественного транспорта в Стамбуле .

Источники питания

Блоки питания, дисплеи и ноутбуки Mac с разъемом Apple MagSafe и MagSafe 2 используют протокол 1-Wire для отправки и получения данных с подключенного ноутбука Mac через средний контакт разъема. Данные включают модель источника питания, мощность и серийный номер; и команды ноутбука для передачи полной мощности и включения красных или зеленых светодиодов в разъеме.

Подлинные блоки питания Dell для портативных компьютеров используют протокол 1-Wire для передачи данных по третьему проводу на портативный компьютер о номинальной мощности, токе и напряжении. Ноутбук откажется от зарядки, если адаптер не соответствует требованиям.

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

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

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

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:

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

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

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

iButton Access Control↑

iButtons provide an access control solution. An iButton reader is connected to the 1-wire Extension. For each access point (main entrance, door, garage) one 1-wire Extension and one key reader is required. The iButtons are also 1-wire sensors with a unique serial number. Any number of iButtons can be paired and assigned to different users. Thus the iButton becomes the key.

The iButton key reader is connected to the 1-wire Extension via GND and DQ, but it also contains a red and a green LED that can be controlled separately. Key readers purchased from Loxone since 2015 have an integrated resistor that allows the LEDs to be powered directly by 24VDC. Connect the key reader according to the following diagram:

To pair iButtons, first select the 1-wire Extension in Loxone Config, and then click on 1-Wire Monitor.

Then briefly place the iButton on the key reader several times, so that it is displayed in the 1-wire monitor at the bottom of the Loxone Config:

Now select the desired iButton, choose a user from the drop-down list on the right and click on Assign to user. You can also select Create device to create a digital input.

To apply the changes, save the program in the Miniserver.

2 1-wire protocol

2.0 Overview

1-wire or OneWire is a protocol with single-master and multi-slave, under most situation, we would just use one device on the bus.

2.1 Analysis on 1-wire protocol

2.1.1 Overview on 1-wire protocol

No matter whether it’s a read procedure or a write procedure, the process of 1-wire follow a similar pattern:

  • READ PATTERN: -> -> -> -> ->

  • WRITE PATTERN: -> -> -> -> ->

Or in a more general version:

DATA EXCHANGE: Start -> Write a ROM function -> (Optional Read ROM Data) -> Write a EXCHANGE function -> EXCHANGE DATA -> End

2.1.2.1 Distinguish-ability

Just like all the other communication protocol with multiple slave, the master need to know something about the slave devices to tell the difference between all these devices, at the same time, the slaves also need to has some information to know if one communication on the bus is oriented to itself — check the figure below.

  • For a typical 1-wire device, it has an 8 bytes(64-bit) address. The first byte is assigned for family code, while the following 6 bytes is a unique serial number, another 1 byte for CRC code of the first 7 bytes. If the master want to read the serial number from device, it could use the CRC to verify if the communication is right or not.

  • According to the image above, we could know that the 6-bytes in the medium could be used to distinguish devices — do a simple math $$2^{48}=281,474,976,710,656$$, this is more than enough for the distinguish problem.

2.1.2.2 ROM command

Table of ROM command for DS18B20:

ROM code ROM command
0x33 READ ROM
0x55 MATCH ROM
0xf0 SEARCH ROM
0xec ALARM SEARCH ROM
0xcc SKIP ROM

In order to play with these ROMs, there are multiple ROM commands. The following figure indicate their behavior in a simplified way.

  • Such overkill solution bring a new problem when solving a existing problem, that is, when you get a 1-wire device, you won’t be able to know its serial address, you may need to use a complicate method described in the specification to read all unknown serial numbers out, check the Book of iButton chapter 5.II.C.3 and Application Note 187 to know more detail about that.

  • Wherever there is a problem, there will always be a hard way to solve it from root cause and a hacky workaround. For most implementation, programmer won’t know the serial number in advance, they also won’t try to implement such function. Instead, they just assume there is only device on the bus, using external multiplexer to add support to multi-device, just like how the route below does.

  • Almost any kind of multiplexer would work, I had verified that and could work perfectly. If you need more, I think CPLD/FPGA might also work. The figure above illustrate a brief of the whole idea.

  • When using the solution above, we don’t have to handle the ROM issue, under most problem, the (SKIP ROM) is used most frequently.

2.2 Analysis on DS18B20 specific function

Since there are only 7 internal register (3 reserved) in DS18B20, so the control flow is quite simple, just follow the pattern I mentioned in section 2.1.

Here is a brief demonstration of each function command:

  • : start the temperature convert and save the temp to the and .

  • : read all data from scratchpad(all 9 byte but you could sample just the bytes you need.)

  • :write 3 byte to , and . (all 3 byte is needed) configure data in scratchpad would lost after power failed.

  • : copy , and to EERAM.(unlike scratchpad, EERAM would keep after power fails)

  • : copy data stored in EERAM back to -.

  • : return 1 if the device is on an independent ac power, return 0 if the device is using the DQ power.

TROUBLESHOOTING

If you do not find all the connected sensors in a 1-Wire search, this list should help in the analysis.
Before you go through the following points, make sure that the extension is online and the current program is running on the Miniserver.

  • Make sure that there is no wire breaks or polarity reversals in your 1-wire cabling.
  • If only parts of the wiring topology are found other parts of the cabling but not. Check the topology, taking into account the maximum cabling lengths and the cabling requirements.
  • If no sensors are found, connect a sensor directly to the terminal of the extension and perform a new search.
  • On 1-wire interface of the 1-Wire Extension you can measure the voltage values against GND.
    • SET DQ to GND = 5V DC
    • SOLL VDD to GND = 5V DC
  • Measure different values by inserting the 3-pin plug on the top of the 1-Wire Extension and again measuring the voltage values directly on the extension pins as described in the previous section.
    • Measure 5V in each case now, check your wiring for polarity reversals or wire breaks.
    • If voltages <5V measured, check the voltage supply of the 1-Wire Extension.
      If the problem persists, contact our support team.

Connecting 1-wire sensors↑

We recommend connecting no more than 20 or one to the 1-wire bus.Up to 32 sensors are possible, but wiring requirements will increase and the possible cable length and polling cycle will decrease.Use a twisted pair of a shielded CAT5/6/7 cable for the signal lines DQ and GND. VDD can be connected to another conductor of the CAT cable.The shield of the cable must not be connected, and no other data signals should be transmitted in the same cable.

The maximum length of the 1-wire bus depends on the wiring topology. For linear topology and bus topology with short taps up to 300m, for bus topology with long taps and star topology up to 100m. If sensors are connected parasitically, the total length is also limited to 100m.

Many 1-wire sensors support parasitic power supply, where the sensor is supplied via the data line DQ. The sensor’s VDD is connected to GND. This way one conductor can be saved at the expense of the maximum length of the 1-wire bus. Also, the measuring range of temperature sensors is limited to a maximum of +85°C in this case.

Питание устройств типа 1-Wire

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

Паразитическое питание

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

Со стороны ведущего устройства к шине 1-Wire должен быть подключен подтягивающий резистор на 4,7 кОм. Когда эта линия будет переключена в состояние HIGH, устройство начнет тянуть ток, чтобы зарядить внутренний конденсатор.

Сила тока, передаваемого таким способом, как правило, невелика, но при температурной конверсии или записи на EEPROM может достигать 1,5 миллиампер. Когда ведомое устройство выполняет одну из этих операций, контроллер шины должен держать шину в состоянии HIGH, пока эта операция не будет выполнена. При температурной конверсии для DS12S20 требуется задержка в 750 миллисекунд, причем контроллер в течение этого времени не может делать ничего – ни давать команды другим устройствам, ни опрашивать ведомое устройство о выполнении команды. В библиотеку OneWire тоже встроена поддержка этой особенности – она позволяет держать шину в состоянии HIGH после записи данных.

Обычное питание (с использованием внешнего источника)

Если вы хотите запитать чип от внешнего источника, для этого потребуется три провода: один для передачи данных, один для заземления и один для, собственно, питания. Для этого способа по-прежнему нужен подтягивающий резистор на 4,7 кОм, подключенный к шине 1-Wire. Поскольку теперь шина свободна для передачи данных, микроконтроллер может постоянно опрашивать девайс на предмет того, как происходит процесс конверсии. Таким образом, запрос на конверсию можно выполнить сразу после того, как устройство отчитается о выполненной операции – в отличие от паразитического питания, когда вам приходится ждать, пока будет выполнена конверсия (продолжительность этой задержки зависит от функции устройства и его разрешения).

Примечание по резисторам

Согласно даташиту ATmega328/168, для этого микроконтроллера нужны резисторы от 1,6 кОм, однако несколько пользователей обнаружили, что для больших сетей лучше использовать резисторы меньшего номинала.

Другими словами, для больших сетей имеет смысл попробовать резисторы поменьше.

SUPPORTED 1-WIRE COMPONENTS

1-Wire Device Family Code Description Default polling cycle
DS1822
Econo 1-Wire Digital Thermometer
22 Temperature Sensor
Range: -55°C to +85°C
Accuracy: ± 2°C from -10°C to +85°C
Resolution: 12 Bit or 0.0625°C
60
DS18B20
Programmable Resolution 1-Wire Digital Thermometer
28 Temperature Sensor
Range: -55°C to +85°C
Accuracy: ± 0.5°C from -10°C to +85°C
Resolution: 12 Bit or 0.0625°C
60
DS18S20
Parasite Power Digital Thermometer
10 Temperature Sensor
Range: -55°C to +125°C
Accuracy: ± 0.5°C from -10°C to +85°C
Resolution: 9 Bit or 0.5°C
60
DS1963S
Serial Number iButton (SHA)
18 Access Control 0.1
DS1990
Serial Number
iButton
01 Access Control 0.1
DS2438
Smart Battery Monitor
26 AAD-Converter and Temperature SensorTemperature Range: -55°C to +125°C
Resolution: 13 Bit or 0.03125°C60Voltage VDDVoltage Supply
Range: 0V – 10.23V
Resolution: 10mVVoltage VADVoltage at the input pin of the AD Converter
Range: 0V – 10.23V
Resolution: 10mVVoltage VsensVoltage at an external resistor (Rsens) for indirect current measurement
Range: -0.25V – 0.25V
Resolution: 0.2441mV
60

Please note that a short polling cycle with many temperature sensors will slow the bus communication down, so therefore the polling cycle should preferably stay at the default of 60 seconds. For this reason, a separate 1-wire extension is to be used for the access. Thus, no delays can occur during the access by the temperature sensors.

Протокол 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: число запрашиваемых байт.

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.

Объяснение программы для ведомой (Slave) платы Arduino

1. Как и в ведущей плате, первым делом в программе мы должны подключить библиотеку Wire для задействования возможностей протокола I2C и библиотеку для работы с ЖК дисплеем. Также нам необходимо сообщить плате Arduino к каким ее контактам подключен ЖК дисплей.

Arduino

#include<Wire.h>
#include<LiquidCrystal.h>
LiquidCrystal lcd(2, 7, 8, 9, 10, 11);

1
2
3

#include<Wire.h>    
#include<LiquidCrystal.h>      

LiquidCrystallcd(2,7,8,9,10,11);

  1. В функции void setup():

—  мы инициализируем последовательную связь со скоростью 9600 бод/с;

Arduino

Serial.begin(9600);

1 Serial.begin(9600);

— далее мы инициализируем связь по протоколу I2C на контактах A4 и A5

В качестве адреса ведомого мы будем использовать значение 8 – очень важно здесь указать адрес ведомого;. Arduino

Wire.begin(8);

Arduino

Wire.begin(8);

1 Wire.begin(8);

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

Arduino

Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent);

1
2

Wire.onReceive(receiveEvent);

Wire.onRequest(requestEvent);

— затем мы инициализируем ЖК дисплей для работы в режиме 16х2, отображаем на нем приветственное сообщение и очищаем его экран через 5 секунд.

Arduino

lcd.begin(16,2); //Initilize LCD display
lcd.setCursor(0,0); //Sets Cursor at first line of Display
lcd.print(«Circuit Digest»); //Prints CIRCUIT DIGEST in LCD
lcd.setCursor(0,1); //Sets Cursor at second line of Display
lcd.print(«I2C 2 ARDUINO»); //Prints I2C ARDUINO in LCD
delay(5000); //Delay for 5 seconds
lcd.clear(); //Clears LCD display

1
2
3
4
5
6
7

lcd.begin(16,2);//Initilize LCD display

lcd.setCursor(,);//Sets Cursor at first line of Display

lcd.print(«Circuit Digest»);//Prints CIRCUIT DIGEST in LCD

lcd.setCursor(,1);//Sets Cursor at second line of Display

lcd.print(«I2C 2 ARDUINO»);//Prints I2C ARDUINO in LCD

delay(5000);//Delay for 5 seconds

lcd.clear();//Clears LCD display

3. Затем нам будут необходимы две функции: одна для события запроса (request event) и одна для события приема (receive event).

Для события запроса:

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

Arduino

void requestEvent()
{
int potvalue = analogRead(A0);
byte SlaveSend = map(potvalue,0,1023,0,127);
Wire.write(SlaveSend);
}

1
2
3
4
5
6

voidrequestEvent()

{

intpotvalue=analogRead(A0);

byteSlaveSend=map(potvalue,,1023,,127);

Wire.write(SlaveSend);

}

Для события приема:

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

Arduino

void receiveEvent (int howMany)
{
SlaveReceived = Wire.read();
}

1
2
3
4

voidreceiveEvent(inthowMany)

{

SlaveReceived=Wire.read();

}

4. В функции Void loop():

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

Arduino

void loop(void)
{
lcd.setCursor(0,0); //Sets Currsor at line one of LCD
lcd.print(«>> Slave <<«); //Prints >> Slave << at LCD
lcd.setCursor(0,1); //Sets Cursor at line two of LCD
lcd.print(«MasterVal:»); //Prints MasterVal: in LCD
lcd.print(SlaveReceived); //Prints SlaveReceived value in LCD received from Master
Serial.println(«Slave Received From Master:»); //Prints in Serial Monitor
Serial.println(SlaveReceived);
delay(500);
lcd.clear();
}

1
2
3
4
5
6
7
8
9
10
11
12

voidloop(void)

{

lcd.setCursor(,);//Sets Currsor at line one of LCD

lcd.print(«>>  Slave  <<«);//Prints >> Slave << at LCD

lcd.setCursor(,1);//Sets Cursor at line two of LCD

lcd.print(«MasterVal:»);//Prints MasterVal: in LCD

lcd.print(SlaveReceived);//Prints SlaveReceived value in LCD received from Master

Serial.println(«Slave Received From Master:»);//Prints in Serial Monitor

Serial.println(SlaveReceived);

delay(500);

lcd.clear();

}

После того как вы соберете всю схему проекта и загрузите обе программы в платы Arduino вы можете приступать к тестированию работы проекта. Вращая потенциометр на одной стороне вы должны увидеть изменяющиеся значения на экране ЖК дисплея на другой стороне.

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