ESP32 Rest API Web Server GET và POST Ví dụ với API Postman

ESP32 Rest API Web Server GET và POST Ví dụ với API Postman

Sơ đồ mạch REST API Web Server ESP32

Trong phần này, chúng tôi sẽ kết nối bảng ESP32 với cảm biến BME280 và đèn LED RGB để tiến hành dự án của chúng tôi.

Việc kết nối BME280 với bo mạch ESP32 rất dễ dàng. Chúng ta phải kết nối thiết bị đầu cuối VCC với 3.3V, nối đất với mặt đất (mặt bằng chung), SCL của cảm biến với SCL của mô-đun và SDA của cảm biến với chân SDA của các mô-đun ESP.

Chân I2C trong ESP32 cho SDA là GPIO21 và cho SCL là GPIO22

BME280 ·

ESP32 ·

VCC

3.3V

GND ·

GND ·

SCL

GPIO22 ·

SDA

GPIO21 ·

ESP32 với Mô-đun LED RGB (Cực âm chung)

Chúng tôi đang sử dụng mô-đun LED RGB catốt phổ biến cho dự án này. Bảng dưới đây cho thấy các kết nối chúng tôi đang sử dụng giữa mô-đun LED và ESP32.

Mô-đun LED RGB

ESP32 ·

R

GPIO5 ·

G

GPIO18 ·

B

GPIO19 ·

GND ·

Các chân màu đỏ, xanh lá cây và xanh lam của mô-đun LED RGB sẽ được kết nối với các chân GPIO của bảng ESP32. Chúng tôi sẽ sử dụng GPIO, GPIO và GPIO để kết nối với từng chân màu. Bạn có thể sử dụng bất kỳ mã pin GPIO thích hợp nào.

Sơ đồ 

Thực hiện theo sơ đồ bên dưới và kết nối ba thiết bị cho phù hợp.

Tất cả các kết nối giữa các thiết bị đều giống như chúng tôi đã liệt kê chúng trong các bảng trên.

ESP32 với sơ đồ kết nối BME280 và RGB LED

ESP32 với BME280 và RGB LED

Cài đặt Thư viện ArduinoJSON

Bạn sẽ phải cài đặt thư viện ArduinoJSON của Benoit Blanchon vì chúng ta sẽ xử lý tập lệnh JSON. Mở Trình quản lý thư viện Arduino của bạn bằng cách nhấp vào Phác thảo > Bao gồm thư viện > Quản lý thư viện. Nhập 'ArduinoJSON' vào tab tìm kiếm và nhấn enter. Cài đặt phiên bản thư viện 6.17.2 được đánh dấu bên dưới.

Cài đặt thư viện ArduinoJSON phiên bản 6.17.2

ESP32 Phần còn lại API Web Server Arduino Sketch

ESP32 (client) của chúng ta sẽ thực hiện một HTTP GET request tới máy chủ API. Để phản hồi, chúng ta sẽ nhận được một chuỗi bao gồm đối tượng JSON với các chi tiết liên quan đến dữ liệu cảm biến BME280. Tương tự như vậy, để điều khiển đèn LED RGB, máy khách sẽ gửi một chuỗi bao gồm các đối tượng JSON với các chi tiết liên quan đến các giá trị RGB đến ESP32.

Mở Arduino IDE của bạn và đi tới Tệp > Mới để mở tệp mới. Sao chép mã được cung cấp bên dưới trong tệp đó. Để mã này hoạt động với bảng ESP32 của bạn, bạn sẽ phải thay thế thông tin đăng nhập mạng Wi-Fi.

#include <Arduino.h>

#include <WiFi.h>

#include <WebServer.h>

#include <ArduinoJson.h>

#include <FreeRTOS.h>

#include <Adafruit_BME280.h>

#include <Adafruit_Sensor.h>

 

const char *SSID = "YOUR_SSID";

const char *PWD = "YOUR_PASSWORD";

 

const int red_pin = 5;   

const int green_pin = 18; 

const int blue_pin = 19; 

 

// Setting PWM frequency, channels and bit resolution

const int frequency = 5000;

const int redChannel = 0;

const int greenChannel = 1;

const int blueChannel = 2;

const int resolution = 8;

 

WebServer server(80);

 

Adafruit_BME280 bme;

 

StaticJsonDocument<250> jsonDocument;

char buffer[250];

 

float temperature;

float humidity;

float pressure;

 

void setup_routing() {     

  server.on("/temperature", getTemperature);     

  server.on("/pressure", getPressure);     

  server.on("/humidity", getHumidity);     

  server.on("/data", getData);     

  server.on("/led", HTTP_POST, handlePost);    

          

  server.begin();    

}

 

void create_json(char *tag, float value, char *unit) {  

  jsonDocument.clear();  

  jsonDocument["type"] = tag;

  jsonDocument["value"] = value;

  jsonDocument["unit"] = unit;

  serializeJson(jsonDocument, buffer);

}

 

void add_json_object(char *tag, float value, char *unit) {

  JsonObject obj = jsonDocument.createNestedObject();

  obj["type"] = tag;

  obj["value"] = value;

  obj["unit"] = unit; 

}

 

void read_sensor_data(void * parameter) {

   for (;;) {

     temperature = bme.readTemperature();

     humidity = bme.readHumidity();

     pressure = bme.readPressure() / 100;

     Serial.println("Read sensor data");

 

     vTaskDelay(60000 / portTICK_PERIOD_MS);

   }

}

 

void getTemperature() {

  Serial.println("Get temperature");

  create_json("temperature", temperature, "°C");

  server.send(200, "application/json", buffer);

}

 

void getHumidity() {

  Serial.println("Get humidity");

  create_json("humidity", humidity, "%");

  server.send(200, "application/json", buffer);

}

 

void getPressure() {

  Serial.println("Get pressure");

  create_json("pressure", pressure, "hPa");

  server.send(200, "application/json", buffer);

}

 

void getData() {

  Serial.println("Get BME280 Sensor Data");

  jsonDocument.clear();

  add_json_object("temperature", temperature, "°C");

  add_json_object("humidity", humidity, "%");

  add_json_object("pressure", pressure, "hPa");

  serializeJson(jsonDocument, buffer);

  server.send(200, "application/json", buffer);

}

 

void handlePost() {

  if (server.hasArg("plain") == false) {

  }

  String body = server.arg("plain");

  deserializeJson(jsonDocument, body);

 

  int red_value = jsonDocument["red"];

  int green_value = jsonDocument["green"];

  int blue_value = jsonDocument["blue"];

 

  ledcWrite(redChannel, red_value);

  ledcWrite(greenChannel,green_value);

  ledcWrite(blueChannel, blue_value);

 

  server.send(200, "application/json", "{}");

}

 

void setup_task() {    

  xTaskCreate(     

  read_sensor_data,      

  "Read sensor data",      

  1000,      

  NULL,      

  1,     

  NULL     

  );     

}

 

void setup() {     

  Serial.begin(115200); 

 

  ledcSetup(redChannel, frequency, resolution);

  ledcSetup(greenChannel, frequency, resolution);

  ledcSetup(blueChannel, frequency, resolution);

 

  ledcAttachPin(red_pin, redChannel);

  ledcAttachPin(green_pin, greenChannel);

  ledcAttachPin(blue_pin, blueChannel);

         

  if (!bme.begin(0x76)) {    

    Serial.println("BME280 not found! Check Circuit");    

  }    

 

  Serial.print("Connecting to Wi-Fi");

  WiFi.begin(SSID, PWD);

  while (WiFi.status() != WL_CONNECTED) {

    Serial.print(".");

    delay(500);

  }

 

  Serial.print("Connected! IP Address: ");

  Serial.println(WiFi.localIP());

  setup_task();    

  setup_routing();     

   

}    

       

void loop() {    

  server.handleClient();     

}

Mã hoạt động như thế nào?

Bây giờ, chúng ta hãy hiểu cách thức hoạt động của từng phần của code.

Nhập thư viện

Đầu tiên, chúng tôi sẽ nhập các thư viện liên quan cần thiết cho dự án này.
Thư viện WiFi.h được sử dụng để kết nối mô-đun ESP32 của chúng tôi với mạng WIFI cục bộ. Các thư viện Adafruit_Sensor và Adafruit_BME280 mà chúng tôi đã cài đặt trước đó cũng được bao gồm vì chúng cần thiết vì chúng tôi phải giao diện cảm biến với ESP32. ArduinoJSON.h sẽ được sử dụng cho tập lệnh JSON.

#include <Arduino.h>

#include <WiFi.h>

#include <WebServer.h>

#include <ArduinoJson.h>

#include <FreeRTOS.h>

#include <Adafruit_BME280.h>

#include <Adafruit_Sensor.h>

Đối tượng WebServer sẽ được sử dụng để thiết lập máy chủ web ESP32. Chúng ta sẽ truyền cổng HTTP mặc định là 80, làm đầu vào cho hàm xây dựng. Đây sẽ là cổng nơi máy chủ sẽ lắng nghe các yêu cầu.

 

WebServer server(80);

Sau đó, chúng ta định nghĩa đối tượng Adafruit_BME280 có tên bme bằng cách đặt nó trên các chân I2C GPIO mặc định của ESP32.

Adafruit_BME280 bme;

Ba biến phao sau đây sẽ lưu trữ các chỉ số nhiệt độ, độ ẩm và áp suất thu được từ cảm biến BME280.

float temperature;

float humidity;

float pressure;

Thông số LED RGB

Các dòng sau chỉ định các chân GPIO của ESP32 được kết nối với từng chân màu của đèn LED RGB. Ở đây chúng ta đang sử dụng các chân GPIO tương tự như được hiển thị trong sơ đồ sơ đồ ở trên. Bạn có thể sử dụng bất kỳ chân đầu ra phù hợp nào của ESP32.

const int red_pin = 5;   

const int green_pin = 18; 

const int blue_pin = 19; 

Các biến sau xác định tần số PWM, kênh và độ phân giải bit. Độ sáng của đèn LED sẽ được kiểm soát thông qua chu kỳ làm việc. Khi chúng tôi xác định các thông số PWM cho mỗi đèn LED, nó bao gồm tần số của tín hiệu, kênh led và độ phân giải. Chúng tôi đã đặt tần số ở 5000 Hz. Để xác định kênh PWM, chúng ta có thể chọn giữa tổng cộng mười sáu kênh PWM trong ESP32. Bạn có thể sử dụng bất kỳ kênh nào từ 0-15. Chúng tôi đã đặt kênh PWM thành 0, 1, 2 cho ba đèn LED tương ứng. Ngoài ra, chúng tôi đã đặt độ phân giải PWM thành 8 bit vì đây là độ phân giải tối ưu để có được tần số tối đa. Mặc dù bạn có thể sử dụng độ phân giải từ 1-16 bit. Vì chúng tôi đang sử dụng độ phân giải 8 bit, do đó giá trị chu kỳ nhiệm vụ sẽ thay đổi trong khoảng 0-255 mà chúng tôi sẽ ánh xạ đến 0-100%.

// Setting PWM frequency, channels and bit resolution

const int frequency = 5000;

const int redChannel = 0;

const int greenChannel = 1;

const int blueChannel = 2;

const int resolution = 8;

API nghỉ ESP32

Hàm sau sẽ gửi yêu cầu đến trình xử lý API thích hợp.

void setup_routing() {     

  server.on("/temperature", getTemperature);     

  server.on("/pressure", getPressure);     

  server.on("/humidity", getHumidity);     

  server.on("/data", getData);     

  server.on("/led", HTTP_POST, handlePost);    

          

  server.begin();    

}

Máy chủ API ESP32 Rest của chúng tôi xử lý bốn API còn lại khác nhau. Chúng ta sẽ sử dụng phương thức on() trên đối tượng server để lắng nghe các HTTP request đến. Máy chủ sẽ nhận được yêu cầu trên các URL sau:

  • /nhiệt độ: Điều này sẽ trả lại nhiệt độ hiện tại tính bằng độ C

  • /pressure: Điều này sẽ trả về áp suất hiện tại tính bằng hPa

  • /độ ẩm: Điều này sẽ trả về độ ẩm hiện tại tính bằng%

  • /data: Dữ liệu này sẽ trả về dữ liệu cảm biến BME280 bao gồm nhiệt độ, áp suất và độ ẩm

Ở đây, mỗi tài nguyên (HTTP GET): "nhiệt độ", "áp suất", "độ ẩm" và "dữ liệu" được phân bổ cho trình xử lý tương ứng của nó:

  • nhiệt độ -> getTemperature

  • áp lực -> getPressure

  • độ ẩm -> getHumisity

  • data -> getData

Hơn nữa, tài nguyên "led" sẽ được sử dụng cho phương thức HTTP POST. API Rest JSON này sẽ được sử dụng để điều khiển đèn LED RGB. Để start API server, chúng ta sẽ gọi begin() trên đối tượng server của chúng ta.

Tải trọng JSON bao gồm thông tin mà máy khách yêu cầu thông qua API Rest ESP32. Chúng tôi sẽ bao gồm một thẻ, một giá trị và một đơn vị cho phương thức GET. Ví dụ: nếu khách hàng yêu cầu nhiệt độ thì nhiệt độ, cùng với giá trị và đơn vị của nó sẽ được gửi.

StaticJsonDocument<250> jsonDocument;

char buffer[250];

void create_json(char *tag, float value, char *unit) {  

  jsonDocument.clear();

  jsonDocument["type"] = tag;

  jsonDocument["value"] = value;

  jsonDocument["unit"] = unit;

  serializeJson(jsonDocument, buffer);  

}

 

void add_json_object(char *tag, float value, char *unit) {

  JsonObject obj = jsonDocument.createNestedObject();

  obj["type"] = tag;

  obj["value"] = value;

  obj["unit"] = unit; 

}

Chúng tôi lấy số đọc cảm biến BME280 bằng cách sử dụng bme.readTemperature(), bme.readPressure () và bme.readHumidity (). Các chức năng này đo nhiệt độ môi trường xung quanh, áp suất khí quyển và độ ẩm tương đối tương ứng. Chúng tôi sử dụng một tác vụ cụ thể chạy sau mỗi 60 giây để có được kết quả đọc cảm biến BME280.

void read_sensor_data(void * parameter) {

   for (;;) {

     temperature = bme.readTemperature();

     humidity = bme.readHumidity();

     pressure = bme.readPressure() / 100;

     Serial.println("Read sensor data");

 

     vTaskDelay(60000 / portTICK_PERIOD_MS);

   }

}

Các hàm sau sẽ được sử dụng làm trình xử lý cho các tài nguyên tương ứng của chúng. API REST ESP32 sẽ trả về json payload cho client.

void getTemperature() {

  Serial.println("Get temperature");

  create_json("temperature", temperature, "°C");

  server.send(200, "application/json", buffer);

}

 

void getHumidity() {

  Serial.println("Get humidity");

  create_json("humidity", humidity, "%");

  server.send(200, "application/json", buffer);

}

 

void getPressure() {

  Serial.println("Get pressure");

  create_json("pressure", pressure, "hPa");

  server.send(200, "application/json", buffer);

}

 

void getData() {

  Serial.println("Get BME280 Sensor Data");

  jsonDocument.clear();

  add_json_object("temperature", temperature, "°C");

  add_json_object("humidity", humidity, "%");

  add_json_object("pressure", pressure, "hPa");

  serializeJson(jsonDocument, buffer);

  server.send(200, "application/json", buffer);

}

BÀI HTTP

Hàm sau xử lý tải trọng POST mà máy chủ API ESP32 nhận được sau khi máy khách yêu cầu API Rest JSON "dẫn". Điều này cuối cùng sẽ kiểm soát màu sắc của đèn LED RGB. JSON payload được deserialized sử dụng hàm deserializeJson(). Các giá trị RGB cho màu đỏ, xanh lá cây và xanh lam được lưu trong các biến số nguyên 'red_value', 'green_value' và blue_value' tương ứng. Bằng cách sử dụng ledcWrite(), chúng ta sẽ tạo PWM với các giá trị chu kỳ nhiệm vụ được truy cập từ các giá trị RGB được lưu trữ trong các biến tương ứng của chúng.

Một trọng tải trống được gửi dưới dạng phản hồi cho khách hàng.

void handlePost() {

  if (server.hasArg("plain") == false) {

  }

  String body = server.arg("plain");

  deserializeJson(jsonDocument, body);

 

  int red_value = jsonDocument["red"];

  int green_value = jsonDocument["green"];

  int blue_value = jsonDocument["blue"];

 

  ledcWrite(redChannel, red_value);

  ledcWrite(greenChannel,green_value);

  ledcWrite(blueChannel, blue_value);

 

  server.send(200, "application/json", "{}");

}

thiết lập()

Bên trong hàm setup(), chúng ta sẽ mở một kết nối nối tiếp với tốc độ truyền là 115200.

  Serial.begin(115200); 

Bằng cách sử dụng ledcSetup(), chúng ta sẽ khởi tạo các tham số PWM cho đèn LED RGB. Hàm này có ba tham số. Số kênh, tần số và độ phân giải của kênh PWM.

  ledcSetup(redChannel, frequency, resolution);

  ledcSetup(greenChannel, frequency, resolution);

  ledcSetup(blueChannel, frequency, resolution);

Thứ hai, chúng ta sẽ sử dụng ledcAttach() để gắn các chân led vào các kênh tương ứng.

  ledcAttachPin(red_pin, redChannel);

  ledcAttachPin(green_pin, greenChannel);

  ledcAttachPin(blue_pin, blueChannel);

Sau đó, cảm biến BME280 được khởi tạo và trong trường hợp thất bại, một thông báo lỗi được in trên màn hình nối tiếp.

  if (!bme.begin(0x76)) {    

    Serial.println("BME280 not found! Check Circuit");    

  }  

Phần mã sau đây sẽ kết nối bo mạch ESP32 của chúng tôi với mạng cục bộ có thông tin đăng nhập mạng mà chúng tôi đã chỉ định ở trên. Sau khi kết nối được thiết lập, địa chỉ IP của bo mạch ESP32 sẽ được in trên màn hình nối tiếp. Điều này sẽ giúp chúng tôi thực hiện một yêu cầu đến máy chủ.

 Serial.print("Connecting to Wi-Fi");

  WiFi.begin(SSID, PWD);

  while (WiFi.status() != WL_CONNECTED) {

    Serial.print(".");

    delay(500);

  }

 

  Serial.print("Connected! IP Address: ");

  Serial.println(WiFi.localIP());

Hơn nữa, hãy gọi các chức năng sau đây cũng như để khởi tạo thành công dự án.

  setup_task();    

  setup_routing();     

 

vòng lặp()

Bên trong hàm loop() chúng ta sẽ gọi handleClient() trên đối tượng server để server có thể lắng nghe các HTTP request liên tục.

void loop() {    

  server.handleClient();     

}

Demonstration

Đảm bảo rằng bạn chọn đúng bảng và cổng COM trước khi tải mã của mình lên bảng. Đi tới Bảng > Công cụ và chọn Mô-đun ESP32 Dev.

Chọn bảng ESP32

Tiếp theo, đi tới Công cụ > Cổng và chọn cổng thích hợp mà qua đó bảng của bạn được kết nối.

Chọn COM PORT ESP32

Nhấp vào nút tải lên để tải mã lên bảng phát triển ESP32.
Sau khi bạn đã tải mã của mình lên bảng phát triển, hãy nhấn nút BẬT của nó.

Nút đặt lại bật ESP32

Trong Arduino IDE của bạn, hãy mở màn hình nối tiếp và đặt tốc độ truyền thành 115200. Bạn sẽ có thể thấy địa chỉ IP của mô-đun ESP32 của mình sau khi nó kết nối thành công với Wi-Fi cục bộ.

ESP32 Rest API Serial MonitorMàn hình nối tiếp

Tải xuống và cài đặt phiên bản mới nhất trong hệ thống của bạn. Chúng tôi sẽ kiểm tra API Rest ESP32 của mình với ứng dụng này.

Logo ứng dụng Postman

Bây giờ hãy mở ứng dụng Postman trên hệ thống của bạn và chọn phương thức GET. Nhập http://IP_ADDRESS/temperature và nhấn nút gửi. Ngay lập tức chúng ta sẽ nhận được phản hồi dưới dạng tải trọng JSON.

ESP32 Dữ liệu nhiệt độ API còn lại

Nhập http://IP_ADDRESS/pressure và nhấn nút gửi. Ngay lập tức chúng ta sẽ nhận được phản hồi dưới dạng tải trọng JSON.

Dữ liệu áp lực API nghỉ ESP32

Nhập http://IP_ADDRESS/humidity và nhấn nút gửi. Ngay lập tức chúng ta sẽ nhận được phản hồi dưới dạng tải trọng JSON.

ESP32 Dữ liệu độ ẩm API còn lại

Nhập http://IP_ADDRESS/data và nhấn nút gửi. Ngay lập tức chúng ta sẽ nhận được phản hồi dưới dạng tải trọng JSON.

Dữ liệu cảm biến ESP32 Rest API BME280

Bây giờ để điều khiển đèn LED RGB, hãy chọn tùy chọn POST. Bây giờ gõ http://IP_ADDRESS/led sau đó chỉ định các giá trị RGB và nhấn nút gửi. Ngay lập tức đèn LED RGB sẽ sáng lên với màu sắc thích hợp.

Ở đây chúng tôi đang chỉ định màu đỏ = 255, xanh lá cây = 0, xanh lam = 0 do đó RGB sáng lên màu ĐỎ.

ESP32 Rest API POST

ESP32 Kiểm soát API còn lại RGB LED 1

Ở đây chúng tôi đang chỉ định màu đỏ = 0, xanh lá cây = 0, xanh lam = 255 do đó RGB sáng lên màu Xanh lam.

ESP32 Phần còn lại API POST 2

ESP32 Kiểm soát API còn lại RGB LED 2

Để tìm các giá trị RGB được liên kết với một màu, hãy truy cập trang web , chọn màu của bạn và bạn sẽ có thể nhận được các giá trị RGB.

Bộ chọn giá trị RGB

 

>>> 100+ Mã Sản Phẩm Dây Rút: https://mecsu.vn/san-pham/day-rut-nhua.5op

>>> 1000+ Mã Sản Phẩm Đầu Cosse: https://mecsu.vn/san-pham/dau-cosse.Q1j

Bài viết cùng chuyên mục

NHANH

NHANH

Vì Đổi mới liên tục nên Nhanh hơn

ĐÚNG

ĐÚNG

Coi trọng và ưu tiên việc làm Đúng

ĐỦ

ĐỦ

Tìm và mua Đủ Đơn hàng hơn

KỊP THỜI

KỊP THỜI

Hiệu suất tối ưu bởi Kịp Thời hơn