สร้าง Sensor Node ประหยัดไฟด้วย ESP32: แบตเตอรี่ใช้งานได้นานเป็นปี

เรียนรู้วิธีสร้างเซ็นเซอร์โหนดที่ใช้พลังงานต่ำด้วย ESP32 เพื่อตรวจวัดอุณหภูมิและความชื้น พร้อมเทคนิคการประหยัดแบตเตอรี่ขั้นสูงที่ทำให้โหนดของคุณทำงานได้นานหลายเดือนถึงหนึ่งปี

6 มีนาคม 2026 15 นาที ระดับกลาง
1-2 ปี
อายุแบตเตอรี่
~20µA
กระแส Deep Sleep
DHT22
เซ็นเซอร์ที่ใช้
10 นาที
ช่วงอ่านค่า

ภาพรวมโปรเจกต์

ในบทความนี้ เราจะสร้างเซ็นเซอร์โหนด (Sensor Node) ที่ตรวจวัดอุณหภูมิและความชื้น โดยใช้ ESP32 ที่สามารถทำงานด้วยแบตเตอรี่ได้นานหลายเดือนถึงหนึ่งปี เหมาะสำหรับการนำไปใช้งานจริงใน:

  • โรงเรือนหรือสวน
  • คลังสินค้า
  • ห้องเก็บของ
  • บ้านอัจฉริยะ (Smart Home)
  • โครงการ IoT ต่างๆ

💡 เคล็ดลับ: เซ็นเซอร์โหนดประหยัดไฟสามารถเชื่อมต่อกับ CynoIoT Platform เพื่อส่งข้อมูลและตรวจสอบผ่าน Dashboard ได้อย่างสะดวก

อุปกรณ์ที่ต้องใช้

Hardware

อุปกรณ์ รุ่น/ข้อมูล ราคาโดยประมาณ
ESP32 Board DevKit V1, NodeMCU, หรือ Wemos ~฿150-200
DHT22 Sensor AM2302 (อุณหภูมิ + ความชื้น) ~฿50-80
Resistor 10kΩ (สำหรับ DHT22) ~฿1-2
Li-Ion Battery 18650 (2000-3000mAh) ~฿80-150
Battery Holder ถาดแบต 18660 + TP4056 ~฿30-50

⚠️ หมายเหตุ: ราคาอาจแตกต่างกันไปตามร้านค้าและยี่ห้อ ควรเลือกซื้อจากร้านที่เชื่อถือได้

Software

  • Arduino IDE (รุ่นล่าสุด)
  • ESP32 Board Support (ติดตั้งผ่าน Board Manager)
  • ไลบรารี DHT sensor (Adafruit DHT library)
  • CynoIoT Account (ฟรี - สำหรับเชื่อมต่อ Cloud)

การต่อวงจร

ต่อวงจรตามรายละเอียดด้านล่าง:

ขาต่อ DHT22:

  • • Pin 1 (VCC) → 3.3V ของ ESP32
  • • Pin 2 (DATA) → GPIO 4 ของ ESP32 (เชื่อมต่อผ่านตัวต้านทาน 10kΩ ไปยัง VCC)
  • • Pin 3 (NC) → ไม่ต้องต่อ
  • • Pin 4 (GND) → GND ของ ESP32

การต่อแบตเตอรี่:

  • • ใช้ TP4056 Charger Module เพื่อชาร์จและคุ้มครองแบตเตอรี่
  • • ออกจาก TP4056 จะได้แรงดันประมาณ 3.7V-4.2V
  • • ต่อเข้า VIN ของ ESP32 (รับได้ 5V-12V) หรือใช้ Step-down converter ลดเป็น 3.3V

💡 เคล็ดลับ: เพื่อประหยัดไฟมากขึ้น ควรตัด LED บนบอร์ด ESP32 (ส่วนใหญ่มี LED บนขา GPIO 2) หรือใช้บอร์ดที่ไม่มี USB-to-UART บนบอร์ด

เขียนโปรแกรม

นี่คือโค้ดสำหรับเซ็นเซอร์โหนดที่ใช้ Deep Sleep Mode เพื่อประหยัดแบตเตอรี่:

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

// ข้อมูล WiFi
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";

// ข้อมูล CynoIoT API
const char* serverUrl = "https://www.cynoiot.com/api/sensor-data";
const char* apiKey = "YOUR_CYNOIOT_API_KEY";

// การตั้งค่าเซ็นเซอร์
#define DHTPIN 4     // GPIO 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

// การตั้งค่า Deep Sleep
#define uS_TO_S_FACTOR 1000000  // แปลงไมโครวินาทีเป็นวินาที
#define TIME_TO_SLEEP 600       // นอน 10 นาที (600 วินาที)

// ตัวแปรสำหรับจัดการพลังงาน
RTC_DATA_ATTR int bootCount = 0;  // เก็บจำนวนครั้งที่ boot ใน RTC memory

void setup() {
  // เพิ่ม boot count
  bootCount++;
  
  // เปิด Serial Monitor (สำหรับ debug)
  Serial.begin(115200);
  delay(1000);  // รอให้ Serial เริ่มทำงาน
  
  Serial.println("\n\n Boot number: " + String(bootCount));
  
  // เชื่อมต่อเซ็นเซอร์
  dht.begin();
  
  // เชื่อมต่อ WiFi
  connectWiFi();
  
  // อ่านค่าเซ็นเซอร์
  readSensor();
  
  // ปิด WiFi เพื่อประหยัดไฟ
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
  
  // บอกว่าจะเข้า Deep Sleep
  Serial.println("Going to deep sleep for " + String(TIME_TO_SLEEP) + " seconds");
  
  // เข้าสู่ Deep Sleep Mode
  esp_deep_sleep_start();
}

void loop() {
  // ไม่ต้องใช้ loop เพราะจะเข้า Deep Sleep ใน setup
}

void connectWiFi() {
  Serial.println("Connecting to WiFi...");
  
  WiFi.begin(ssid, password);
  
  int attempts = 0;
  while (WiFi.status() != WL_CONNECTED && attempts < 20) {
    delay(500);
    Serial.print(".");
    attempts++;
  }
  
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("\nWiFi connected!");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  } else {
    Serial.println("\nFailed to connect to WiFi");
  }
}

void readSensor() {
  // อ่านค่าอุณหภูมิและความชื้น
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();  // อ่านเป็นเซลเซียส
  
  // ตรวจสอบว่าอ่านค่าได้หรือไม่
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  
  // แสดงค่าใน Serial Monitor
  Serial.println("Temperature: " + String(temperature) + "°C");
  Serial.println("Humidity: " + String(humidity) + "%");
  
  // ส่งข้อมูลไป CynoIoT Platform
  sendToCynoIoT(temperature, humidity);
}

void sendToCynoIoT(float temperature, float humidity) {
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("WiFi not connected. Cannot send data.");
    return;
  }
  
  HTTPClient http;
  http.begin(serverUrl);
  http.addHeader("Content-Type", "application/json");
  http.addHeader("Authorization", "Bearer " + String(apiKey));
  
  // สร้าง JSON payload
  String payload = "{\"temperature\":" + String(temperature) + 
                   ",\"humidity\":" + String(humidity) + 
                   ",\"bootCount\":" + String(bootCount) + "}";
  
  // ส่งข้อมูล
  int httpResponseCode = http.POST(payload);
  
  if (httpResponseCode > 0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    String response = http.getString();
    Serial.println("Response: " + response);
  } else {
    Serial.print("Error on sending POST: ");
    Serial.println(httpResponseCode);
  }
  
  http.end();
}

✅ คำอธิบายโค้ด: โค้ดนี้จะทำงานดังนี้:
1. Boot และนับจำนวนครั้งที่ boot
2. เชื่อมต่อ WiFi
3. อ่านค่าจากเซ็นเซอร์ DHT22
4. ส่งข้อมูลไป CynoIoT Platform
5. ปิด WiFi และเข้า Deep Sleep 10 นาที
6. ตื่นขึ้นมาทำงานใหม่ทุก 10 นาที

เทคนิคการประหยัดพลังงานขั้นสูง

เพื่อให้แบตเตอรี่ใช้งานได้นานที่สุด นี่คือเทคนิคที่ควรใช้ร่วมกับ Deep Sleep:

1. ปิด LED บนบอร์ด

ส่วนใหญ่ ESP32 DevKit จะมี LED บนขา GPIO 2 ซึ่งใช้กระแส ~2-5mA ควรตัดหรือถอดออก

2. ใช้ LDO Regulator ที่มีประสิทธิภาพสูง

เลือกใช้ LDO ที่มี Quiescent Current (Iq) ต่ำ เช่น HT7333, AMS1117 รุ่นที่มี Iq ต่ำ

3. ปิด WiFi ทันทีที่ใช้งานเสร็จ

WiFi ใช้กระแส ~80-200mA เมื่อเชื่อมต่อ ควรเปิดเฉพาะตอนส่งข้อมูลแล้วปิดทันที

4. ปรับช่วงเวลาอ่านค่าเซ็นเซอร์

ยิ่งอ่านค่าบ่อย แบตเตอรี่ยิ่งเสียไว ปรับตามความต้องการ เช่น ทุก 10-30 นาที

5. ใช้เซ็นเซอร์ที่มี Quiescent Current ต่ำ

DHT22 ใช้กระแส ~0.5-2.5mA เมื่อทำงาน และ ~40-50µA เมื่อ Standby

6. ใช้ External Wake-up

ใช้ ext0 หรือ ext1 เพื่อตื่นจาก Deep Sleep เมื่อมีเหตุการณ์เฉพาะ (เช่น กดปุ่มหรือเซ็นเซอร์ตรวจจับ)

📊 การคำนวณอายุแบตเตอรี่:
หากใช้แบต 18650 2000mAh (2000mAh / 0.02mA = 100,000 ชั่วโมง ≈ 11 ปี ใน Deep Sleep)
แต่ในความเป็นจริง จะได้ราว 6-12 เดือน (ขึ้นกับช่วงเวลาที่ตื่นและใช้ WiFi)

ปัญหาที่พบบ่อยและวิธีแก้ไข

ปัญหา: ESP32 ไม่ยอมตื่นจาก Deep Sleep

อาการ: อุปกรณ์เข้า Deep Sleep แต่ไม่ตื่นขึ้นมาตามเวลา

สาเหตุ: อาจเป็นเพราะแรงดันแบตเตอรี่ต่ำเกินไป (< 2.3V)

วิธีแก้: ชาร์จหรือเปลี่ยนแบตเตอรี่ / เพิ่มระบบตรวจสอบแรงดันและส่งแจ้งเตือน

ปัญหา: WiFi เชื่อมต่อไม่ได้

อาการ: ESP32 พยายามเชื่อมต่อ WiFi แต่ไม่สำเร็จ

สาเหตุ: สัญญาณ WiFi อ่อน, รหัสผ่านผิด, หรือ Router จำกัดจำนวนอุปกรณ์

วิธีแก้: ย้ายโหนดให้ใกล้ Router มากขึ้น / ตรวจสอบรหัสผ่าน / เพิ่ม retry logic

ปัญหา: DHT22 อ่านค่าไม่ได้

อาการ: Serial Monitor แสดง "Failed to read from DHT sensor!"

สาเหตุ: ต่อสายผิด, ไม่มีตัวต้านทาน pull-up, หรือเซ็นเซอร์เสีย

วิธีแก้: ตรวจสอบการต่อสาย / เพิ่มตัวต้านทาน 10kΩ / ลองเปลี่ยนเซ็นเซอร์

ปัญหา: แบตเตอรี่หมดเร็วเกินไป

อาการ: แบตเตอรี่ใช้ได้เพียงไม่กี่วัน

สาเหตุ: ไม่ได้เข้า Deep Sleep หรือใช้ WiFi นานเกินไป

วิธีแก้: ตรวจสอบว่าโค้ดเรียก esp_deep_sleep_start() / ลดเวลาที่ WiFi เปิดอยู่ / ปิด LED บนบอร์ด

สรุป

ในบทความนี้ เราได้เรียนรู้วิธีสร้างเซ็นเซอร์โหนดที่ประหยัดพลังงานด้วย ESP32 โดยใช้ Deep Sleep Mode ซึ่งทำให้แบตเตอรี่สามารถใช้งานได้นานหลายเดือนถึงหนึ่งปี

สิ่งที่เราได้เรียนรู้:

  • วิธีการเชื่อมต่อ DHT22 เซ็นเซอร์กับ ESP32
  • การใช้ Deep Sleep Mode เพื่อประหยัดพลังงาน
  • การส่งข้อมูลไปยัง CynoIoT Platform
  • เทคนิคการประหยัดพลังงานขั้นสูง
  • การแก้ปัญหาที่พบบ่อย

ถัดไป:

CynoIoT LogoCynoIoT

แพลตฟอร์ม IoT ที่ช่วยให้คุณเชื่อมต่อและจัดการอุปกรณ์ IoT ได้ง่ายและมีประสิทธิภาพ

ติดต่อเรา

  • อีเมล: contact@cynoiot.com
  • LINE: @cynoiot
  • Facebook: CynoIoT

© 2026 CynoIoT. All rights reserved.