Выбрать главу

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