ESP32 HTTP POST – Cách dùng trên IFTTT và ThingSpeak

Trong hướng dẫn chủ đề ESP32 HTTP POST này, chúng ta sẽ cùng tìm hiểu cách tạo các yêu cầu HTTP POST dựa trên mạch ESP32 và Arduino IDE. Cụ thể, chúng ta sẽ đăng dữ liệu JSON hoặc các giá trị được mã hóa URL khác lên 2 API Web nổi tiếng là IFTTT.com và ThingSpeak.

>> Bạn cần mua ESP32? Tham khảo ngay shop sản phẩm của IoTZone!

Cách tạo yêu cầu HTTP POST

HTTP (viết tắt của The Hypertext Transfer Protocol – Giao thức truyền siêu văn bản) hoạt động bằng cách đáp ứng yêu cầu giữa Server và Client. Ví dụ:

  • ESP32 Client (máy khách) gửi yêu cầu HTTP đến Server (máy chủ). Server này có thể là IFTTT.com hoặc là ThingSpeak.
  • Server gửi phản hồi về cho ESP32 Client. Trong phản hồi này có chứa các thông tin được yêu cầu hoặc có thông tin trạng thái cần thiết.

HTTP POST là gì?

POST là một phương thức dùng để gửi dữ liệu đến Server, nhằm tạo mới hoặc cập nhật tài nguyên đã có sẵn (Ví dụ: ESP32 HTTP POST gửi kết quả đọc được từ cảm biến lên máy chủ).

Dữ liệu được gửi đến Server thông qua POST sẽ được lưu trữ trong phần yêu cầu HTTP:

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

Trong yêu cầu này, bạn cũng có thể gửi một đối tượng JSON, ví dụ:

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

(Với HTTP POST, dữ liệu sẽ không hiển thị trong URL request. Tuy nhiên, nếu không được mã hóa, dữ liệu này vẫn sẽ hiển thị trong request body).

Các dịch vụ Web API

Trong ví dụ này, mình sẽ hướng dẫn bạn cách tạo ESP32 HTTP POST để gửi tới IFTTT.com và ThingSpeak. Các hướng dẫn bên dưới cũng tương thích với các API khác.

Tuy nhiên, để sử dụng hướng dẫn ESP32 HTTP POST này với các API khác, bạn cần tìm kiếm tài liệu liên quan đến API đó. Sau đó, bạn cần tên Server (địa chỉ IP hoặc địa chỉ URL) và các tham số để gửi yêu cầu (URL hoặc request body). Cuối cùng, chỉnh sửa hướng dẫn bên dưới để phù hợp với API bạn cần dùng.

ESP32 HTTP POST với ThingSpeak

Trong ví dụ này, ta sẽ dùng ESP32 để tạo yêu cầu HTTP POST và gửi giá trị đến ThingSpeak:

Tạo ESP32 HTTP POST với ThingSpeak

Lấy API ThingSpeak Key

Trong ThingSpeak có sẵn API miễn phí, cho phép chúng ta lưu trữ và truy xuất dữ liệu từ API. Nhờ API đó, chúng ta có thể xuất bản dữ liệu một cách trực quan hóa bằng biểu đồ từ mọi nơi.

Trong ví dụ dưới, IoTZone sẽ xuất ra một danh sách các số ngẫu nhiên. Nhưng trong thực tế với các dự án ESP32, bạn có thể xuất bản giá trị thực tế đọc được từ cảm biến chẳng hạn.

Để đọc API ThingSpeak, bạn cần lấy API key (khóa API) theo các bước sau:

1. Truy cập vào https://thingspeak.com/ và tạo tài khoản miễn phí.

2. Mở tab Channels

3. Tạo New Channel:

ESP32 HTTP POST với ThingSpeak

4. Mở Channel vừa tạo, chọn vào tab API Keys để copy Write API Key của bạn:

ESP32 HTTP POST với ThingSpeak

Chương trình mẫu cho ESP32

Copy đoạn code sau vào Arduino IDE và làm theo một số bước bên dưới để hoàn thành dự án ESP32 HTTP POST với ThingSpeak này:

#include <WiFi.h>
#include <HTTPClient.h>

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

// Tên Domain với full URL Path dùng cho yêu cầu HTTP POST
const char* serverName = "http://api.thingspeak.com/update";
// API Key
String apiKey = "REPLACE_WITH_YOUR_API_KEY";

// THỜI GIAN MẶC ĐỊNH ĐƯỢC CHỌN LÀ 10 GIÂY ĐỂ TESTING
// 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(33));
}

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();
  }
}

Thay đổi mạng WiFi của bạn: Thay thế SSID và password (tên và mật khẩu WiFi) thành mạng WiFi của bạn:

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

Setting your API Key: Chỉnh sửa thành API Key bạn đã lấy ở bước trước:

String apiKey = "REPLACE_WITH_YOUR_API_KEY";

Bây giờ, bạn hãy upload đoạn code trên vào ESP32 và chúng sẽ hoạt động.

Bên dưới, mình sẽ giải thích kỹ hơn về cách hoạt động của yêu cầu HTTP POST.

Yêu cầu HTTP POST

loop() đây là nơi để bạn tạo yêu cầu HTTP POST với URL encoded data mỗi 10 giây, với dữ liệu data là random:

// 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);

Ví dụ, ESP32 tạo một URL encoded request để xuất bản giá trị mới là 30 vào field1:

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

Hoặc là bạn cũng có thể uncomment dòng tiếp theo để tạo yêu cầu bằng dữ liệu JSON (thay vì URL encoded request như trên):

// 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);

Dưới đây là yêu cầu HTTP POST với dữ liệu JSON:

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

Dòng code bên dưới sẽ in ra giá trị phản hồi từ Server:

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

Nếu mở Serial Monitor trên Arduino IDE, bạn sẽ thấy mã phản hồi HTTP trả về là 200 (nghĩa là yêu cầu ESP32 HTTP POST đã thành công!):

Mã phản hồi ESP32 HTTP POST là 200 trên Serial Monitor

Sau khi nạp code ESP32 HTTP POST trên và chạy, trên bảng điều khiển ThingSpeak của bạn sẽ nhận được một con số mới cứ sau mỗi 10 giây:

Cách dùng ESP32 HTTP POST trên ThingSpeak

Hướng mở rộng: Dùng thêm bộ hẹn giờ hoặc giới hạn lệnh gọi API theo mỗi giờ / mỗi phút để tránh bị chặn.

ESP32 HTTP POST với IFTTT.com

Trong phần này, chúng ta sẽ tìm hiểu cách kích hoạt API để gửi thông báo qua Email. Mình sẽ hướng dẫn bạn thực hiện trên API IFTTT.com, đây là API có cung cấp gói miễn phí với nhiều tính năng tự động khá hay.

Giới thiệu ESP32 HTTP POST với IFTTT.com
Giới thiệu ESP32 HTTP POST với IFTTT.com

Cách dùng API Webhooks từ IFTTT.com

IFTTT là viết tắt của IF This Than That, chúng là một dịch vụ dựa trên Web miễn phí, cho phép tạo ra các câu lệnh điều kiện applet đơn giản. Điều này đồng nghĩa với việc bạn có thể kích hoạt một sự kiện khi có hoạt động nào đó xảy ra.

Trong ví dụ này, applet sẽ gửi 3 giá trị random đến email của bạn theo lệnh của ESP32. Trong dự án thực tế, bạn có thể thay thế số random này thành các giá trị đọc được từ cảm biến.

Trước khi bắt đầu đi vào phần code ESP32 HTTP POST, IoTZone sẽ hướng dẫn bạn cách tạo Applet IFTTT và kiểm tra Applet:

A. Tạo applet:

Truy cập vào Website https://ifttt.com/ và nhập email để tạo tài khoản miễn phí.

Sau đó, bạn cần tạo một applet mới theo các bước sau:

Mở meu bên trái, click vào Create:

Cách dùng API Webhooks từ IFTTT.com

2. Click vào “this”, tìm kiếm “webhooks” và chọn vào biểu tượng sau:

Cách dùng API Webhooks từ IFTTT.com

3. Click “Receive a web request” và đặt tên cho event. Trong ví dụ này, mình đặt tên là “tét_event” và click vào “Create trigger”.

4. Click “that” để tiếp tục, tìm kiếm “Email” và click vào nó:

Cách tạo apllet cho dự án ESP32 HTTP POST

5. Click Send me an email và để cài đặt như mặc định.

6. Click Create action để tạo Applet của bạn, sau đó click Continue >> Finish.

B. Kiểm tra Applet của bạn

Trước khi đi vào dự án ESP32 HTTP POST, bạn cần kiểm tra lại Applet của bạn xem chúng có ổn định không:

1. Tìm kiếm dịch vụ Webhooks hoặc mở link sau: https://ifttt.com/maker_webhooks

2. Click Documentation:

Kiểm tra Applet của bạn trước khi bắt đầu dự án ESP32 HTTP POST

Một page mới sẽ hiển thị API key duy nhất của bạn. Khi đó, bạn hãy lưu API Key để dùng cho các bước bên dưới.

3. Điền vào mục “To trigger an Event with 3 JSON values” với tên event đã đưuọc tạo trước đó, trong ví dụ của mình là test_event. Bạn hãy thêm vài giá trị ngẫu nhiên cho 3 cột value1, value2 value3. Sau đó, click vào Test it.

Kiểm tra Applet của bạn trước khi đi vào code ESP32 HTTP POST
Kiểm tra Applet của bạn trước khi đi vào code ESP32 HTTP POST

4. Event sẽ kích hoạt thành công, bạn nhận được thông báo màu xanh lục cho biết “Event has been triggered”.

5. Mở tài khoản Email, bạn sẽ nhận được email mới trong hộp thư inbox từ dịch vụ IFTTT với giá trị bạn đã nhập ở trên.

Nếu bạn đã nhận được email với giá trị đúng như đã nhập, điều đó đồng nghĩa Applet của bạn đã hoạt động tốt và sẵn sàng cho bước tạo ESP32 HTTP POST kế tiếp.

Code ESP32

Bạn copy đoạn code sau vào Arduino IDE, sau đó đổi thông tin WiFi thành của bạn và thay đổi API Key (có hướng dẫn chi tiết bên dưới):

#include <WiFi.h>
#include <HTTPClient.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(33));
}

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();
  }
}

Đổi mạng WiFi (gồm tên và mật khẩu) ở đoạn sau:

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

Thay đổi API Key:

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

URL mẫu:

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

Đến đây, bạn hãy upload code vào ESP32 và trải nghiệm nhé!

Lời kết

Trong dự án ESP32 HTTP POST này, chúng ta đã tích hợp ESP32 với dịch vụ Web sử dụng yêu cầu HTTP POST. Chúc bạn thành công!

IoTZone – Chuyên cung cấp thiết bị điện tử & tài liệu cho Makers

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *