Arduino: осваиваем цифровой термодатчик и 1-wire
Содержание
- 1 Объяснение скетча для ведомого
- 2 TROUBLESHOOTING
- 3 Открытый сток
- 4 Достоинства
- 5 Предварительные причесывания
- 6 Применение
- 7 Step 2: Parts for Project
- 8 Софт
- 9 Architecture details
- 10 Термометр через последовательный монитор
- 11 SUPPORTED 1-WIRE COMPONENTS
- 12 Датчики температуры для работы с Ардуино
- 13 Другие полезные функции в библиотеке DallasTemperature.h
- 14 Объяснение скетча для мастера
- 15 5Управление устройством по шине IIC
- 16 Внедрение агента в банду
- 17 Alternatives
Объяснение скетча для ведомого
Для ведомого устройства существует небольшая разница в кодировании I2C-связи. Первая разница заключается в адресе .
Для ведомых устройств адрес является обязательным. Для нашего проекта адрес для ведомого устройства будет 0x08. Это может быть любой адрес, но убедитесь, что он уникален в сети I2C.
Некоторые I2C ведомые устройства также имеют определенные I2C-адреса, поэтому сначала проверьте спецификацию.
Мы присоединим I2C сеть в качестве ведомого устройства, добавив код внутри .
Обработчики событий
Следующая задача — добавить в наш код обработчики событий для управления данными, полученными с других устройств в I2C сети.
Обработчики событий — это части кода, которые управляют событиями, с которыми наше устройство, скорее всего, столкнется во время работы.
Wire.onReceive()
В части скетча мы добавляем функцию для регистрации функции (обработчика), которая будет управлять полученными данными.
Мы вызываем нашу функцию-обработчик
Обратите внимание, что имя функции может быть любым. В приведенном выше эскизе вызывается в секции
В конце эскиза находится код функции-обработчика. Он инициализируется как . Параметр содержит количество байт полученных данных.
Wire.onRequest()
Следующий обработчик события, который мы будем использовать — . Эта функция используется на подчиненных устройствах и работает аналогично .
Единственное отличие заключается в том, что она обрабатывает события запроса данных. Запросы данных поступают от основных устройств.
В функцию мы добавляем код . А в конце нашего эскиза добавляем функцию
Обратите внимание, что обработчики не принимают никаких параметров. Функция содержит только
Нам не нужны и , потому что библиотека Wire уже обрабатывает ответы от ведомых устройств.
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.
Открытый сток
Определяющей особенностью I2C является то, что каждое устройство на шине, должно подключаться к линиям тактового сигнала (сокращенно SCL) и сигнала данных (сокращенно SDA) через выходные драйверы с открытым стоком (или открытым коллектором). Давайте посмотрим, что это на самом деле означает. Сначала рассмотрим типовой CMOS (инвертирующий) выходной каскад:
Если на входе присутствует высокий логический уровень, NMOS транзистор открыт, а PMOS транзистор закрыт. Таким образом, выход имеет низкоомное соединение с землей. Если на входе присутствует низкий логический уровень, ситуация меняется на противоположную, а выход имеет низкоомное соединение с VDD. Это называется двухтактным выходным каскадом, хотя это название не особенно информативно, поскольку оно не подчеркивает низкое сопротивление соединений, которые управляют выходом. В общем случае вы не можете напрямую соединять два двухтактных выхода, поскольку ток будет свободно протекать от VDD до земли, если на одном выходе выдается логическая единица, а на другом – логический ноль.
Теперь рассмотрим схему с открытым стоком:
PMOS транзистор был заменен резистором, внешним по отношению к микросхеме. Если на входе присутствует высокий логический уровень, NMOS транзистор обеспечивает низкоомное соединение с землей. Но если на вход подается низкий логический уровень, NMOS транзистор выглядит как разомкнутая цепь, а это означает, что выход подтягивается к VDD через внешний резистор. Такой механизм приводит к двум важным отличиям. Во-первых, появляется неочевидное рассеивание мощности, когда на выходе низкий логический уровень, поскольку ток протекает через резистор, через канал NMOS транзистора на землю (в двухтактной схеме этот ток блокируется высоким сопротивлением закрытого PMOS транзистора). Во-вторых, выходной сигнал ведет себя по-другому, когда на выходе высокий логический уровень, так как выход подключен к VDD через гораздо более высокое сопротивление (обычно не менее 1 кОм). Эта особенность позволяет напрямую соединять два (и более) устройства с открытым стоком: даже если на одном из них низкий логический уровень, а на другом – высокий логический уровень, то подтягивающий резистор гарантирует, что ток не протекает свободно от VDD на землю.
Некоторые последствия использования на шине схемы с открытым стоком:
- Сигналы всегда по умолчанию находятся в состоянии логической единицы. Напримем, если ведущее устройство I2C пытается связаться с ведомым устройством, которое вдруг перестало функционировать, сигнал данных никогда не войдет в неопределенное состояние. Если ведомое устройство не управляет сигналом, то он будет считан как логическая единица. Аналогично, если ведущее устройство выключается в середине передачи, линии SCL и SDA вернутся в состояние логической единицы. Другие устройства могут определить, что шина доступна для новых передач, наблюдая, что и SCL, и SDA находятся в состоянии логической единицы в течении определенного периода времени.
- Любое устройство на шине может безопасно приводить сигналы в состояние логического нуля, даже если другое устройство пытается привести их в состояние логической единицы. Это является основой функции «тактовой синхронизации» или «растяжки тактового сигнала» на шине I2C: ведущее устройство генерирует последовательность тактовых импульсов, но при необходимости ведомое устройство может удерживать линию SCL на низком уровне и тем самым уменьшать тактовую частоту.
- Устройства с различными напряжениями питания могут сосуществовать на одной и той же шине, пока устройства с более низким напряжением не будут повреждены более высоким напряжением. Например, устройство 3,3 В может связываться с устройством 5 В, если SCL и SDA подтянуты до 5 В – схема с открытым стоком приводит к тому, что высокий логический уровень достигает напряжения 5 В, хотя устройство 3,3 В с типовым двухтактным каскадом не может управлять линией 5 В.
Достоинства
- для связи с устройством требуется лишь два провода: на данные и заземление.
- большое расстояние передачи. Расстояние достигает 300 м при соблюдении ряда условий: применение специального кабеля IEEE1394 (Firewire), использование специального драйвера сети (активная подтяжка с учётом тока в линии), использование топологии «общая шина» с единым стволом (не свободная топология);
- изменяемость конфигурации любой сети 1-Wire в процессе её работы;
- простое решение адресуемости абонентов;
- несложный протокол;
- простая структура линии связи;
- малое потребление компонентов;
- исключительная дешевизна всей технологии в целом.
Предварительные причесывания
Начал я с простого — заставил хотя бы собираться библиотеки. Обе библиотеки используют ардуиновские функции, поэтому пришлось внести некоторые изменения. Для начала добавим файл в проект (он будет портом библиотеки OneWire для проекта) и приинклюдим его в файл , а затем начнем причесывание. А именно:
-
OneWire построена таким образом, что ей при создании экземпляра объекта скармливается номер ноги, на которой у тебя будет линия 1-Wire. Это тащит за собой кусочек мрака из недр библиотек Ардуино, поэтому я пошел простым путем и зашил хардкодом в конструктор класса OneWire нужные мне ноги. Да, теряем универсальность, но я пока не вижу применения с двумя шинами 1-Wire (хотя… ну да не сейчас). Исходя из схемы платы, я выбрал ногу PA6, которая выходит на колодку DIGITAL пин 28.
-
OneWire использует задержки в микросекундах для реализации протокола 1-Wire, подсунем библиотечную функцию _delay_us() в файл
-
OneWire любит отключать прерывания во время выполнения очень маленьких задержек (несколько микросекунд), и я ее понимаю. Но сразу же оглянемся и подумаем о том, что у нас все-таки будет ось. А значит, включение прерываний разумнее проредить немного, чтобы случайно не потерять контекст выполнения на неопределенное время. Библиотека использует ардуиновские функции работы с прерываниями, подсунем ей стандартные через файл :
-
В драйвере термодатчика используется задержка, измеряемая в миллисекундах. Тут разумнее использовать вызов функции ОС, особенно учитывая размер этих задержек. Для замены sleep на вызов функции ОС пришлось немного погородить макросов в , комментарии в коде.
Применение
Идентификация личности
Замок и ключ, использующие технологию 1-Wire
Каждая микросхема 1-Wire имеет уникальный номер. Это позволяет использовать устройства iButton в качестве простых идентификаторов личности, например, в системах контроля и управления доступом (СКУД). В этом качестве они успешно конкурируют с бесконтактными карточками, использующими технологию RFID.
Имеются устройства iButton с поддержкой криптографии, что позволяет создавать на их основе защищённые хранилища небольших объёмов данных или средства сильной аутентификации. Такие устройства могут конкурировать со смарт-картами в некоторых применениях.
Удалённые датчики физических величин
Устройства 1-Wire очень удобны для измерений. Не требуется отдельного питания, возможно подключить по одному проводу целую гирлянду разнообразных датчиков. Система таких датчиков легко контролируется на предмет аварий. Записи о калибровках могут храниться прямо в датчиках.
Измерение температуры — одно из самых массовых применений 1-Wire устройств. В сельском хозяйстве применяется для многоточечного контроля температуры в теплицах, ульях, элеваторах, инкубаторах, овощехранилищах. Популярны домашние метеостанции, подключаемые по этому интерфейсу.
Маркировка оборудования
Микросхемы 1-Wire популярны для маркировки и хранения параметров дополнительного оборудования к установкам. Например, медицинские и лабораторные приборы, использующие в работе множество различных сменных головок и датчиков, снабжаются микросхемой. При подключении прибор сразу распознаёт сменную головку и корректно устанавливает режим работы. Аналогично может контролироваться наработка узлов с ограниченным ресурсом.
Другие применения
Существуют решения iButton для охраны недвижимости, для систем обнаружения проникновения, другое использования. Есть также системы для доступа в менее очевидных областях безопасности. Например, iButton может быть использован для аутентификации пользователей компьютерных систем (аппаратный ключ в системах защиты информации), или в системе табельных часов.
Step 2: Parts for Project
First picture show all parts we will use on this project.
Besides PCB we have 3 groups of elements : Voltage regulator (5V)
- 7805 IC (T1)
- elco 100 uF (Cin)
- elco 10 uF (Cout)
- 2 pin screw terminal 200mil (P1)
- 2 x 2 pin 100 mil with cap connector (J1 & J2)
- Schottky 1N5407 (sD5)
- LED smd blue (LED)
- resistor 100 (R3)
1-Wire serial communication interface
- 2 x Schottky diodes (1N5818) (sD2 & sD1)
- 6.2V Zener diode (zD4)
- 3.9V Zener diode (zD3)
- resistor 1.5 k (R2)
- 1m flat 10 wire cable
- 2×5 pins header (RS232H)
- IDC 10 pin connector
- IDC 9 pin female D-sub connector
1-Wire Bus
You may use any combination of SMD or normal size elements, even different value for same type of elements.
Schematic for both part of project are in pictures.
Софт
Начало
отсюда
- LV 2009 или новее.
- NI VISA (модуль LV для общения виртуальных приборов с реальными).
- Arduino IDE и драйвера.
- Библиотека OneWire для Arduino — положите содержимое ZIPа в //libraries/.
- Разработчик LV предлагает расширение для работы с платами Arduino — LabVIEW Interface for Arduino, или просто LIFA. С недавнего времени развитие LIFA официально прекращено, вместо него NI предлагают пользоваться тулкитом LINX от LabVIEW Hacker. Он поддерживает бóльшее число устройств и содержит больше инструментов, однако, я пользовался LIFA, потому что в LINX прошивки контроллеров имеют вид HEX-файлов, возиться с разборкой и редактированием которых у меня не было ни желания, ни времени. А в LIFA исходники — привычные для Arduino скетчи.
LIFA можно установить непосредственно из LV через интерфейс VI Package Manager (Tools -> VI Package Manager). После установки на палитре функций появится подпалитра «Arduino»:
LIFA_Base.inoLabVIEWInterface.inoLIFA_Base.inoссылкаролике на YouTube
- В файле LIFA_Base.ino подключил библиотеку OneWire.h,
- В файле LabVIEWInterface.ino в структуре case, отвечающей за обработку команд, поступающих из LV по последовательной шине, он добавил вариант 0x1E, вызывающий функцию считывания температуры, написанную им же:
Функция эта отправляет на линию данных команду измерения температуры 0x44 («конвертирование»), дожидается окончания конвертирования, отправляет команду считывания памяти 0xBE, читает, из полученной информации достаёт показание температуры и отправляет его на последовательную шину:
LIFA_BASE.inoLabVIEWInterface.inoDS18x20_Temperature
запарился и
Architecture details
OneWireNg
The class provides public interface for 1-wire service. Object of this class
isn’t constructed directly rather than casted from a derived class object
implementing platform specific details.
As an example:
OneWireNg::Id id; OneWireNg::ErrorCode ec; OneWireNg *ow = new OneWireNg_ArduinoAVR(10); do { ec = ow->search(id); if (ec == OneWireNg::EC_MORE || ec == OneWireNg::EC_DONE) { // `id' contains 1-wire address of a connected slave } } while (ec == OneWireNg::EC_MORE);
creates 1-wire service interface for Arduino AVR platform and perform search on
the bus. The bus is controlled by Arduino pin number 10.
OneWireNg_BitBang
The class is derived from and implements the 1-wire interface basing
on GPIO bit-banging. Object of this class isn’t constructed directly rather than
the class is intended to be inherited by a derived class providing protected
interface implementation for low level GPIO activities (set mode, read, write).
OneWireNg_PLATFORM
Are family of classes providing platform specific implementation (
states for a platform name e.g. provides AVR implementation
for Arduino environment).
The platform classes implement interface directly (via direct
class inheritance) or indirectly (e.g. GPIO bit-banging implementation
bases on , which provides GPIO bit-banging 1-wire service
implementation leaving the platform class to provide platform specific low-level
GPIO activities details).
Platform classes have a public constructor allowing to create 1-wire service for
a particular platform (see ).
NOTE: For the convenience there has been provided
header which tries to detect platform the compilation is proceeded and:
- include proper platform class header,
- assign macro-define to the detected platform class.
Refer to example for the usage details.
Термометр через последовательный монитор
Чтобы отобразить данные на последовательном мониторе, подключите датчик DS18B20 к Arduino, используя перемычки и макет, и не забудьте подключить или припаять резистор 4.7k между контактом 2 и 3 датчика.
Затем скачайте, откройте и загрузите файл .ino, который называется — DS18B20_Serial, ниже.
Если все в порядке, вы должны увидеть измеренную температуру на серийном мониторе Arduino IDE.
#include <OneWire.h> #include <DallasTemperature.h> // Провод данных подключен к контакту 2 на Arduino #define ONE_WIRE_BUS 2 // Настройка oneWire для связи с любыми устройствами OneWire // (не только Maxim/Dallas температурные IC) OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); void setup(void) { // Старт серийного порта Serial.begin(9600); Serial.println("Dallas Temperature IC демо"); // Запуск библиотеки sensors.begin(); } void loop(void) { // запрашиваем sensor.requestTemperatures() для получения глобальной температуры // запрос всех устройств на шине Serial.print(" Запрашиваем температуру..."); sensors.requestTemperatures(); // Отправляем команды для получения температуры Serial.println("DONE"); Serial.print("Температура: "); Serial.print(sensors.getTempCByIndex(0)); // Почему "byIndex"? // У вас может быть несколько IC на одной шине. // 0 относится к первой IC delay(1000); }
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 |
Датчики температуры для работы с Ардуино
При работе с микроконтроллером Ардуино наиболее часто используются следующие датчики температуры: DS18B20, DHT11, DHT22, LM35, TMP36.
Датчик температуры DS18B20
DS18B20 – цифровой 12-разрядный температурный датчик. Устройство доступно в 3 вариантах корпусов – 8-Pin SO (150 mils), 8-Pin µSOP, и 3-Pin TO-92, чаще всего используется именно последний. Он же изготавливается во влагозащитном корпусе с тремя выходами. Датчик прост и удобен в использовании, к плате Ардуино можно подключать сразу несколько таких приборов. А так как каждое устройство обладает своим уникальным серийным номером, они не перепутаются в результате измерения
Важной особенностью датчика является возможность сохранять данные при выключении прибора. Также DS18B20 может работать в режиме паразитного питания, то есть без внешнего питания через подтягивающий резистор
Подробная статья о ds18b20.
Датчики температуры DHT
DHT11 и DHT22 – две версии датчика DHT, обладающие одинаковой распиновкой. Разливаются по своим характеристикам. Для DHT11 характерно определение температуры в диапазоне от 0С до 50С, определение влажности в диапазоне 20-80% и частота измерений 1 раз в секунду. Датчик DHT22 обладает лучшими характеристиками, он определяет влажность 0-100%, температурный диапазон увеличен – от -40С до 125С, частота опроса 1 раз за 2 секунды. Соответственно, стоимость второго датчика дороже. Оба устройства состоят из 2 основных частей – это термистор и датчик влажности. Приборы имеют 4 выхода – питание, вывод сигнала, земля и один из каналов не используется. Датчик DHT11 обычно используется в учебных целях, так как он показывает невысокую точность измерений, но при этом он очень прост в использовании. Другие технические характеристики устройства: напряжение питания от 3В до 5В, наибольший ток 2,5мА. Для подключения к ардуино между выводами питания и выводами данных нужно установить резистор. Можно купить готовый модуль DHT11 или 22 с установленными резисторами.
Датчик температуры LM35
LM35 – интегральный температурный датчик. Обладает большим диапазоном температур (от -55С до 150С), высокой точностью (+-0,25С) и калиброванным выходом. Выводов всего 3 – земля, питание и выходной мигнал. Датчик стоит дешево, его удобно подключать к цепи, так как он откалиброван уже на этапе изготовления, обладает низким сопротивлением и линейной зависимостью выходного напряжения. Важным преимуществом датчика является его калибровка по шкале Цельсия. Особенности датчика: низкая стоимость, гарантированная точность 0,5С, широкий диапазон напряжений (от 4 до 30В) ток менее 60мА, малый уровень собственного разогрева (до 0,1С), выходное сопротивление 0,1 Ом при токе 1мА. Из недостатков можно выделить ухудшение параметров при удалении на значительное расстояние. В этом случае источниками помех могут стать радиопередатчики, реле, переключатели и другие устройства. Также существует проблема, когда температура измеряемой поверхности и температура окружающей среды сильно различаются. В этом случае датчик показывает среднее значение между двумя температурами. Чтобы избавиться от этой проблемы, можно покрыть поверхность, к которой подключается термодатчик, компаундом.
Схема подключения к микроконтроллеру Ардуино достаточно проста. Желательно датчик прижимать к контролируемой поверхности, чтобы увеличить точность измерения.
Примеры применения:
- Использование в схемах с развязкой по емкостной нагрузке.
- В схемах с RC цепочкой.
- Использование в качестве удаленного датчика температуры.
- Термометр со шкалой по Цельсию.
- Термометр со шкалой по Фаренгейту.
- Измеритель температуры с преобразованием напряжение-частота.
- Создание термостата.
TMP36 – аналоговый термодатчик
Датчик температуры Использует технологии твердотельной электроники для определения температуры. Устройства обладают высокой точностью, малым износом, не требуют дополнительной калибровки, просты в использовании и стоят недорого. Измеряет температуру в диапазоне от -40С до 150С. Параметры схожи с датчиком LM35, но TMP36 имеет больший диапазон чувствительности и не выдает отрицательное значение напряжения, если температура ниже нуля. Напряжение питания от 2,7В до 5,5В. Ток – 0.05мА. При использовании нескольких датчиков может возникнуть проблема, при которой полученные данные будут противоречивы. Причиной этого являются помехи от других термодатчиков. Чтобы исправить эту неполадку нужно увеличить задержку между записью измерений. Низкое выходное сопротивление и линейность результатов позволяют подключать датчик напрямую к схеме контроля температуры. TMP36 также, как и LM34 обладает малым нагревом прибора в нормальных условиях.
Другие полезные функции в библиотеке DallasTemperature.h
Есть еще несколько полезных функций, которые вы можете использовать с объектом . Несколько из них перечислены ниже:
- Функция устанавливает разрешение внутреннего аналого-цифрового преобразователя DS18B20 на значение 9, 10, 11 или 12 бит, что соответствует шагу температуры 0,5°C, 0,25°C, 0,125°C и 0,0625°C соответственно ,
- Функция возвращает значение флага . Это может быть полезно, когда вы хотите проверить, завершено ли преобразование температуры.
- Функции и устанавливают внутренние пороги тревоги высокой и низкой температуры для устройства в градусах Цельсия. Допустимый диапазон от -55°C до +125°C
- Функция возвращает , если устройство имеет состояние тревоги, когда температура выходит за пределы диапазона между верхним и нижним уровнями тревоги.
Объяснение скетча для мастера
Основная часть кода как для ведущего, так и для ведомых устройств — это то, что я называю логическим кодом мигания. Чтобы мигнуть светодиодом 13 на Ардуино, мы должны сделать следующее:
- Добавим глобальные переменные , , и в верхней части нашего скетча
- Инициализируйте значения глобальных переменных внутри функции
- Инициализируйте контакт 13 Arduino как выходной контакт внутри с помощью
- Добавим код логики мигания внутри функции
Библиотека Wire
Для использования встроенного интерфейса I2C Arduino мы будем использовать библиотеку Wire.
Эта библиотека поставляется в стандартной комплектации с Arduino IDE. Как и в других библиотеках Arduino, библиотека Wire имеет готовые I2C функции, чтобы сделать кодирование проще для нас.
Чтобы использовать функции библиотеки Wire, мы должны добавить его сначала в наш эскиз. В эскизе выше, у нас есть следующая строка в верхней части:
После включения библиотеки мы можем использовать встроенные функции библиотеки.
Первое, что нужно сделать, это подключить устройство к шине I2C. Синтаксис для этого — . Адрес является необязательным для мастер-устройств. Итак, для эскиза мастера Arduino, мы просто добавляем код внутри .
Теперь мы переходим к циклу . Наш код заставит Arduino прочитать значение потенциометра, подключенного к контакту A0, и сохранить его в переменной .
Отправка данных
После сохранения значения с пина A0 в переменную , мы можем отправить значение по I2C. Отправка данных по I2C включает в себя три функции:
Wire.beginTransmission()
Мы инициируем команду отправки, сначала информируя устройства на шине о том, что мы будем отправлять данные.
Для этого мы вызываем функцию . Адрес — это I2C-адрес ведомого прибора, который будет принимать данные. Эта функция делает две вещи:
- Она информирует шину о том, что мы будем посылать данные.
- Он информирует предполагаемого получателя о том, что данные готовы к получению.
Wire.endTransmission()
После отправки данных нам необходимо освободить сеть, чтобы позволить другим устройствам общаться по сети. Это делается с помощью функции .
Наше ведущее устройство также должно получить положение потенциометра от ведомого устройства. Мы делаем это с помощью , и .
Wire.requestFrom()
Полным синтаксисом запроса данных от ведомого устройства является Wire.requestFrom(адрес, количество).
Адрес — это I2C-адрес ведомого устройства, от которого мы должны получить данные, а количество — это количество байтов, которое нам нужно. Для нашего проекта, адрес ведомого устройства 0x08 и нам нужен один байт.
Внутри мы используем для запроса одного байта данных от ведомого устройства 0x08.
После выдачи команды , за ней должна следовать команда чтения для получения ответа от шины I2C.
Write.available()
Сначала мы проверяем, есть ли данные на шине. Это делается с помощью функции внутри условного оператора . Функция возвращает количество байт, ожидающих чтения.
Wire.read();
Для получения доступных данных мы используем функцию и сохраняем возвращаемое значение в переменную . Каждый вызов функции получает только один байт данных из шины I2C.
5Управление устройством по шине IIC
Рассмотрим диаграммы информационного обмена с цифровым потенциометром AD5171, представленные в техническом описании:
Рассмотрим диаграммы чтения и записи цифрового потенциометра AD5171
Нас тут интересует диаграмма записи данных в регистр RDAC. Этот регистр используется для управления сопротивлением потенциометра.
Откроем из примеров библиотеки «Wire» скетч: Файл Образцы Wire digital_potentiometer. Загрузим его в память Arduino.
#include <Wire.h> // подключаем библиотеку "Wire" byte val = 0; // значение для передачи потенциометру void setup() { Wire.begin(); // подключаемся к шине I2C как мастер } void loop() { Wire.beginTransmission(44); // начинаем обмен с устройством с I2C адресом "44" (0x2C) Wire.write(byte(0x00)); // посылаем инструкцию записи в регистр RDAC Wire.write(val); // задаём положение 64-позиционного потенциометра Wire.endTransmission(); // завершаем I2C передачу val++; // инкрементируем val на 1 if (val == 63) { // по достижении максимума потенциометра val = 0; // сбрасываем val } delay(500); }
После включения вы видите, как яркость светодиода циклически нарастает, а потом гаснет. При этом мы управляем потенциометром с помощью Arduino по шине I2C.
По ссылкам внизу статьи, в разделе похожих материалов (по тегу), можно найти дополнительные примеры взаимодействия с различными устройствами по интерфейсу IIC, в том числе примеры чтения и записи.
Внедрение агента в банду
Теперь либы собираются, настал черед вкрутить их в код проекта. Как удостовериться, что оно заработало? Элементарно: создаем экземпляр класса OneWire, затем DallasTemperature с параметром шины, на которую подключены термодатчики, и начинаем все это активно использовать.
В проекте уже есть простенький терминал, добавляй туда команду, по которой будет производиться опрос термодатчика и вывод значения в терминал. Для удобства я добавил еще одну команду — поиск термодатчиков, по этой команде опрашивается линия, ответившие термодатчики заносятся в «кеш» библиотеки, после чего для найденных термодатчиков можно получить адреса и вывести их в терминал. Отмечу отдельно алгоритм поиска устройств на линии, очень увлекательный процесс, описан подробно в документации к iButton в разделе Network Capabilities.
Первый запуск
Alternatives
If a software solution is not feasible for a specific application, then a 1-Wire master chip or a synthesized 1-Wire master block can be used as an alternative.
Maxim provides a predefined 1-Wire master in Verilog and VHDL.DS1WM
To obtain the 1-Wire master Verilog/VHDL code, please submit a tech support request.
Operation of the synthesizable 1-Wire Master is described in application note 119, «Embedding the 1-Wire Master in FPGAs or ASICs.»
There are several 1-Wire master chips that can be used as a peripheral to a microprocessor. The DS2480B Serial 1-Wire Line Driver provides easy connectivity to a standard serial port. Similarly the DS2482-100, DS2482-101, and DS2482-800 can connect to the I²C port.
Operation of the DS2480B is described in application note 192, «Using the DS2480B Serial 1-Wire Line Driver.»
Operation of the DS2482 is described in application note 3684, «How to Use the DS2482 I²C 1-Wire Master.»
A more sophisticated 1-Wire line driver designed specifically for long lines is presented in application note 244, «Advanced 1-Wire Network Driver.»