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() {