setup() {

Serial.begin(115200);

while (WiFi.status() != WL_CONNECTED) {

delay(1000);

Serial.print(".");

WiFi.begin(ssid, password);

}

Serial.println("WiFi connected!");

Serial.print("IP address: ");

Serial.println(WiFi.localIP());

// Настройки службы времени

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

}

void loop() {

// Получение времени

struct tm timeinfo;

if (!getLocalTime(&timeinfo)){

Serial.println("getLocalTime: error");

delay(10000);

return;

}

Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");

delay(30000);

}

Как можно видеть, мы добавили вызов двух функций: configTime и getLocalTime. Первая функция настраивает нужные параметры (например часовой пояс), вторая получает время. Кстати, само время хранится в структуре tm, которая хранится в файле time.h и имеет следующий вид:

struct tm {

int tm_sec; // Seconds after the minute [0, 59]

int tm_min; // Minutes after the hour [0, 59]

int tm_hour; // Hours since midnight [0, 23]

int tm_mday; // Day of the month [1, 31]

int tm_mon; // Months since January [0, 11]

int tm_year; // Years since 1900

int tm_wday; // Days since Sunday [0, 6]

int tm_yday; // Days since January 1 [0, 365]

int tm_isdst; // Daylight Saving Time flag

int tm_gmtoff; // Seconds east of UTC

char *tm_zone; // Timezone abbreviation

};

Все эти поля можно использовать. Например, можно зажечь светодиод (или запустить зуммер) в 8 часов утра:

if (timeinfo.tm_hour == 8 && timeinfo.tm_min == 0) {

...

}

Мы также используем строку “%A, %B %d %Y %H:%M:%S”, которая указывает в каком формате выводить дату и время. Например, чтобы вывести только время, достаточно написать “%H:%M:%S”. Список разных форматов можно найти здесь.

Запустим программу, и в Serial Monitor увидим на экране точное время.

Самостоятельная работа: вывести точное время на экран дисплея.

3.6 Выводим количество друзей в “Контакте”

Продолжим углубляться в тонкости Web. На этот раз мы выведем количество друзей “ВКонтакте” для заданного пользователя. Подобная задача довольно часто встречается в профессиональном программировании, когда нужно получить и отобразить данные с какого-то сайта. Поэтому рассмотрим подробнее, как это делается.

Шаг-1. Находим, как получить список друзей

Каждый крупный сайт имеет так называемый “интерфейс разработчика”, или API - Application Program Interface, набор функций, доступный программистам для доступа к данным. Набираем в гугле “vk.com get friends API” (международным языком в программировании является английский), и первая же ссылка возвращает нам нужную страницу с описанием параметров: https://vk.com/dev/friends.get.

Еще немного ищем в интернете примеры использования, и в итоге получаем, что нам нужно выполнить такой запрос: https://api.vk.com/method/friends.get?user_id=ID, где ID - это идентификатор пользователя, который можно посмотреть в подсказке к ссылке на каждой странице. Берем первый попавшийся идентификатор, например 29744451, и открываем ссылку https://api.vk.com/method/friends.get?user_id=29744451 в браузере.

Работает! Мы получили страницу, которая выглядит примерно так:

Данный ответ сервера представляет собой список идентификаторов друзей пользователей в формате Json. Это текстовый формат, для чтения которого есть специальные библиотеки. Но сначала нужно загрузить сами данные.

Шаг-2. Получение данных с сервера.

Для получения данных в Arduino есть специальный класс HTTPClient.

Код для загрузки данных выглядит так:

const char *url = "https://api.vk.com/method/friends.get?user_id=29744451";

HTTPClient http;

http.begin(url);

int http_code = http.GET();

if (http_code > 0) {

String json = http.getString();

...

}

Можно вывести данные в serial port и убедиться, что возвращается правильный список друзей. Он должен выглядеть также, как и в браузере по ссылке выше.

Шаг-3. Обработка данных

Нам не нужен весь список целиком, достаточно лишь узнать количество друзей. Для этого используем библиотеку обработки (парсинга) Json, скачать которую можно по ссылке https://github.com/bblanchon/ArduinoJson. Как обычно, файлы необходимо скачать и распаковать в папку Документы\Arduino\libraries.

Чтение данных из массива и получение его количества с помощью этой библиотеки выглядит так.

DynamicJsonBuffer jsonBuffer(16*1024);

JsonObject& parsed = jsonBuffer.parseObject(json);

if (parsed.success()) {

JsonArray& response = parsed["response"];

int count = response.size();

Serial.print("Number of friends: ");

Serial.println(count);

} else {

Serial.println("Parsing error");

}

Как можно видеть, мы получаем объект типа JsonArray, у которого узнаем размер вызовом метода size(). Также мы создаем объект DynamicJsonBuffer для хранения распакованных данных, при этом выделяется 16Кб памяти для временного буфера в памяти.

Результат готов! Мы получили данные в виде переменной count, теперь мы можем вывести данные в serial port.

Код программы полностью выглядит так.

#include <WiFi.h>

#include <HTTPClient.h>

#include <ArduinoJson.h>

const char* ssid = "TP-LINK_AB11";

const char* password = "12345678";

void setup() {

Serial.begin(115200);

Serial.print("Connecting to ");

Serial.println(ssid);

while (WiFi.status() != WL_CONNECTED) {

delay(1000);

Serial.print(".");

WiFi.begin(ssid, password);

}

Serial.println("");

Serial.println("WiFi connected!");

}

void loop() {

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату