Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

ESP32: Веб-клиент

GET-запрос к странице сайта
Узнаём погоду через OpenWeatherMap
Пингуем сервер

GET-запрос к странице сайта

Плата 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

Сервис 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-сервис точного времени

Реклама