14.4. Отправка данных в реальном времени в графические сервисы

В предыдущем разделе вы узнали, как превратить плату Arduino в веб-сервер, который предоставляет интерфейс для управления контактами платы по локальной сети или через Интернет. Существует еще одна распространенная причина для подключения Arduino к Интернету - создание сети датчиков. Поскольку датчики обычно только передают информацию, а не принимают команды, Arduino будет инициализировать запрос к известному ресурсу в Интернете (через онлайн-сервис графиков) и вам не придется заботиться о переадресации IP-адресов, резервировании IP-адреса и т. п.

В этом разделе используется веб-ресурс Xively (ранее Cosm) для создания графиков данных, получаемых с платы Arduino.

14.4.1. Создание потока данных на Xively

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

Создание учетной записи Xively

Для начала, посетите страницу http://www.xively.com и создайте бесплатный аккаунт. Перейдите по ссылке, содержащейся в электронном письме с подтверждением, и вы сможете войти на сайт.

Создание потока данных

Как только аккаунт будет создан, нажмите кнопку Develop в верхней части страницы, чтобы создать канал. Затем нажмите кнопку Add Device. В окне (рис. 14.6) вам будет предложено назвать свой канал и добавить его описание. Вы также можете сделать ваш канал публичным или приватным.

После ввода необходимых данных нажмите кнопку Add Device. Появится страница с сообщением о созданном новом потоке. Оставьте страницу открытой, т. к.

эта информация пригодится нам в дальнейшем при настройке программы для Arduino.

- 318 -

Рис. 14.6. Добавление устройства в Xively

Установка библиотек Xively и HTTPClient

Xively предоставляет для Arduino удобную библиотеку, облегчающую доступ через Интернет. Библиотеки Xively и HttpClient связаны друг с другом, поэтому их необходимо скачать с сайта GitHub. Посетите следующие две ссылки:

https://github.com/xively/xively-Arduino и https://github.com/amcewen/HttpClient и нажмите кнопку Download ZIP для скачивания архивов. Ссылки для скачивания библиотек можно найти на веб-странице http://www.exploringarduino.com/content/ch14.

Скачав файлы, выполните следующие действия:

1. Распакуйте файлы и переименуйте папки библиотек так, чтобы они не содержали символа тире (GitHub добавляет тире к именам папок автоматически). Я рекомендую переименовать папку HttpClient-master в HttpClient, а папку XivelyArduino-master в xively.

2. Переместите эти папки в каталог библиотек Arduino, как было описано в главе 12.

3. Откройте Arduino IDE (если программа была открыта при копировании библиотек, необходима перезагрузка компьютера) и перейдите в меню Файл -> При

- 319 -

меры. В списке должны появиться папки HttpClient и xively. Значит, библиотеки были успешно установлены.

Для первого эксперимента с Xively рассмотрим пример публикации в Сети состояния одного аналогового датчика. В Arduino IDE откроем пример DatastreamUpload из папки xively. Так как мы будем модифицировать код примера, создадим новый проект, используя в меню Файл опцию Сохранить как. В примере идет передача аналогового значения датчика, подсоединенного к контакту 2:

// Analog pin which we're monitoring (0 and 1 are used Ьу the

// Ethernet shield)

int sensorPin = 2;

В следующем разделе подключим аналоговый датчик к плате Arduino с установленным адаптером Ethemet.

Подключение к плате Arduino

Подсоединим датчик к аналоговому контакту 2 платы Arduino. Пример иллюстрирует чтение аналогового входа 2 и отправку данных в ваш аккаунт на Xively. Возьмем фоторезистор и резистор номиналом 10 кОм и подключим их к аналоговому входу 2 в качестве делителя напряжения (рис. 14.7), как вы это делали в главе 3.

Затем подключим плату Arduino к компьютеру и к Сети.

Рис. 14.7. Подключение фоторезистора к плате Arduino с установленным адаптером Ethernet

- 320 -

Настройка Xively и выполнение программы

Вы уже установили соответствующие библиотеки и открыли проект с примером.

Его нужно настроить, скомпилировать и запустить на вашей плате Arduino. Сначала настроим программу в соответствии с параметрами устройства в нашем аккаунте Xively. Вам нужно изменить значение трех параметров: MAC-адрес вашего адаптера Ethemet, Xively API key и Feed ID. MAC-адрес будет таким же, как и в предыдущих примерах. xively API key и Feed ID можно найти в вашем аккаунте Xively в разделе API Keys (рис. 14.8).

Рис. 14.8. Параметры Xi veli API key и Feed ID

В этом разделе вы найдете Feed ID (первый параметр) и Xively API key (второй параметр) для вставки в код программы. Далее приведены строки, которые нужно обновить соответствующими значениями.

Замените MAC-адрес:

// MAC-адрес вашего адаптера Ethernet

byte mac[] = { 0xDE, 0xAD, 0xВЕ, 0xEF, 0xFE, 0xED };

Замените Xively API Кеу своим значением:

// Ваш Xively API key

char xivelyKey[] = "YOUR_XIVELY_API_KEY";

Замените Feed ID (15552 в примере) своим значением:

// Feed ID

XivelyFeed feed(15552, datastreams, 1 /* номер потока */);

В листинге 14.3 приведен полный код программы.

Листинг 14.3. Загрузка потока данных в Xively - xively.ino

#include <SPI.h>

#include <Ethernet.h>

#include <HttpClient.h>

#include <Xively.h>

// MAC-адрес Ethernet-адаптера

byte mac[] = { 0x90, 0xА2, 0xDA, 0x00, 0x4A, 0xE0 };

- 321 -

// Ваш Xively АР! key

char xivelyKey[] = "qkjXSloUKqbCG-hqh3fw4WisdvOSAKx4ZXZYSWhGUWdxcz0g";

// Аналоговый контакт для подключения датчика

int sensorPin = 2;

// Строка для идентификаторов потока

char sensorId[] = "sensor_reading";

XivelyDatastrearn datastrearns[] = {

XivelyDatastrearn(sensorId, strlen(sensorId), DATASTREAM_FLOAT),

};

// Feed ID

XivelyFeed feed(1242622121, datastrearns, 1 /* number of datastrearns */);

EthernetClient client;

XivelyClient xivelyclient(client);

void setup()

{

// Запуск последовательного порта

Serial.begin(9600);

Serial.println("Starting single datastrearn upload to Xively... ");

Serial.println();

while (Ethernet.begin(rnac) != 1)

{

Serial.println("Error getting IP address via DHCP, trying again... ");

delay(15000);

}

}

void loop()

{

int sensorValue = analogRead(sensorPin);

datastrearns[OJ.setFloat(sensorValue);

Serial.print("Read sensor value ");

Serial.println(datastrearns[O).getFloat());

Serial.println("Uploading it to Xively");

int ret = xivelyclient.put(feed, xivelyKey);

Serial.print("xivelyclient.put returned ");

Serial.println(ret);

Serial.println();

delay(15000);

}

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

В программе вы создаете объект, который содержит всю информацию о вашем потоке. Данные представлены в виде массива datastrearns [], содержащего имя дат

- 322 -

чика и тип значений (в данном случае float). Объект XivelyFeed содержит идентификатор потока, информацию о потоке данных и количестве потоков данных, которые находятся в массиве.

Отображение данных на веб-странице

Данные будут передаваться сразу после загрузки программы в плату Arduino. Если вы не видите возвращенный статус "200" в мониторе последовательного порта, то, вероятно, ошиблись при копировании параметров Xively API key или Feed ID. Проверьте эти значения и повторите попытку. Если все работает, вернитесь на сайт Xively, поток данных sensor_reading теперь должен автоматически обновляться каждые 15 с. Нажмите на ссылку sensor_reading, и вы увидите график значений, поступающих от фоторезистора. Через некоторое время график может выглядеть примерно так, как показано на рис. 14.9. Вот и все, что нужно сделать. Плата Arduino будет продолжать отправлять данные и обновлять информацию на сервере

Рис. 14.9. Отображение значений фоторезистора на сайте Xively

14.4.2. Добавление компонентов в поток

Один датчик, отображающий поток в Xively, это здорово, но может вы хотите добавить больше датчиков? К счастью, это сделать очень легко. Помимо фоторезистора, установим на плате Arduino датчик температуры. Можно добавить любой другой датчик, включая цифровые датчики I2C и SPI.

- 323 -

Добавление аналогового датчика температуры добавим простой аналоговый датчик температуры ТМР36 (см. главу 3), подсоединив его к аналоговому контакту 3, как показано на рис. 14.10.

Рис. 14.10. Добавление аналогового датчика температуры ТМР36

Добавление показаний датчика в поток

Теперь нужно вставить данные от нового датчика в поток данных, отправляемых на сервер Xively. По сути, в коде программы нужно просто прибавить дополнительный поток данных везде, где указан первый поток данных. Вы также можете переименовать потоки с идентификаторами datastream на более понятные, например light_reading и temp_reading. Код листинга 14.4 похож на предыдущий, но теперь у нас два потока данных. Параметры Xively API key, Feed ID и MAC-адрес такие же, как в предыдущей программе.

Листинг 14.4. Загрузка потока данных в Xively от нескоьких датчиков - xively2.ino

#include <SPI.h>

#include <Ethernet.h>

#include <HttpClient.h>

#include <Xively.h>

- 324 -

// MAC-адрес вашего адаптера Ethernet

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x4A, 0xE0 };

// Your Xively key to let you upload data

char xivelyKey[] = "qkjXSloUKqbCG-hqh3fw4WisdvOSAKx4ZXZYSWhGUWdxcz0g";

// Аналоговые датчики подключения устройств (0 и 1 уже задействованы

// адаптером Ethernet)

int lightPin = 2; // Датчик температуры

int tempPin = 3; // Фоторезистор

// Строки для идентификаторов потока

char lightid[] = "light_reading";

char tempid[] = "temp_reading";

XivelyDatastream datastreams[] = {

XivelyDatastream(lightid, strlen(lightid), DATASTREAM_FLOAT),

XivelyDatastream(tempid, strlen(tempid), DATASTREAM_FLOAT),

};

// Feed ID

XivelyFeed feed(1242622121, datastreams, 2 /* number of datastreams */);

EthernetClient client;

XivelyClient xivelyclient(client);

void setup()

{

// Запуск последовательного порта

Serial.begin(9600);

Serial.println("Starting double datastream upload to Xively... ");

Serial.println();

while (Ethernet.begin(mac) != 1)

{

Serial.println("Error getting IP address via DHCP, trying again... ");

delay(15000);

}

}

void loop()

{

int lightValue = analogRead(lightPin);

datastreams[O].setFloat(lightValue);

Serial.print("Read light value ");

Serial.println(datastreams[O].getFloat());

int tempValue = analogRead(tempPin);

datastreams[1].setFloat(tempValue);

Serial.print("Read temp value ");

Serial.println(datastreams[1].getFloat());

Serial.println("Uploading it to Xively");

- 325 -

int ret = xivelyclient.put(feed, xivelyKey);

Serial.print("xivelyclient.put returned ");

Serial.println(ret);

Serial.println();

delay(15000);

}

Прежде всего, заметим, что предыдущие ссылки на датчик (фоторезистор) были обновлены. Теперь, когда информация поступает от двух датчиков, их необходимо различать. Поток данных tempid[] добавлен в объект datastreams[]. Определение объекта xivelyFeed было обновлено, чтобы показать, что у нас не один, а два потока данных. В цикле loop() строки кода вывода данных фоторезистора продублированы для датчика температуры. Обратите внимание, что поток для фоторезистора представлен в объекте datastreams первым, и на него ссылка задана как datastreams [0]. Поток для датчика температуры в объекте datastreams представлен вторым, и ссылка на него datastreams [1]. При запуске программы на плате Arduino веб-интерфейс автоматически обновляет отображение потоков данных. Возможно, вы захотите удалить старый поток данных sensor_reading, т. к. он заменен потоком light reading. После нескольких минут работы Arduino графики должны выглядеть примерно так, как показано на рис. 14.11.

Рис. 14.11. Отображение на сайте Xively данных от нескольких датчиков

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

- 326 -

Резюме

В этой главе вы узнали следующее:

• Каков смысл параметров IP, DHCP, DNS, MAC и др.

• В чем состоят различия между клиентами и серверами.

• Как создать HTML-код для формы управления платой Arduino через Интернет.

• Как запустить веб-сервер на вашей плате Arduino.

• Как управлять контактами ввода-вывода на Arduino через Интернет.

• Как подключить Arduino к серверу Xively для построения графиков.

• Как отображать онлайн-данные, поступающие от нескольких датчиков.Основа всех плат Arduino - микроконтроллеры Atmel. Здесь мы не будем рассматривать особенности микроконтроллеров для всех плат Arduino, но приведем технический паспорт контроллера ATmega, чтобы получить представление, как он работает. Кроме того, мы опишем принципиальную схему платы Arduino Uno, чтобы лучше понять, как она функционирует.

Знакомство с технической документацией

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

Анализ технического описания

Рассмотрим, например, техническое описание для микроконтроллера ATmega 328Р.

Напомним, что микросхема ATmega 328 используется в Arduino Uno и во многих других платах. Найти технический паспорт бывает нелегко. Я рекомендую ввести в Google запрос "ATmega 328Р datasheet" и выбрать из перечня ссылок PDF-файл на сайте Atmel. Техническое описание микроконтроллеров, применяемых в Arduino, можно найти на сайте http://www.arduino.cc в разделах технических описаний плат. Начнем с рассмотрения первой страницы технического паспорта (рис. П.1 ).

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

Даже беглый взгляд на первую страницу дает много информации о микроконтроллере. Мы видим, что микроконтроллер имеет 32 Кбайт программируемой флэшпамяти, может быть перепрограммирован примерно 10 000 раз, напряжение питания составляет от 1,8 до 5,5 В (в случае Arduino 5 В). Здесь также можно найти сведения о числе входов-выходов, поддержке специальных интерфейсов (SPI, I2C), разрядности аналого-цифрового преобразователя (АЦП).

- 328 -

Рис. П.1. Первая страница технического описания микроконтроллера ATmega 328Р Документация на микроконтроллер ATmega и схема платы Arduino

- 329 -

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

Особый интерес представляет информация о портах ввода-вывода, таймерах, различных аппаратных интерфейсах. В качестве примера рассмотрим рисунок 13-1 из раздела I/O-Ports технического описания, который приведен здесь на рис. П.2. Схемы, подобные этой, присутствуют во всем техническом описании и позволяют глубже понять принцип действия платы Arduino. На приведенной схеме видно, что все контакты ввода-вывода снабжены защитными диодами, предотвращающими появление на выводе отрицательного напряжения. Важную роль играет и конденсатор Cpin, определяющий интервалы времени фронта и спада.

Рис. П.2. Фрагмент технического описания ATmega 328Р: схема контакта ввода-вывода

Цоколевка микросхемы ATmega 328Р

Все технические описания содержат цоколевку, которая четко иллюстрирует функции каждого вывода. Выводы микроконтроллеров могут выполнять несколько функций, поэтому изучение цоколевки помогает уяснить назначение того или иного контакта. Рассмотрим цоколевку ATmega 328Р (рис. П.3). Изучив цоколевку микроконтроллера ATmega, легче будет понять схему Arduino Uno, которую мы рассмотрим в следующем разделе.

Обратите внимание, что расположение выводов на рис. П.3 и на самом микроконтроллере идентично. Полукруг (метка) в верхней части соответствует аналогичному полукругу на корпусе микросхемы и позволяет определить местоположение вывода 1.

Возможно, вы заметили аббревиатуры, не встречавшиеся ранее. Рассмотрим некоторые из них:

• VCC - источник питания микросхемы (в случае Arduino 5 В);

• AVCC - отдельное напряжение питания для АЦП (в случае Arduino 5 В);

- 330 -

Рис. П.3. Цоколевка микроконтроллера ATmega 328Р

Рис. П.4. Схема подключения выводов ATmega 328p к пронумерованным контактам Arduino Документация на микроконтроллер ATmega и схема ппаты Arduino

- 331 -

Остальные выводы контроллера - вводы-выводы общего назначения. Каждый из них сопоставляется с уникальным номером контакта в программном обеспечении Arduino, так что вам не придется помнить букву и номер порта. Названия в скобках представляют собой запись альтернативных функций для каждого вывода. Например, выводы PDO и PD 1 также являются контактами универсального синхронно-асинхронного приемопередатчика Rx и Тх соответственно. Выводы РВ6 и РВ7 служат для подключения внешнего кварцевого резонатора. На плате Arduino Uno к ним подключен кварцевый резонатор 16 МГц и вы не можете их использовать в качестве контактов ввода-вывода. Если у вас возникли проблемы с расшифровкой названий, дополнительную информацию можно отыскать в тех разделах технического описания, где приведена терминология. На сайте Arduino в разделе http://arduino.cc/en/Hacking/PinMapping168 можно найти схему подключения выводов ATmega к пронумерованным контактам платы Arduino (рис. П.4).

Принципиальная схема Arduino

Один из лучших способов изучения проектирования - анализ схем существующих продуктов, например, Arduino. На рис. П.5 изображена принципиальная схема платы Arduino Uno.

Можете ли вы, глядя на рис. П.5, установить соответствие элементов схемы и реальной платы Arduino? Начните с микроконтроллера (MCU) (элемент ZU4 на схеме) и проследите, как связаны выводы ATmega 328p с контактами разъема. Нетрудно убедиться, что выводы ATmega соответствуют контактам, доступным в интегрированной среде разработки (IDE) Arduino. Ранее мы отмечали, что выводы PDO и PD 1 подключены к контактам USART Rx и Тх. По схеме Arduino можно увидеть, что эти выводы подключены к соответствующим контактам контроллера 16U2 (конвертер USB в последовательный порт). Вы также знаете, что к контакту 13 Arduino подключен светодиод. Из схемы видно, что контакт 13 подключен к выводу PBS на ATmega. Но где же светодиод? Обозначив провода специальными метками, можно указать связь между ними в разных частях схемы без соединения линиями. На первый взгляд это может показаться непонятным. Внимательно посмотрев на вывод PBS, можно заметить, что провод, идущий из MCU, помечен как SCK, а в верхней части схемы есть провод, тоже помеченный SCK и подключенный к светодиоду. Такие обозначения соединительных проводов встречаются на большинстве принципиальных схем. Уяснив общий принцип, продолжайте анализировать схему Arduino, пока не поймете назначение всех соединений.

Рис. П.5. Схема платы Arduino Uno RevЗ

************************************************

Более 800 000 книг и аудиокниг! 📚

Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением

ПОЛУЧИТЬ ПОДАРОК