Lấy dữ liệu thời tiết với ESP32 HTTP Client phương thức Get

ESP32 http get openweather

Hôm nay chúng ta sẽ học cách lấy dữ liệu thời tiết trên openweather.org sử dụng ESP32 HTTP Client giao thức Get. Cùng tìm hiểu cách sử dụng API và giao thức http nhé!

Bài 5 WIFI Trong serie Học ESP32 từ A tới Z

Lấy thông tin API từ openweathermap.org

Vào https://openweathermap.org đăng kí tài khoản và đăng nhập.

Trong Tab user, chọn My API keys. Đặt tên và Gen ra key mới.

api openweather

Như vậy là chúng ta đã có đc API key để truy cập vào dữ liệu của Openweather. Appkey chính là một chìa khóa để định danh các user sử dụng API, giúp server quản lý việc user được sử dụng tài nguyên nào, không được sử dụng tài nguyên nào.

openweather

Tiếp tới nhấn vào API – current weather data – API doc để xem hướng dẫn sử dụng.

api openweather 2

Chúng ta có thể call API theo nhiều kiểu, phổ biến nhất là

  • Sử dụng Tên thành phố: City name
  • Sử dụng County code
  • Sử dụng zip code
  • Sử dụng tọa độ lat long

Trong bài này chúng ta sẽ sử dụng tên thành phố để kiểm tra thời tiết.

Cách lấy dữ liệu từ server với giao thức http get

Get là phương thức phổ biến nhất khi sử dụng giao thức HTTP. Với GET chúng ta có thể lấy dữ liệu từ server về.
Thực tế trình duyệt của bạn cũng sử dụng GET để lấy thông tin về website tương ứng với url.

Để sử dụng được HTTP GET chúng ta cần có những thông tin sau:

  • Url: Địa chỉ server mà chúng ta trỏ tới, nó có thể là IP và port hoặc domain tương ứng.
  • Phương thức: Chọn phương thức giao tiếp là GET
  • Query: sau kí tự ?q= thường sẽ truyền một tham số mà server yêu cầu. Ví dụ như App key, thành phố, id….
  • Header: Truyền vào kiểu dư liệu trả về, kiểu kết nối, hoặc các dữ liệu liên quan khác
  • Body: Với GET thường sẽ không truyền Body gì cả

Các tham số ESP32 HTTP get lấy dữ liệu thời tiết từ Openweathermap

Trong bài này, lấy dữ liệu thời tiết sẽ sử dụng những thông tin sau:

  • Url: api.openweathermap.org/data/2.5/weather
  • query: ?q={city name}&appid={api key mà bạn vừa tạo ra}
  • header: mặc định kiểu dữ liệu trả về là JSON
  • Phương thức: GET

HTTP GET Open Weather Map ESP32

Test trên Postman

Đăng nhập https://www.postman.com/ sau đó tạo một lệnh GET

Truyền các tham số và url vừa định nghĩa bên trên, nhấn Send. Kết quả ta sẽ nhận được một chuỗi JSON như sau:

postman

Vậy là chúng ta đã gọi thành công API của Openweathermap, vậy làm như thế nào để gọi trên ESP32, cùng nhau tìm hiểu tiếp nhé

Tạo http request trên esp32

Download thư viện http client. Với lệnh pio lib install "amcewen/HttpClient"

Import và tạo 1 String lưu Url với city là Hanoi.

String weatherUrl = "http://api.openweathermap.org/data/2.5/weather?q=Hanoi&appid=e2029e14dfbb872bf7a67b3b8b03a3c5";

Tạo một hàm http get, mỗi khi gọi chúng ta sẽ sử dụng phương thức get với Url đó. Sau đó trả về kết quả dạng chuỗi String

String httpGETRequest(const char* Url)
{
  HTTPClient http;
  http.begin(Url);
  int responseCode = http.GET();
  String responseBody = "{}";
  if(responseCode > 0)
  {
    Serial.print("responseCode:");
    Serial.println(responseCode);
    responseBody = http.getString();
  }
  else 
  {
    Serial.print("Error Code: ");
    Serial.println(responseCode);
  }
  http.end();
  return responseBody;
}

Chuỗi trả về dạng String JSON, có rất nhiều dữ liệu trong đó, chúng ta chỉ cần mỗi nhiệt độ và độ ẩm thì làm như thế nào?

Xử lý (parse) Http response trên ESP32

Download thư viên Arduino_JSON với lệnh: pio lib install "arduino-libraries/Arduino_JSON"

Trong loop, gọi hàm http get và lưu kết quả trả về vào weatherJsonBuffer , Tạo một biến JSONVar tên weatherJson. Sau đó phân tích các biến này ra.

Dữ liệu nhiệt độ, độ ẩm nằm ở cụm main, vị trí temp và humi.

Chúng ta thực hiện như sau:

void loop() {
  //read temp to openweather
  Serial.println(weatherUrl);
  weatherJsonBuffer = httpGETRequest(weatherUrl.c_str());
  Serial.println(weatherJsonBuffer);
  JSONVar weatherJson = JSON.parse(weatherJsonBuffer);
  if(JSON.typeof_(weatherJson) == "undefined")
  {
    Serial.println("Parsing fail");
    return;
  }
  Serial.println();
  temp = weatherJson["main"]["temp"];
  temp = temp - 273;
  Serial.print("Temperature: ");
  Serial.println(temp);

  humi = weatherJson["main"]["humidity"];
  Serial.print("Humidity: ");
  Serial.println(humi);
  delay(10000);
}

Nhiệt độ là độ K chúng ta cần chuyển về độ C bằng cách -273. Sau đó in ra serial

Lập trình ESP32 http Full code

 

#include <Arduino.h>
#include <HTTPClient.h>
#include <WiFi.h>
#include <Arduino_JSON.h>
#include <string.h>
const char* ssid = "Nha Tao";
const char* password = "25251325" ;

String weatherApiKey = "e2029e14dfbb872bf7a67b3b8b03a3c5";

String city = "Hanoi";
String countrycode = "";
String weatherJsonBuffer;

//http config
String weatherUrl = "http://api.openweathermap.org/data/2.5/weather?q=Hanoi&amp;amp;appid=e2029e14dfbb872bf7a67b3b8b03a3c5";

int temp = 30;
int humi = 80;

String httpGETRequest(const char* Url);
void setup() {
  Serial.begin(9600);

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

void loop() {
  //read temp to openweather
  Serial.println(weatherUrl);
  weatherJsonBuffer = httpGETRequest(weatherUrl.c_str());
  Serial.println(weatherJsonBuffer);
  JSONVar weatherJson = JSON.parse(weatherJsonBuffer);
  if(JSON.typeof_(weatherJson) == "undefined")
  {
    Serial.println("Parsing fail");
    return;
  }
  Serial.println();
  temp = weatherJson["main"]["temp"];
  temp = temp - 273;
  Serial.print("Temperature: ");
  Serial.println(temp);

  humi = weatherJson["main"]["humidity"];
  Serial.print("Humidity: ");
  Serial.println(humi);
  delay(10000);
}

String httpGETRequest(const char* Url)
{
  HTTPClient http;
  http.begin(Url);
  int responseCode = http.GET();
  String responseBody = "{}";
  if(responseCode > 0)
  {
    Serial.print("responseCode:");
    Serial.println(responseCode);
    responseBody = http.getString();
  }
  else 
  {
    Serial.print("Error Code: ");
    Serial.println(responseCode);
  }
  http.end();
  return responseBody;
}

Kết quả

ket qua

Kết

Khi lập trình IOT với ESP32 HTTP chúng ta sẽ sử dụng rất nhiều phương thức GET. Đây là phương thức không những sử dụng trong IOT mà còn là phương thức chủ yếu trong việc giao tiếp giữa các server với nhau

Nếu thấy có ích hãy chia sẻ bài viết và tham gia nhóm Nghiện Lập Trình để giao lưu và học hỏi nhé

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 *