ESP8266 NodeMCU HTTP POST с Arduino IDE (ThingSpeak и IFTTT.com)

В этом руководстве вы узнаете, как выполнять HTTP POST запросы с помощью платы ESP8266 NodeMCU в Arduino IDE. Мы покажем, как отправлять данные в формате JSON или URL-encoded значения на два веб-API (ThingSpeak и IFTTT.com).

ESP8266 NodeMCU HTTP POST с Arduino IDE IFTTT ThingSpeak

Рекомендуется: ESP8266 NodeMCU HTTP GET с Arduino IDE (OpenWeatherMap.org и ThingSpeak)

Метод HTTP POST запроса

Протокол передачи гипертекста (HTTP) работает как протокол запрос-ответ между клиентом и сервером. Вот пример:

  • ESP8266 (клиент) отправляет HTTP-запрос на сервер (например: ThingSpeak или IFTTT.com);

  • Сервер возвращает ответ ESP8266 (клиенту);

  • Наконец, ответ содержит информацию о статусе запроса и может также содержать запрошенный контент.

HTTP POST

POST используется для отправки данных на сервер для создания/обновления ресурса. Например, публикация показаний датчиков на сервер.

Данные, отправленные на сервер с помощью POST, хранятся в теле HTTP-запроса:

POST /update HTTP/1.1
Host: example.com
api_key=api&field1=value1
Content-Type: application/x-www-form-urlencoded

В теле запроса вы также можете отправить JSON-объект:

POST /update HTTP/1.1
Host: example.com
{api_key: "api", field1: value1}
Content-Type: application/json

(При использовании HTTP POST данные не видны в URL запроса. Однако, если они не зашифрованы, они все еще видны в теле запроса.)

Предварительные требования

Перед тем как продолжить это руководство, убедитесь, что вы выполнили следующие предварительные требования.

Arduino IDE

Мы будем программировать ESP8266 NodeMCU с помощью Arduino IDE, поэтому убедитесь, что у вас установлено дополнение ESP8266.

Другие веб-сервисы или API

В этом руководстве вы узнаете, как настроить плату ESP8266 NodeMCU для выполнения HTTP-запросов к ThingSpeak и IFTTT.com. Если вы предпочитаете работать с локальным решением, вы можете использовать HTTP с Node-RED. Все примеры, представленные в этом руководстве, также работают с другими API.

В общих чертах, чтобы адаптировать это руководство для любого сервиса, вам нужно найти документацию API сервиса. Затем вам понадобится имя сервера (URL или IP-адрес) и параметры для отправки в запросе (URL-путь или тело запроса). Наконец, измените наши примеры для интеграции с любым API, которое вы хотите использовать.

1. ESP8266 HTTP POST данные (ThingSpeak)

В этом примере ESP8266 выполняет HTTP POST запрос для отправки нового значения на ThingSpeak.

HTTP POST ThingSpeak ESP8266 NodeMCU

Использование ThingSpeak API

ThingSpeak имеет бесплатный API, который позволяет хранить и извлекать данные с помощью HTTP. В этом руководстве вы будете использовать ThingSpeak API для публикации и визуализации данных в графиках из любого места. В качестве примера мы будем публиковать случайные значения, но в реальном приложении вы бы использовали реальные показания датчиков.

Чтобы использовать ThingSpeak API, вам нужен API-ключ. Выполните следующие шаги:

  1. Перейдите на ThingSpeak.com и создайте бесплатный аккаунт.

  2. Затем откройте вкладку Channels.

  3. Создайте New Channel (Новый канал).

ESP32 ESP8266 NodeMCU ThingSpeak создание нового канала
  1. Откройте ваш только что созданный канал и выберите вкладку API Keys, чтобы скопировать ваш Write API Key.

ESP32 ESP8266 NodeMCU ThingSpeak просмотр API Key Write Copy

Код ESP8266 HTTP POST ThingSpeak

Скопируйте следующий скетч в вашу Arduino IDE:

/*
  Rui Santos
  Complete project details at Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-http-post-ifttt-thingspeak-arduino/

  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

  Code compatible with ESP8266 Boards Version 3.0.0 or above
  (see in Tools > Boards > Boards Manager > ESP8266)
*/

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

// Domain Name with full URL Path for HTTP POST Request
const char* serverName = "http://api.thingspeak.com/update";
// Service API Key
String apiKey = "7HQJM49R8JAPR";

// THE DEFAULT TIMER IS SET TO 10 SECONDS FOR TESTING PURPOSES
// For a final application, check the API call limits per hour/minute to avoid getting blocked/banned
unsigned long lastTime = 0;
// Set timer to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Timer set to 10 seconds (10000)
unsigned long timerDelay = 10000;

void setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());

  Serial.println("Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.");

  // Random seed is a number used to initialize a pseudorandom number generator
  randomSeed(analogRead(0));
}

void loop() {
  //Send an HTTP POST request every 10 seconds
  if ((millis() - lastTime) > timerDelay) {
    //Check WiFi connection status
    if(WiFi.status()== WL_CONNECTED){
      WiFiClient client;
      HTTPClient http;

      // Your Domain name with URL path or IP address with path
      http.begin(client, serverName);

      // Specify content-type header
      http.addHeader("Content-Type", "application/x-www-form-urlencoded");
      // Data to send with HTTP POST
      String httpRequestData = "api_key=" + apiKey + "&field1=" + String(random(40));
      // Send HTTP POST request
      int httpResponseCode = http.POST(httpRequestData);

      /*
      // If you need an HTTP request with a content type: application/json, use the following:
      http.addHeader("Content-Type", "application/json");
      // JSON data to send with HTTP POST
      String httpRequestData = "{\"api_key\":\"" + apiKey + "\",\"field1\":\"" + String(random(40)) + "\"}";
      // Send HTTP POST request
      int httpResponseCode = http.POST(httpRequestData);*/

      Serial.print("HTTP Response code: ");
      Serial.println(httpResponseCode);

      // Free resources
      http.end();
    }
    else {
      Serial.println("WiFi Disconnected");
    }
    lastTime = millis();
  }
}

Просмотреть исходный код

Настройка сетевых учетных данных

Измените следующие строки, указав ваши сетевые учетные данные: SSID и пароль. В коде есть комментарии, указывающие, где нужно внести изменения.

// Replace with your network credentials
const char* ssid     = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Настройка API-ключа

Измените переменную apiKey, чтобы включить ваш API-ключ ThingSpeak.

String apiKey = "REPLACE_WITH_YOUR_API_KEY";

Теперь загрузите код на вашу плату, и он должен сразу заработать. Прочитайте следующий раздел, если хотите узнать, как выполняется HTTP POST запрос.

HTTP POST запрос

В функции loop() выполняется HTTP POST запрос с URL-encoded данными каждые 10 секунд со случайными данными:

// Specify content-type header
http.addHeader("Content-Type", "application/x-www-form-urlencoded");

// Data to send with HTTP POST
String httpRequestData = "api_key=" + apiKey + "&field1=" + String(random(40));

// Send HTTP POST request
int httpResponseCode = http.POST(httpRequestData);

Например, ESP8266 выполняет URL-encoded запрос для публикации нового значения (30) в field1.

POST /update HTTP/1.1
Host: api.thingspeak.com
api_key=api&field1=30
Content-Type: application/x-www-form-urlencoded

Или вы можете раскомментировать следующие строки, чтобы выполнить запрос с данными в формате JSON (вместо URL-encoded запроса):

// If you need an HTTP request with a content type: application/json, use the following:
http.addHeader("Content-Type", "application/json");

// JSON data to send with HTTP POST
String httpRequestData = "{\"api_key\":\"" + apiKey + "\",\"field1\":\"" + String(random(40)) + "\"}";

// Send HTTP POST request
int httpResponseCode = http.POST(httpRequestData);

Вот пример HTTP POST запроса с JSON данными:

POST /update HTTP/1.1
Host: api.thingspeak.com
{api_key: "api", field1: 30}
Content-Type: application/json

Затем следующие строки выводят код ответа сервера.

Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);

В мониторе последовательного порта Arduino IDE вы должны увидеть код HTTP-ответа 200 (это означает, что запрос был успешным).

ESP32 ESP8266 NodeMCU HTTP POST Arduino IDE Serial Monitor Response

Ваша панель управления ThingSpeak должна получать новые случайные показания каждые 10 секунд.

ESP32 ESP8266 NodeMCU HTTP GET и HTTP POST с Arduino IDE ThingSpeak Chart

Для окончательного приложения вам может потребоваться увеличить таймер или проверить лимиты вызовов API в час/минуту, чтобы избежать блокировки/бана.

Примечание: для более простого способа отправки показаний датчиков на ThingSpeak с помощью ESP8266 мы рекомендуем следующее руководство:

2. ESP8266 HTTP POST (IFTTT.com)

В этом примере вы узнаете, как вызвать веб-API для отправки email-уведомлений. В качестве примера мы будем использовать API IFTTT.com. IFTTT имеет бесплатный план с множеством полезных автоматизаций.

HTTP POST IFTTT ESP8266 NodeMCU

Использование IFTTT.com Webhooks API

IFTTT расшифровывается как «If This Than That» (Если Это, То То), и это бесплатный веб-сервис для создания цепочек простых условных операторов, называемых апплетами.

IFTTT.com логотип

Это означает, что вы можете вызвать событие, когда что-то происходит. В этом примере апплет отправляет три случайных значения на вашу электронную почту, когда ESP8266 выполняет запрос. Вы можете заменить эти случайные значения полезными показаниями датчиков.

Создание аккаунта IFTTT

Если у вас нет аккаунта IFTTT, перейдите на сайт IFTTT: ifttt.com и введите свой email для создания аккаунта и начала работы. Создание аккаунта на IFTTT бесплатно!

Далее вам нужно создать новый апплет. Выполните следующие шаги для создания нового апплета:

  1. Откройте левое меню и нажмите кнопку «Create» (Создать).

IFTTT создание нового апплета
  1. Нажмите на слово «this». Найдите сервис «Webhooks» и выберите иконку Webhooks.

Выбор сервиса Webhooks IFTTT.com
  1. Выберите триггер «Receive a web request» (Получить веб-запрос) и дайте имя событию. В данном случае я ввел «test_event». Затем нажмите кнопку «Create trigger» (Создать триггер).

  2. Нажмите на слово «that», чтобы продолжить. Теперь определите, что происходит, когда срабатывает определенное вами событие. Найдите сервис «Email» и выберите его. Вы можете оставить параметры по умолчанию.

Выбор сервиса Email в IFTTT
  1. Нажмите кнопку «Finish» (Готово), чтобы создать ваш апплет.

Тестирование вашего апплета

Перед тем как продолжить проект, важно сначала протестировать ваш апплет. Выполните следующие шаги для тестирования:

  1. Найдите сервис Webhooks или откройте эту ссылку: https://ifttt.com/maker_webhooks

  2. Нажмите кнопку «Documentation» (Документация).

Документация Webhooks IFTTT

Появится страница с вашим уникальным API-ключом.

IFTTT API ключ

Сохраните ваш API-ключ, потому что он понадобится вам позже.

  1. Заполните раздел «To trigger an Event with 3 JSON values» именем события, созданного ранее, в нашем случае test_event. Добавьте произвольные значения в поля value1, value2 и value3. Затем нажмите кнопку «Test it» (Тестировать).

IFTTT Trigger an Event с 3 JSON значениями
  1. Событие должно быть успешно вызвано, и вы получите зеленое сообщение «Event has been triggered» (Событие было вызвано).

  2. Перейдите в свой аккаунт электронной почты. У вас должно быть новое письмо от сервиса IFTTT со значениями, которые вы определили на предыдущем шаге.

Если вы получили email с данными, введенными в тестовом запросе, это означает, что ваш апплет работает как ожидалось. Теперь нам нужно запрограммировать ESP8266 для отправки HTTP POST запроса на сервис IFTTT с показаниями датчиков.

Код ESP8266 HTTP POST Webhooks IFTTT.com

После установки необходимых дополнений для плат и библиотек, скопируйте следующий код в вашу Arduino IDE, но пока не загружайте его. Вам нужно внести некоторые изменения, чтобы он работал для вас.

/*
  Rui Santos
  Complete project details at Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-http-post-ifttt-thingspeak-arduino/

  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

  Code compatible with ESP8266 Boards Version 3.0.0 or above
  (see in Tools > Boards > Boards Manager > ESP8266)
*/

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

// Domain Name with full URL Path for HTTP POST Request
// REPLACE WITH YOUR EVENT NAME AND API KEY - open the documentation: https://ifttt.com/maker_webhooks
const char* serverName = "http://maker.ifttt.com/trigger/REPLACE_WITH_YOUR_EVENT/with/key/REPLACE_WITH_YOUR_API_KEY";
// Example:
//const char* serverName = "http://maker.ifttt.com/trigger/test_event/with/key/nAZjOphL3d-ZO4N3k64-1A7gTlNSrxMJdmqy3tC";

// THE DEFAULT TIMER IS SET TO 10 SECONDS FOR TESTING PURPOSES
// For a final application, check the API call limits per hour/minute to avoid getting blocked/banned
unsigned long lastTime = 0;
// Set timer to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Timer set to 10 seconds (10000)
unsigned long timerDelay = 10000;

void setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());

  Serial.println("Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.");

  // Random seed is a number used to initialize a pseudorandom number generator
  randomSeed(analogRead(0));
}

void loop() {
  // Send an HTTP POST request every 10 seconds
  if ((millis() - lastTime) > timerDelay) {
    //Check WiFi connection status
    if(WiFi.status()== WL_CONNECTED){
      WiFiClient client;
      HTTPClient http;

      // Your Domain name with URL path or IP address with path
      http.begin(client, serverName);

      // Specify content-type header
      http.addHeader("Content-Type", "application/x-www-form-urlencoded");
      // Data to send with HTTP POST
      String httpRequestData = "value1=" + String(random(40)) + "&value2=" + String(random(40))+ "&value3=" + String(random(40));
      // Send HTTP POST request
      int httpResponseCode = http.POST(httpRequestData);

      /*
      // If you need an HTTP request with a content type: application/json, use the following:
      http.addHeader("Content-Type", "application/json");
      // JSON data to send with HTTP POST
      String httpRequestData = "{\"value1\":\"" + String(random(40)) + "\",\"value2\":\"" + String(random(40)) + "\",\"value3\":\"" + String(random(40)) + "\"}";
      // Send HTTP POST request
      int httpResponseCode = http.POST(httpRequestData);
      */

      Serial.print("HTTP Response code: ");
      Serial.println(httpResponseCode);

      // Free resources
      http.end();
    }
    else {
      Serial.println("WiFi Disconnected");
    }
    lastTime = millis();
  }
}

Просмотреть исходный код

Настройка сетевых учетных данных

Измените следующие строки, указав ваши сетевые учетные данные: SSID и пароль. В коде есть комментарии, указывающие, где нужно внести изменения.

// Replace with your network credentials
const char* ssid     = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Настройка API-ключа IFTTT.com

Вставьте имя вашего события и API-ключ в следующую строку:

const char* serverName = "http://maker.ifttt.com/trigger/REPLACE_WITH_YOUR_EVENT/with/key/REPLACE_WITH_YOUR_API_KEY";

Пример URL:

const char* serverName = "http://maker.ifttt.com/trigger/test_event/with/key/nAZjOphL3d-ZO4N3k64-1A7gTlNSrxMJdmqy3t";

HTTP POST запрос

В функции loop() выполняется HTTP POST запрос каждые 10 секунд с примерными данными:

// Specify content-type header
http.addHeader("Content-Type", "application/x-www-form-urlencoded");

// Data to send with HTTP POST
String httpRequestData = "value1=" + String(random(40)) + "&value2=" + String(random(40))+ "&value3=" + String(random(40));

// Send HTTP POST request
int httpResponseCode = http.POST(httpRequestData);

ESP8266 выполняет новый URL-encoded запрос для публикации случайных значений в полях value1, value2 и value3. Например:

POST /trigger/test_event/with/key/nAZjOphL3d-ZO4N3k64-1A7gTlNSrxMJdmqy3tC HTTP/1.1
Host: maker.ifttt.com
value1=15&value2=11&value3=30
Content-Type: application/x-www-form-urlencoded

В качестве альтернативы вы можете раскомментировать следующие строки, чтобы выполнить запрос с данными в формате JSON:

// If you need an HTTP request with a content type: application/json, use the following:
http.addHeader("Content-Type", "application/json");

// JSON data to send with HTTP POST
String httpRequestData = "{\"value1\":\"" + String(random(40)) + "\",\"value2\":\"" + String(random(40)) + "\",\"value3\":\"" + String(random(40)) + "\"}";

// Send HTTP POST request
int httpResponseCode = http.POST(httpRequestData);

Вот пример HTTP POST запроса с JSON-объектом данных.

POST /trigger/test_event/with/key/nAZjOphL3d-ZO4N3k64-1A7gTlNSrxMJdmqy3tC HTTP/1.1
Host: maker.ifttt.com
{value1: 15, value2: 11, value3: 30}
Content-Type: application/json

Затем следующие строки кода выводят HTTP-ответ от сервера.

Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);

Демонстрация HTTP POST

После загрузки кода откройте монитор последовательного порта, и вы увидите сообщение с кодом HTTP-ответа 200, указывающим, что запрос был успешным.

ESP32 ESP8266 NodeMCU HTTP POST Arduino IDE Serial Monitor Response

Перейдите в свой аккаунт электронной почты, и вы должны получить новое письмо от IFTTT с тремя случайными значениями. В данном случае: 38, 20 и 13.

ESP32 ESP8266 NodeMCU HTTP POST Arduino IDE IFTTT Response

В демонстрационных целях мы публикуем новые данные каждые 10 секунд. Однако для долгосрочного проекта вам следует увеличить таймер или проверить лимиты вызовов API в час/минуту, чтобы избежать блокировки/бана.

Заключение

В этом руководстве вы узнали, как интегрировать ESP8266 с веб-сервисами, используя HTTP POST запросы. Вы также можете выполнять HTTP GET запросы с ESP8266.

Если вы используете плату ESP32, прочитайте:

Вам также может быть интересно: