Intel Edison, Windows Phone і Microsoft Azure: хмарний союз пульта і світлодіода

Можливості сучасних технологій найяскравіше проявляються при їх спільному використанні. Наприклад, що можна зробити, якщо об'єднати Intel Edison, Microsoft Azure та Windows Phone? Насправді, багато всього. Тут ми розглянемо один з варіантів – дистанційне включення і вимикання світлодіода, приєднаного до одного з цифрових виходів Edison з комутаційною платою Arduino.



Мобільний сервіс Microsoft пов'язує Edison і «пульт управління», в ролі якого виступає додаток, що працює на платформі Windows Phone. Edison читає значення атрибута з таблиці мобільного сервісу і виконує якісь дії у відповідності з отриманими даними. Додаток для смартфона змінює значення в таблиці, що дозволяє йому впливати на плату.

Попередні вимоги
Ми припускаємо, що читач володіє базовими навичками розробки додатків для платформи Windows Phone і здатний зв'язати такий додаток з мобільного службою Azure. Якщо ви не знаєте, як створювати серверну частину програми, погляньте на цей матеріал.

Для реалізації проекту знадобиться наступне апаратне та програмне забезпечення:

  • Плата Intel Edison з комутаційною платою Arduino
  • Світлодіод
  • Visual Studio
  • Arduino IDE
  • Мобільний сервіс Azure
Спочатку створимо мобільний сервіс Azure. Тому, як це робиться, присвячено безліч публікацій. Наприклад, можете скористатися этим керівництвом та створити мобільний сервіс, який містить одну таблицю. Цю таблицю назвіть «controltable». В ній повинно бути два стовпці. Один – з ім'ям «status», другий – «name». Значення «status» буде або 1, або 0. У «name» «Edison/Arduino».


Мобільний сервіс Azure

Зверніть увагу на те, що атрибут «device» в SQL-таблиці Azure значення не має. Його, якщо хочете, можете видалити.
Тепер займемося розробкою програми для Windows Phone, яке буде додавати або модифікувати значення атрибута.

Додаток для Windows Phone
Тут ми не вдаємося в подробиці розробки для Windows Phone. Якщо вам потрібні додаткові відомості про це, погляньте на матеріали, розміщені на цьому ресурсі.

У нашому додатку буде всього дві кнопки: on» і «off». Ось, як все це виглядає.


Екран програми для Windows Phone

На кнопку-посилання «Log out» можете не звертати уваги.

Отже, як працює програма? При натисканні на кнопки «on» і «off» змінюється атрибут «status» в таблиці Azure, він встановлюється або 1, або 0.

Однак тут ми стикаємося з проблемою. Справа в тому, що для того, щоб записати в яке-небудь поле 1 або 0, потрібно спочатку це поле створити. Тому програма виконує подвійну функцію. При першому підключенні до хмари воно створює таблицю і заповнює її певними значеннями за замовчуванням, а в наступний раз лише оновлює дані.

Коли програма буде готове, його потрібно буде протестувати, перевірити, чи дійсно натискання на кнопки оновлюють поле «status». Коли все запрацює так, як задумано, можна йти далі.

Розробка для Edison
Займемося розробкою для Edison. Перш ніж почати, потрібно налаштувати плату. Після підключення Edison до комп'ютера, з'ясуйте номер COM-порту, який відповідає платі. Потім запустіть IDE Arduino і, зі списку підтримуваних пристроїв, виберіть Edison. Якщо потрібної плату в списку знайти не вдається, потрібно завантажити необхідні файли за допомогою інструмента Boards Manager.


Завантаження файлів для Edison в IDE Arduino

Після того, як ви відкриєте IDE Arduino, до ваших послуг буде пара функцій – це
void setup()
та
void loop()
. Edison оснащений вбудованим Wi-Fi-адаптером. Ми будемо використовувати його для підключення пристрою до інтернету. Тому першим ділом імпортуємо в проект бібліотеку для підтримки Wi-Fi. Для цього потрібно виконати команду Sketch->include library->Wi-Fi. Тепер додамо в проект нижченаведений код, який дозволить підключити пристрій до мережі Wi-Fi.

#include <SPI.h>
#include <WiFi.h>
WiFiClient client;

char ssid[] = "networkssid"; // SSID (ім'я) мережі 
char pass[] = "password"; // пароль для підключення до мережі (для мережі з підтримкою WPA), або ключ (для мережі з підтримкою WEP)
int keyIndex = 0; // індекс ключа мережі (потрібен тільки для WEP)
int status = WL_IDLE_STATUS;

void setup()
{
pinMode(13,OUTPUT);
digitalWrite(13,HIGH);
Serial.begin(115200);
while (!Serial) {
; // очікуємо підключення по послідовному порту. Потрібно тільки для Leonardo
}

// Перевірка наявності плати розширення:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present"); 
// не будемо продовжувати:
while(true);
} 

String fv = WiFi.firmwareVersion();
if( fv != "1.1.0" )
Serial.println("Please upgrade the firmware");

// намагаємося підключитися до Wi-Fi-мережі:
while (status != WL_CONNECTED) { 
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
// Підключення до мережі WPA/WPA2. Змініть цю сходинку, якщо використовуєте відкриту мережу або мережу з підтримкою WEP: 
status = WiFi.begin(ssid, pass); 
}
}

Цей фрагмент коду дозволяє підключити Edison до інтернету по Wi-Fi. Крім того, ми встановили PIN 13 режим виводу і перевели в неактивний стан. Ми будемо використовувати послідовний порт для моніторингу процесу в IDE Arduino.
Тепер займемося методом
void loop()
. Отримання даних з Azure виконується за допомогою методу GET.

void loop()
{
send_request();
wait_response();
read_response();
end_request();
delay(100);
}

Ці функції будуть завантажувати дані з таблиці хмарного сервісу. Але, перш ніж розглянути код функцій, нам потрібно додати в проект кілька глобальних констант, які будуть зберігати дані, необхідні для підключення Edison до Azure.

const char* server= "YourAzureService.azure-mobile.net";
const char* table_name= "TableName";
const char* ams_key="YourApplicationKey";
char buffer[64];

Ключ додатки (
ams_key
) можна знайти у розділі керування ключами облікового запису Microsoft. Тепер розглянемо код методів, використовуваних в
void loop()
.

void send_request()
{
Serial.println("\nconnecting...");

if (client.connect(server, 80))
{

sprintf(buffer, "GET /tables/%s HTTP/1.1", table_name);
client.println(buffer);

// Заголовок хоста
sprintf(buffer, "Host: %s", server);
client.println(buffer);

// Ключ програми Microsoft Mobile Services
sprintf(buffer, "X-ZUMO-APPLICATION: %s", ams_key);
client.println(buffer);

// Тип вмісту JSON
client.println("Content-Type: application/json");

// Розмір вмісту
client.print("Content-Length: ");
client.println(strlen(buffer));

// Закінчення заголовка
client.println();

// Тіло запиту
client.println(buffer);

} 
else 
{
Serial.println("connection failed");
}
}

Ми виконали HTTP-запит і викликали GET, де спочатку вказали ім'я таблиці, ім'я сервера та код ключа. Це потрібно для успішного отримання даних з хмари. Потім ми вказали, в якому форматі хочемо отримати дані, в нашому випадку – це JSON. Тепер займемося кодом функції
wait_response()
.

void wait_response()
{
while (!client.available()) 
{
if (!client.connected()) 
{
return;
}
}
}

Після того, як дані отримані, їх треба прочитати. Так як ми маємо справу з форматом JSON, потрібно розібрати отриманий рядок для того, щоб витягти з неї те, що нам потрібно. Ось як така рядок може виглядати:

{"id":"2492D996-C471-48F0-B3C9-F33E3B37477F","status":"0","name":"arduino"}

Для розбору JSON існує досить ефективна бібліотека, ArduinoJson. Вона виконує основну частину робіт. Але отримана рядок з JSON-даними взято в квадратні дужки «[]». Перш ніж передавати рядок бібліотеці, ці дужки потрібно видалити. Отже, спочатку включимо бібліотеку в наш код і додамо наступні глобальні змінні:

#include <ArduinoJson.h>
#define RESPONSE_JSON_DATA_LINENNO 10
int charIndex=0;
StaticJsonBuffer<200> jsonbuffer;

Тепер, у методі
read_response()
, напишемо наступне:

void read_response()
{
boolean bodyStarted;
int jsonStringLength;
int jsonBufferCntr=0;
int numline=RESPONSE_JSON_DATA_LINENNO;
//У всьому відповіді нам цікава лише десята рядок
while (client.available()) 
{
//Serial.println("Reading:");
char c = client.read(); 
if (c == '\n')
{
numline -=1;
}
else 
{
if (numline == 0 && (c!='[')&& (c!=']') )
{
buffer[jsonBufferCntr++] = c; 
buffer[jsonBufferCntr] = '\0'; 
}
}
}
Serial.println("Received:");
Serial.println(buffer);
Serial.println("");
parse();
}

Вищенаведений код виконує читання відповіді. Метод
parse
відповідальний за розбір рядка. Ось код цього методу. Тут ми змінюємо стан виводу PIN 13 на платі у відповідності з отриманими даними.

void parse()
{
StaticJsonBuffer<150> jsonbuffer;
JsonObject& root = jsonbuffer.parseObject(buffer);
if(!root.success())
{
Serial.println("PARSING FAILED!!!");
return;
}
int f= root["status"];
Serial.println("Decoded: ");
Serial.println(f);
if(f==0)
digitalWrite(13,LOW);
else
digitalWrite(13,HIGH);
}

У цьому коді мінлива
f
зберігає значення атрибута status. Ми це значення перевіряємо і, в залежності від того, 0 або 1 опиниться в змінної, переводимо вихід на платі в стан HIGH або LOW. Нам залишилося розглянути код лише одного методу,
end_request()
. Ось він.

void end_request()
{
client.stop();
}

Цілком ймовірно, що після компіляції цієї програми ви зіткнетеся з несподіваними помилками. З ними треба розібратися. Причина помилок описана тут. Справа в тому, що у файлі WString.h відсутній деякий необхідний код. Тут можна оцінити відмінності правильного і неправильного файлів. Робочий файл потрібно помістити по такому шляху:

C:\Users\Username\AppData\Roaming\Arduino15\packages\Intel\hardware\i686\1.6.2+1.0\cores\arduino\WString.h

Після цього помилки зникнуть, можна буде домогтися правильної компіляції коду і прошити його на Edison. Тепер підключіть до плати світлодіод, приєднавши більш довгу ніжку (сюди так само можна додати резистор на 233 Ом) до PIN 13, а коротке – до GND. Тепер система, складається з плати Intel Edison, хмарної служби Microsoft Azure та Windows Phone, готова до випробування.

Нагадаємо: ми збираємося керувати світлодіодом, підключеним до Edison, з допомогою пристрої на Windows Phone, користуючись для цього хмарним сервісом Azure, який є сполучною ланкою проекту. Погляньте на вікно з налагоджувальною інформацією, яка надходить від Edison. Перша стадія роботи – спроба підключення до Wi-Fi-мережі.


Edison підключається до Wi-Fi мережі

Наступний крок – підключення до мобільного сервісу Azure. Після підключення Edison завантажує дані в форматі JSON, потім здійснюється їх розбір з використанням відповідної бібліотеки, з даних витягується зацікавив нас показник. Світлодіод, підключений до PIN 13, включається або вимикається у відповідності зі значенням цього показника.


Intel Edison підключився до хмари і отримав дані

Підсумки
З цього матеріалу ви дізналися про те, як організувати управління платою Intel Edison з використанням мобільних сервісів Microsoft Azure. У нашому випадку мобільний сервіс – це сполучна ланка. Він дозволяє взаємодіяти з додатком, запущеного на Windows Phone, і платі Intel Edison. Робиться це завдяки тому, що додаток, що працює на смартфоні, записує дані в таблицю, а Edison зчитує ці дані і відповідним чином реагує на них.

У нашому проекті все влаштовано дуже просто: світлодіод загоряється або гасне у відповідь на натискання екранної кнопки. Але нескладно помітити, що по такій ж моделі можна реалізувати і набагато більш складні схеми взаємодії підключених до інтернету інтелектуальних речей «і модулів для управління ними.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.