Читаем Программируем Arduino. Основы работы со скетчами полностью

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

OneWire bus(10);

В данном случае роль линии данных шины будет играть контакт 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, которую можно использовать для поиска всех ведомых устройств на шине. Следующий пример выводит адреса всех устройств на шине в монитор последовательного порта:

// sketch_08_01_OneWire_List

#include

OneWire bus(10);

void setup

{

  Serial.begin(9600);

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

  while (bus.search(address))

  {

    for(int i = 0; i < 7; i++)

    {

      Serial.print(address[i], HEX);

      Serial.print(" ");

    }

    // проверить контрольную сумму

    if (OneWire::crc8(address, 7) == address[7])

    {

      Serial.println(" CRC OK");

    }

    else

    {

      Serial.println(" CRC FAIL");

    }

  }

}

void loop

{

}

На рис. 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

Для датчика температуры компании Dallas Semiconductor имеется собственная библиотека, упрощающая операцию запроса температуры и декодирования результата. Библиотека DallasTemperature доступна для загрузки по адресу https://github.com/milesburton/Arduino-Temperature-Control-Library.

// sketch_08_02_OneWire_DS18B20

#include

#include

const int busPin = 10;

OneWire bus(busPin);

DallasTemperature sensors(&bus);

DeviceAddress sensor;

void setup

{

  Serial.begin(9600);

  sensors.begin;

  if (!sensors.getAddress(sensor, 0))

  {

    Serial.println("NO DS18B20 FOUND!");

  }

}

void loop

{

  sensors.requestTemperatures;

  float tempC = sensors.getTempC(sensor);

  Serial.println(tempC);

  delay(1000);

}

Этот скетч выводит в окно монитора последовательного порта температуру в градусах Цельсия, прочитанную с единственного датчика температуры (рис. 8.4).

Рис. 8.4. Вывод температуры, прочитанной с датчика DS18B20

В этом примере используется только один датчик температуры, но его легко можно распространить на случай с несколькими датчиками. Библиотека DallasTemperature сама определяет адреса устройств с помощью OneWire в функции getAddress, вторым параметром которой передается номер позиции датчика. Чтобы добавить второй датчик, нужно определить новую переменную для хранения его адреса и затем определить адрес вызовом getAddress. Пример с использованием двух датчиков можно загрузить с сайта книги, где он хранится под именем sketch_08_03_OneWire_DS18B20_2.

В заключение

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

Перейти на страницу:

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программист-прагматик. Путь от подмастерья к мастеру
Программист-прагматик. Путь от подмастерья к мастеру

Находясь на переднем крае программирования, книга "Программист-прагматик. Путь от подмастерья к мастеру" абстрагируется от всевозрастающей специализации и технических тонкостей разработки программ на современном уровне, чтобы исследовать суть процесса – требования к работоспособной и поддерживаемой программе, приводящей пользователей в восторг. Книга охватывает различные темы – от личной ответственности и карьерного роста до архитектурных методик, придающих программам гибкость и простоту в адаптации и повторном использовании.Прочитав эту книгу, вы научитесь:Бороться с недостатками программного обеспечения;Избегать ловушек, связанных с дублированием знания;Создавать гибкие, динамичные и адаптируемые программы;Избегать программирования в расчете на совпадение;Защищать вашу программу при помощи контрактов, утверждений и исключений;Собирать реальные требования;Осуществлять безжалостное и эффективное тестирование;Приводить в восторг ваших пользователей;Формировать команды из программистов-прагматиков и с помощью автоматизации делать ваши разработки более точными.

А. Алексашин , Дэвид Томас , Эндрю Хант

Программирование / Книги по IT