Освой Arduino играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
GET-запрос к странице сайта
Узнаём погоду через OpenWeatherMap
Пингуем сервер
Плата ESP32 может работать как веб-клиент и подключаться к указанным веб-адресам. Таким образом мы получаем своеобразный текстовый браузер. В скетче не подключал библиотеку WiFi.h, однако код компилировался. Но лучше добавить библиотеку, чтобы быть уверенным в коде.
// Подключаем библиотеку для работы с HTTP-протоколом
#include <HTTPClient.h>
// Вводим имя и пароль точки доступа
const char* ssid = "your_ssid";
const char* password = "your_password";
void setup() {
Serial.begin(115200);
// делаем небольшую задержку на открытие монитора порта
delay(5000);
// подключаемся к Wi-Fi сети
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Соединяемся с Wi-Fi..");
}
Serial.println("Соединение с Wi-Fi установлено");
}
void loop() {
// выполняем проверку подключения к беспроводной сети
if ((WiFi.status() == WL_CONNECTED)) {
// создаем объект для работы с HTTP
HTTPClient http;
// подключаемся к веб-странице
http.begin("http://developer.alexanderklimov.ru/arduino/");
// делаем GET запрос
int httpCode = http.GET();
// проверяем успешность запроса
if (httpCode > 0) {
// выводим ответ сервера
String payload = http.getString();
Serial.println(httpCode);
Serial.println(payload);
}
else {
Serial.println("Ошибка HTTP-запроса");
}
// освобождаем ресурсы микроконтроллера
http.end();
}
delay(10000);
}
Открываем Serial Monitor и смотрим содержимое указанной страницы.
В примере использовался простой GET-запрос.
Сервис OpenWeatherMap предоставляет данные о погода в указанном городе. Для начала вам нужно зарегистрироваться и получить ключ, который будет добавляться в запрос.
Чтобы убедиться, что всё работает, попробуйте сначала сделать запрос через обычный браузер на компьютере - http://api.openweathermap.org/data/2.5/weather?q=Moscow,ru,pt&APPID=ваш_ключ (Погода в Москве).
Остальной код ничем не отличается от обычного запроса к странице. Только вместо HTML-страницы мы получим сообщение в JSON-формате.
#include <WiFi.h>
#include <HTTPClient.h>
// Вводим имя и пароль точки доступа
const char* ssid = "your_ssid";
const char* password = "your_password";
const String endpoint = "http://api.openweathermap.org/data/2.5/weather?q=Moscow,ru,pt&APPID=";
const String key = "yourAPIkey";
void setup() {
Serial.begin(115200);
// делаем небольшую задержку на открытие монитора порта
delay(5000);
// подключаемся к Wi-Fi сети
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Соединяемся с Wi-Fi..");
}
Serial.println("Соединение с Wi-Fi установлено");
}
void loop() {
// выполняем проверку подключения к беспроводной сети
if ((WiFi.status() == WL_CONNECTED)) { //Check the current connection status
// создаем объект для работы с HTTP
HTTPClient http;
// подключаемся к веб-странице OpenWeatherMap с указанными параметрами
http.begin(endpoint + key);
int httpCode = http.GET(); // Делаем запрос
// проверяем успешность запроса
if (httpCode > 0) { //Check for the returning code
// выводим ответ сервера
String payload = http.getString();
Serial.println(httpCode);
Serial.println(payload);
}
else {
Serial.println("Ошибка HTTP-запроса");
}
http.end(); // освобождаем ресурсы микроконтроллера
}
delay(30000);
}
Ответ будет приблизительно таким (строка разбита на подстроки для удобного чтения)
Connecting to WiFi..
Connected to the WiFi network
200
{
"coord":{
"lon":37.62,
"lat":55.75
},
"weather":[
{
"id":804,
"main":"Clouds",
"description":"overcast clouds",
"icon":"04n"
}
],
"base":"stations",
"main":{
"temp":272.13,
"feels_like":265.49,
"temp_min":272.04,
"temp_max":272.15,
"pressure":1021,
"humidity":46
},
"visibility":10000,
"wind":{
"speed":5,
"deg":50
},
"clouds":{
"all":100
},
"dt":1584808896,
"sys":{
"type":1,
"id":9029,
"country":"RU",
"sunrise":1584761309,
"sunset":1584805482
},
"timezone":10800,
"id":524901,
"name":"Moscow",
"cod":200
}
Сырая строка JSON-ответа не слишком удобна для обработки информации. JSON-текст следует распарсить. А поможет в этом библиотека ArduinoJson.
После установки библиотеки изменим код скетча. Допустим, нас интересует только три параметра: город, часовой пояс и влажность.
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
// Вводим имя и пароль точки доступа
const char* ssid = "your_ssid";
const char* password = "your_password";
const String endpoint = "http://api.openweathermap.org/data/2.5/weather?q=Moscow,ru,pt&APPID=";
const String key = "yourAPIkey";
void handleReceivedMessage(String message) {
StaticJsonDocument<1500> doc; //Memory pool. Поставил наугад для демонстрации
DeserializationError error = deserializeJson(doc, message);
// Test if parsing succeeds.
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.c_str());
return;
}
Serial.println();
Serial.println("----- DATA FROM OPENWEATHER ----");
const char* name = doc["name"];
Serial.print("City: ");
Serial.println(name);
int timezone = doc["timezone"];
Serial.print("Timezone: ");
Serial.println(timezone);
int humidity = doc["main"]["humidity"];
Serial.print("Humidity: ");
Serial.println(humidity);
Serial.println("------------------------------");
}
void setup() {
Serial.begin(115200);
// делаем небольшую задержку на открытие монитора порта
delay(5000);
// подключаемся к Wi-Fi сети
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Соединяемся с Wi-Fi..");
}
Serial.println("Соединение с Wi-Fi установлено");
}
void loop() {
// выполняем проверку подключения к беспроводной сети
if ((WiFi.status() == WL_CONNECTED)) { //Check the current connection status
// создаем объект для работы с HTTP
HTTPClient http;
// подключаемся к веб-странице OpenWeatherMap с указанными параметрами
http.begin(endpoint + key);
int httpCode = http.GET(); // Делаем запрос
// проверяем успешность запроса
if (httpCode > 0) { //Check for the returning code
// выводим ответ сервера
String payload = http.getString();
Serial.println(httpCode);
//Serial.println(payload);
handleReceivedMessage(payload);
}
else {
Serial.println("Ошибка HTTP-запроса");
}
http.end(); // освобождаем ресурсы микроконтроллера
}
delay(30000);
}
Ответ теперь будет гораздо красивее.
Соединяемся с Wi-Fi..
Соединение с Wi-Fi установлено
200
----- DATA FROM OPENWEATHER ----
City: Moscow
Timezone: 10800
Humidity: 82
------------------------------
С помощью библиотеки ESP32Ping можно сделать пинг по интересующему нас адресу и проверить доступность сервера. Библиотека не доступна через менеджер библиотек, поэтому следует скачать архив и сохранить в папке с именем ESP32Ping в папке C:\Users\user name\Documents\Arduino\libraries (у вас может быть другой путь).
#include <WiFi.h>
#include <ESP32Ping.h>
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPass";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi...");
}
bool success = Ping.ping("developer.alexanderklimov.ru", 3);
if (!success) {
Serial.println("Ping failed");
return;
}
Serial.println("Ping succesful.");
}
void loop() { }
M5Stack. NTP-сервис точного времени