ภาพวาดสไตล์ flat แสดงบอร์ด ESP32 DevKit V1 เชื่อมต่อสัญญาณ Wi-Fi พร้อมลูกศรสีเขียว HTTP GET ดึงข้อมูลจากเซิร์ฟเวอร์ และลูกศรสีน้ำเงิน HTTP POST ส่งข้อมูลเซนเซอร์อุณหภูมิและความชื้น มีโลโก้ Deva DIY มุมขวาล่าง

ESP32 HTTP GET/POST | สอนใช้งานเชื่อมต่อ API และ Web Server

ESP32 HTTP GET/POST คืออะไร

ความหมายของ HTTP Request

HTTP (Hypertext Transfer Protocol) คือโปรโตคอลที่ใช้สื่อสารระหว่าง Client (เช่น มือถือ, คอมพิวเตอร์ หรือ ESP32) กับ Server (เช่น Web Server, API)
เวลาที่ ESP32 ต้องการคุยกับ Server เช่น ขอข้อมูล หรือส่งค่าจาก Sensor ไปเก็บ จะต้องใช้สิ่งที่เรียกว่า HTTP Request

ตัวอย่างเช่น

  • ESP32 ขอข้อมูลสภาพอากาศจาก API → เรียกว่า HTTP GET
  • ESP32 ส่งค่าความชื้นดินไปบันทึกใน Database → เรียกว่า HTTP POST

ความแตกต่างระหว่าง GET และ POST

GET

  • ใช้ดึงข้อมูลจาก Server
  • ข้อมูลที่ส่งจะอยู่ใน URL เช่น http://server.com/data?id=1
  • เหมาะกับการอ่านค่า ไม่ซับซ้อน
  • ไม่ควรส่งข้อมูลสำคัญเพราะ URL มองเห็นได้

POST

  • ใช้ส่งข้อมูลไปยัง Server
  • ข้อมูลจะถูกแนบไว้ใน Request Body ไม่แสดงใน URL
  • เหมาะกับการส่งค่าที่เป็น JSON, Sensor data หรือไฟล์
  • ปลอดภัยและรองรับข้อมูลขนาดใหญ่กว่า GET

สรุปง่าย ๆ

  • GET = ขอข้อมูล
  • POST = ส่งข้อมูล

ตัวอย่าง HTTP POST ที่ ESP32 ส่งไปยัง Server

POST /api/sensor-data HTTP/1.1
Host: myserver.com
Content-Type: application/json
User-Agent: ESP32/1.0
Connection: close

{
  "device_id": "esp32_01",
  "soil_moisture": 45,
  "temperature": 27.3,
  "humidity": 61.2
}

อธิบายโครงสร้าง

  • POST /api/sensor-data HTTP/1.1 → บอกว่าเป็นการส่งข้อมูล (POST) ไปยัง endpoint /api/sensor-data
  • Host: myserver.com → โดเมนของ Server
  • Content-Type: application/json → กำหนดว่าข้อมูลที่ส่งเป็น JSON
  • User-Agent: ESP32/1.0 → บอกว่าใครเป็นผู้ส่ง (จะใส่หรือไม่ก็ได้)
  • Connection: close → ปิดการเชื่อมต่อหลังส่งเสร็จ
  • ส่วนล่างคือ Request Body ที่ส่งค่าเซนเซอร์ไปยัง Server

อุปกรณ์และซอฟต์แวร์ที่ใช้

ESP32 DevKit V1

คลิกเพื่อทำความรู้จัก ESP32 ให้มากขึ้น พร้อมจุดเด่นและวิธีเริ่มต้นใช้งาน

Arduino IDE

เป็นโปรแกรมที่ใช้ในการเขียนโค้ดและอัปโหลดไปยัง ESP32

เริ่มต้นเขียนโปรแกรมบนบอร์ด Arduino ด้วยคู่มือพื้นฐาน “Arduino IDE Guide” — เรียนรู้วิธีติดตั้งและใช้งาน IDE สำหรับผู้เริ่มต้น

ไลบรารี WiFi.h และ HTTPClient.h

  • WiFi.h
    ใช้สำหรับเชื่อมต่อ ESP32 เข้ากับ Wi-Fi Router ของเรา
#include <WiFi.h>
WiFi.begin("SSID", "PASSWORD");
  • HTTPClient.h
    ใช้สำหรับสื่อสารกับ Web Server ผ่าน HTTP GET/POST
#include <HTTPClient.h>
HTTPClient http;
http.begin("http://myserver.com/api"); 
http.POST("{\"temp\":25}");
http.end();
ทำความรู้จักฟังก์ชันต่าง ๆ ในไลบรารี WiFi บน ESP32 และวิธีใช้งานอย่างมืออาชีพได้ที่ ESP32 WiFi Library Functions

“หากยังไม่รู้จัก ESPAsyncWebServer มาก่อน แนะนำให้อ่านคู่มือฉบับเต็มก่อนใช้งานจริง”
🔗 ESPAsyncWebServer Guide

ไดอะแกรม ESP32 ส่ง HTTP GET ไปยัง Web Server พร้อมลูกศรทิศทางและข้อความ HTTP GET แสดงการรับค่าเป็น HTTP Response (เช่น JSON)

โค้ดตัวอย่าง HTTP GET

ลักษณะการทำงาน

HTTP GET คือการร้องขอ (Request) ข้อมูลจาก Server โดยไม่ส่งข้อมูลแนบไปด้วย เหมาะสำหรับการ ดึงข้อมูล เช่น ค่า Config, API พยากรณ์อากาศ, หรือสถานะจาก Server

การทำงานโดยรวมคือ

  1. ESP32 เชื่อมต่อ Wi-Fi
  2. ใช้ HTTPClient สร้าง Request ไปยัง URL
  3. Server ตอบกลับ (Response) เป็นข้อความหรือ JSON
  4. ESP32 นำข้อมูลมาแสดงผลหรือประมวลผลต่อ
#include <WiFi.h>
#include <HTTPClient.h>

const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";

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

  // เชื่อมต่อ Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi Connected!");
}

void loop() {
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin("http://worldtimeapi.org/api/timezone/Asia/Bangkok"); 
    int httpCode = http.GET();

    if (httpCode > 0) {
      String payload = http.getString();
      Serial.println("Response:");
      Serial.println(payload);
    } else {
      Serial.printf("Error: %s\n", http.errorToString(httpCode).c_str());
    }
    http.end();
  }
  delay(10000); // ดึงข้อมูลทุก 10 วิ
}

การดึงข้อมูลจาก API (เช่น JSON)

ในตัวอย่างนี้ ESP32 จะยิง GET ไปที่ API ฟรี

http://worldtimeapi.org/api/timezone/Asia/Bangkok

ซึ่งจะตอบกลับมาเป็น JSON เช่น

{
  "utc_offset":"+07:00",
  "timezone":"Asia/Bangkok",
  "day_of_week":4,
  "day_of_year":275,
  "datetime":"2025-10-02T10:36:09.679620+07:00",
  "utc_datetime":"2025-10-02T03:36:09.679620+00:00",
  "unixtime":1759376169,
  "raw_offset":25200,
  "week_number":40,
  "dst":false,
  "abbreviation":"+07",
  "dst_offset":0,
  "dst_from":null,
  "dst_until":null,
  "client_ip":"223.204.102.80"
}

อธิบายโค้ด

  • #include <WiFi.h>
    → เรียกใช้ไลบรารีสำหรับเชื่อมต่อ Wi-Fi

  • #include <HTTPClient.h>
    → ใช้สำหรับส่ง HTTP Request/Response

  • WiFi.begin(ssid, password);
    → เริ่มเชื่อมต่อ Wi-Fi

  • HTTPClient http;
    → สร้างออบเจ็กต์ HTTP

  • http.begin(“URL”);
    → กำหนดปลายทาง API ที่จะดึงข้อมูล

  • int httpCode = http.GET();
    → ส่งคำสั่ง GET ไปยัง Server

  • http.getString();
    → รับข้อมูลที่ Server ส่งกลับมา (Response)

  • http.end();
    → ปิดการเชื่อมต่อหลังเสร็จงาน
ไดอะแกรม ESP32 ส่ง HTTP POST (JSON) ไปยัง Web Server มีลูกศรทิศทางและตัวอย่าง payload/200 OK ใช้อธิบายการส่งข้อมูลเซนเซอร์

โค้ดตัวอย่าง HTTP POST

อธิบายการส่งข้อมูล Sensor ขึ้น Server

HTTP POST ใช้สำหรับ ส่งข้อมูลจาก ESP32 ไปยัง Server เช่น:

  • ส่งค่า อุณหภูมิ / ความชื้น จาก DHT22
  • ส่งค่า ความชื้นดิน จาก Soil Sensor
  • ส่งค่าไปเก็บใน Database หรือ Dashboard

ลักษณะการทำงานคือ

  1. ESP32 อ่านค่าจาก Sensor
  2. สร้าง HTTP POST Request
  3. แนบข้อมูลใน Request Body
  4. Server รับข้อมูลไปบันทึกหรือประมวลผลต่อ
#include <WiFi.h>
#include <HTTPClient.h>
#include "DHT.h"

#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
const char* serverName = "http://myserver.com/api/sensor-data";

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

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi Connected!");
}

void loop() {
  if (WiFi.status() == WL_CONNECTED) {
    float t = dht.readTemperature();
    float h = dht.readHumidity();

    if (isnan(t) || isnan(h)) {
      Serial.println("อ่านค่าเซนเซอร์ไม่สำเร็จ!");
      return;
    }

    HTTPClient http;
    http.begin(serverName);
    http.addHeader("Content-Type", "application/json");

    // สร้าง JSON String
    String jsonData = "{\"device_id\":\"esp32_01\",\"temperature\":" + String(t) + ",\"humidity\":" + String(h) + "}";

    int httpResponseCode = http.POST(jsonData);

    if (httpResponseCode > 0) {
      Serial.print("Response Code: ");
      Serial.println(httpResponseCode);
      String response = http.getString();
      Serial.println("Response: " + response);
    } else {
      Serial.printf("Error: %s\n", http.errorToString(httpResponseCode).c_str());
    }
    http.end();
  }
  delay(10000); // ส่งข้อมูลทุก 10 วินาที
}

อธิบายการทำงาน

  • DHT dht(DHTPIN, DHTTYPE);
    → สร้างออบเจ็กต์เซนเซอร์ DHT22

  • dht.readTemperature() และ dht.readHumidity()
    → อ่านค่าอุณหภูมิและความชื้น

  • HTTPClient http;
    → เตรียมตัวสร้าง HTTP Request

  • http.begin(serverName);
    → กำหนด URL ปลายทาง

  • http.addHeader(“Content-Type”, “application/json”);
    → กำหนดชนิดข้อมูลที่ส่งเป็น JSON

  • http.POST(jsonData);
    → ส่งค่า JSON ไปยัง Server

  • http.getString();
    → รับข้อความตอบกลับ (Response) จาก Server

  • delay(10000);
    → ส่งข้อมูลทุก ๆ 10 วินาที

การประยุกต์ใช้งานจริง

ESP32 ส่งค่าอุณหภูมิ/ความชื้นไปยัง Web Server

กรณีนี้เหมาะกับ Smart Farm/Smart Home ที่ต้องบันทึกค่าเซนเซอร์แบบต่อเนื่อง

โฟลว์

1) ESP32 อ่านค่า DHT22 → 
2) สร้าง JSON →
3) POST /api/sensor-data →
4) Server ตรวจสอบ/บันทึก →
5) ตอบกลับสถานะ

โครงสร้าง Endpoint (ตัวอย่าง)

POST /api/sensor-data
Header: Content-Type: application/json, X-API-KEY: <token>
Body:
{
"device_id": "esp32_01",
"temperature": 27.4,
"humidity": 60.8,
"ts": 1733145600
}

 

การตอบกลับ

{"status":"ok","stored":true}

 

ESP32 ดึงค่าการตั้งค่า (Config) จาก Server

ใช้เมื่ออยากปรับ setpoint/โหมดทำงานจากหน้าเว็บโดยไม่ต้องแฟลชโค้ดใหม่

โฟลว์

1) ESP32 บูต → 
2) GET /api/device-config?device_id=esp32_01 →
3) รับ JSON →
4) เซฟลง Preferences →
5) ใช้ค่าทันที

ตัวอย่าง JSON Config

{
"device_id": "esp32_01",
"mode": "auto", // auto | manual
"pump": { "on_threshold": 35, "off_threshold": 55, "cooldown_sec": 20 },
"fan": { "start_temp": 30, "stop_temp": 27 },
"report_every_sec": 15
}

 

ตัวอย่างโค้ดสอนการใช้ไลบรารี่ 🔗 ArduinoJson ที่เข้าใจง่าย รวบรวมไว้ในบทเรียนนี้แล้ว

สรุป

การใช้งาน ESP32 + HTTPClient ทำให้เราสามารถคุยกับ Web Server หรือ API ได้สะดวกมาก

  • ใช้ GET → ดึงค่าการตั้งค่า (Config) หรือข้อมูลจาก API
  • ใช้ POST → ส่งค่าเซนเซอร์ เช่น อุณหภูมิ ความชื้น หรือค่าควบคุม ไปเก็บในฐานข้อมูล

แค่ไม่กี่บรรทัดโค้ด ESP32 ก็สามารถทำงานแบบ IoT Device ได้ทันที

จุดเด่น

  • ไม่ต้องเขียน TCP/IP เอง → ไลบรารีจัดการให้หมด
  • ใช้ง่าย เหมาะกับมือใหม่และ Maker ที่เพิ่งเริ่ม
  • ยืดหยุ่น → ต่อกับ Web Server ธรรมดา หรือ Cloud (เช่น Firebase, MySQL, InfluxDB) ได้

ต่อยอดได้ทันที

  • ทำ IoT Dashboard → ดูค่าเซนเซอร์ผ่านเว็บ/มือถือ
  • ทำ ระบบ Smart Farm → ESP32 ส่งค่าไป Server + Server สั่งอุปกรณ์กลับมา
  • เชื่อมกับ Cloud API เช่น OpenWeather, Telegram Bot

FAQ คำถามที่พบบ่อย

1) ESP32 ต้องใช้ HTTPClient.h ทุกครั้งไหม?
ไม่จำเป็นครับ ถ้าแค่เปิด Web Server ให้คนเข้ามาใช้งานใช้ ESPAsyncWebServer ก็พอ แต่ถ้า ESP32 ต้องการ ยิง Request ออกไปหา Server อื่น จำเป็นต้องใช้ HTTPClient.h

2) GET กับ POST เลือกใช้อย่างไร?

  • GET ใช้ดึงข้อมูล → เหมาะกับ Config, Status, หรือข้อมูลเล็ก ๆ
  • POST ใช้ส่งข้อมูล → เหมาะกับ Sensor, JSON, ไฟล์, หรือข้อมูลที่ต้องการเก็บบันทึก

3) ESP32 ใช้ HTTPS ได้หรือไม่?
ได้ครับ ESP32 รองรับ HTTPS แต่ต้องใช้ WiFiClientSecure และต้องระวังเรื่อง certificate (ต้องมี Root CA หรือใช้ fingerprint) ถึงจะเชื่อมต่อได้ปลอดภัย

4) ถ้า Server ช้า ESP32 จะทำงานอย่างไร?
ESP32 จะรอจนกว่า Request จะ Timeout (กำหนดค่าได้) ถ้าเกินเวลาจะส่ง Error code กลับมา → ควรเขียนโค้ดเช็กและทำ retry เพื่อความเสถียร

5) ESP32 ส่ง JSON ได้ไหม?
ได้แน่นอนครับ ใช้ http.addHeader(“Content-Type”, “application/json”); แล้วส่ง JSON String ไปกับ http.POST() ได้เลย

6) ต้องมีอินเทอร์เน็ตตลอดเวลาหรือไม่?
ไม่จำเป็นเสมอไป ถ้า ESP32 คุยกับ Server ในวง LAN (Local Wi-Fi) ก็ใช้งานได้แม้ไม่มีอินเทอร์เน็ต แต่ถ้าเป็น API ภายนอก เช่น Firebase หรือ OpenWeather → ต้องต่ออินเทอร์เน็ต

7) ใช้กับ Web Server บน Node.js ได้หรือไม่?
ได้ครับ ESP32 ไม่สนใจว่าฝั่ง Server จะใช้ Node.js, PHP, Python หรือ Go ขอแค่เปิด REST API ที่รองรับ HTTP ก็เชื่อมต่อได้

8) ESP32 รองรับ HTTP PUT/DELETE หรือไม่?
รองรับครับ ไลบรารี HTTPClient มีทั้ง http.PUT() และ http.sendRequest(“DELETE”) → ใช้ได้กับ REST API เต็มรูปแบบ

9) ถ้าข้อมูลใหญ่ควรใช้ POST หรือ GET?
ควรใช้ POST เพราะ GET จำกัดความยาว URL (โดยทั่วไปไม่เกิน 2048 ตัวอักษร) และไม่เหมาะกับการส่งข้อมูลจำนวนมาก

10) ESP32 ทำ Web Server เองพร้อมกับ HTTP Client ได้ไหม?
ทำได้ครับ ESP32 สามารถเปิด Web Server (เช่น /dashboard) แล้วก็ยังยิง HTTP GET/POST ไปหา Server อื่นได้ในเวลาเดียวกัน แต่ควรเขียนโค้ดให้แยก Task/Loop อย่างชัดเจน

Shopping Cart
Scroll to Top