ESP8266 และ ESP32 — มากกว่าแค่ WiFi Module
ESP8266 (เปิดตัว 2014) ปฏิวัติวงการ IoT ด้วยราคา ~80 บาทที่มี WiFi ในตัว ESP32 (เปิดตัว 2016) ยกระดับขึ้นไปอีกขั้นด้วย Dual Core 240MHz + BLE + GPIO มากมาย บทความนี้เจาะลึกการเขียนโปรแกรมและการประยุกต์ใช้จริงในระบบสมาร์ทโฮม
1. แพลตฟอร์มการพัฒนา
| แพลตฟอร์ม | ข้อดี | ข้อเสีย | เหมาะกับ |
|---|---|---|---|
| Arduino IDE | ติดตั้งง่าย, ตัวอย่างเยอะ, ชุมชนใหญ่ | ไม่มี Debugger, โปรเจกต์ใหญ่จัดการยาก | มือใหม่, โปรเจกต์เล็ก |
| PlatformIO (VS Code) | Library Manager ในตัว, Debug, Unit Test | เรียนรู้เพิ่มอีกนิด | โปรเจกต์ใหญ่, ทีมงาน |
| ESP-IDF (Espressif) | FreeRTOS, Performance สูง, ควบคุม Hardware เต็ม | ติดตั้งยาก, โค้ดเยอะ | Production, Real-time |
| MicroPython | Python, REPL, OTA ง่าย | RAM จำกัด, ช้ากว่า, Lib น้อย | ต้นแบบ, Data Logging |
แนะนำ: เริ่มด้วย Arduino IDE ก่อน เมื่อโปรเจกต์ซับซ้อนขึ้นค่อยย้ายไป PlatformIO (ใช้เวลาเปลี่ยน ~1-2 วัน) ESP-IDF ไว้สำหรับงานที่ต้องการประสิทธิภาพสูงสุด
2. Pin Mapping สำคัญ
⚠️ ESP8266 และ ESP32 ใช้ไฟ 3.3V เท่านั้น! ถ้าต่อ 5V เข้า GPIO จะพังถาวร การต่อ Relay Module ต้องใช้รุ่น 3.3V หรือ Optocoupler แยก
ESP8266 (NodeMCU v3) — ขาสำคัญ
| GPIO | Arduino | ฟังก์ชั่น | ข้อควรระวัง |
|---|---|---|---|
| GPIO0 | D3 | Flash Button / Boot | ถ้า LOW ตอน Boot = Flash Mode |
| GPIO2 | D4 | Onboard LED | ต้อง HIGH ตอน Boot |
| GPIO4 | D2 | I2C SDA / OneWire | ✅ ใช้ได้ทั่วไป |
| GPIO5 | D1 | I2C SCL | ✅ ใช้ได้ทั่วไป |
| GPIO12 | D6 | SPI MISO | ✅ ใช้ได้ทั่วไป |
| GPIO13 | D7 | SPI MOSI | ✅ ใช้ได้ทั่วไป |
| GPIO14 | D5 | SPI SCK | ✅ ใช้ได้ทั่วไป |
| GPIO15 | D8 | SPI CS | ต้อง LOW ตอน Boot |
| GPIO16 | D0 | Deep Sleep Wake | ใช้ Wake from Deep Sleep |
| A0 | A0 | ADC 0-1V | ⚠️ รับสูงสุด 1V! ต้องใช้ Voltage Divider |
ESP32 — ขาสำคัญ
| GPIO | ฟังก์ชั่น | ข้อควรระวัง |
|---|---|---|
| GPIO0 | Boot Mode | ถ้า LOW = Flash Mode (กด BOOT) |
| GPIO2 | Onboard LED | ✅ ใช้ได้ทั่วไป |
| GPIO12 | ADC2_CH0 | ⚠️ ถ้า HIGH ตอน Boot = Flash Voltage 3.3V |
| GPIO21 | I2C SDA | ✅ ขา I2C มาตรฐาน |
| GPIO22 | I2C SCL | ✅ ขา I2C มาตรฐาน |
| GPIO25,26,32,33 | DAC / ADC | ✅ 2 DAC (25,26) + ADC1 |
| GPIO34-39 | ADC1 เท่านั้น | ⚠️ INPUT เท่านั้น ไม่มี Pull-up |
| GPIO4-39 | Touch Sensor | ESP32 มี 10 ขา Touch |
💡 Tip: ใช้ ADC1 (GPIO32-39) แทน ADC2 เพราะ ADC2 ใช้งานไม่ได้ตอน WiFi on — ADC1 แม่นยำกว่ามาก
3. การเชื่อมต่อเซ็นเซอร์ยอดนิยม
DHT22 — อุณหภูมิ + ความชื้น
#include <DHT.h>
#define DHTPIN 4 // GPIO4 (D2 on NodeMCU)
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
dht.begin();
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("อ่าน DHT22 ไม่ได้!");
return;
}
Serial.printf("อุณหภูมิ %.1fC ความชื้น %.1f%%\n", t, h);
delay(2000);
}
Soil Moisture — วัดความชื้นดิน
เซ็นเซอร์ Resistive: แห้ง ~3.3V / เปียก ~1.2V ต่อกับ ESP32 GPIO34 (ADC1)
// ESP32 Soil Moisture พร้อม Calibration
#define SOIL_PIN 34
int dry_val = 3200;
int wet_val = 1200;
void setup() { Serial.begin(115200); }
void loop() {
int raw = analogRead(SOIL_PIN);
float pct = map(raw, dry_val, wet_val, 0, 100);
pct = constrain(pct, 0, 100);
Serial.printf("ความชื้น: %.0f%%\n", pct);
if (pct < 30) Serial.println("ดินแห้ง! เปิดวาล์ว");
delay(5000);
}
PIR Motion — ตรวจจับคน
#define PIR_PIN 5
int motion = 0;
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
}
void loop() {
int val = digitalRead(PIR_PIN);
if (val == HIGH && motion == 0) {
Serial.println("มีคน!");
motion = 1;
} else if (val == LOW) {
motion = 0;
}
delay(200);
}
4. Web Server — ควบคุม Relay จากเบราว์เซอร์
#include <ESP8266WebServer.h>
ESP8266WebServer server(80);
const int RELAY = 14;
void handleRoot() {
String h = "<!DOCTYPE html><html><head>";
h += "<style>body{background:#111;color:#0f0;padding:20px;text-align:center}</style>";
h += "</head><body><h1>ควบคุม Relay</h1>";
h += "<a href='/on'><button>ON</button></a> ";
h += "<a href='/off'><button>OFF</button></a>";
h += "<p>สถานะ: " + String(digitalRead(RELAY) ? "OFF" : "ON") + "</p>";
h += "</body></html>";
server.send(200, "text/html", h);
}
void setup() {
pinMode(RELAY, OUTPUT); digitalWrite(RELAY, HIGH);
WiFi.begin("ssid", "pass");
server.on("/", handleRoot);
server.on("/on", [](){ digitalWrite(RELAY, LOW); server.sendHeader("Location","/"); server.send(303); });
server.on("/off", [](){ digitalWrite(RELAY, HIGH); server.sendHeader("Location","/"); server.send(303); });
server.begin();
}
void loop() { server.handleClient(); }
5. MQTT — ระบบ Pub/Sub สำหรับ Smart Home
MQTT ใช้ Broker กลาง (Mosquitto) ให้อุปกรณ์คุยกันเอง ESP สามารถ Sleep ได้ระหว่างรอ Command
#include <PubSubClient.h>
WiFiClient espClient;
PubSubClient client(espClient);
void callback(char* topic, byte* message, unsigned int len) {
String msg;
for (int i = 0; i < len; i++) msg += (char)message[i];
if (String(topic) == "home/relay1") {
digitalWrite(RELAY, msg == "ON" ? LOW : HIGH);
}
}
void reconnect() {
while (!client.connected()) {
if (client.connect("ESP-Device", "user", "pass")) {
client.subscribe("home/relay1");
}
}
}
🔐 Security: เปลี่ยน Default Password ทุกครั้ง! MQTT ต้องมี User/Pass, ใช้ WiFi WPA2, ปิด Port 1883 จากนอกบ้าน
6. OTA Update — อัปเดต Firmware ไร้สาย
#include <ArduinoOTA.h>
void setup() {
ArduinoOTA.setHostname("esp-garden");
ArduinoOTA.setPassword("iot2026");
ArduinoOTA.onStart([]() { Serial.println("OTA เริ่ม..."); });
ArduinoOTA.onEnd([]() { Serial.println("OTA เสร็จ!"); });
ArduinoOTA.onError([](ota_error_t e) {
Serial.printf("Error: %u\n", e);
});
ArduinoOTA.begin();
}
void loop() {
ArduinoOTA.handle();
// โค้ดหลักของคุณ
}
⚠️ OTA ต้องใช้ Flash Partition > 1MB (Arduino IDE -> Tools -> Flash Size -> 4MB (1.2MB APP / 1.2MB OTA))
7. การจัดการพลังงาน
| โหมด | ESP8266 | ESP32 | รายละเอียด |
|---|---|---|---|
| Active (WiFi on) | ~80mA | ~80-120mA | ทำงานปกติ |
| Modem Sleep | ~15mA | ~5-10mA | CPU ทำงาน, WiFi ปิด |
| Light Sleep | ~1mA | ~0.8mA | CPU หยุด, RTC ทำงาน |
| Deep Sleep | ~10µA | ~5µA | เหลือ RTC, ตื่น Timer/External |
ESP32 Deep Sleep — อ่านเซ็นเซอร์ทุก 30 นาที
#define uS_TO_S_FACTOR 1000000ULL
#define TIME_TO_SLEEP 1800
RTC_DATA_ATTR int bootCount = 0;
void setup() {
Serial.begin(115200);
bootCount++;
int soil = analogRead(34);
sendMQTT(soil); // ส่งก่อน Sleep
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
esp_deep_sleep_start();
}
void loop() {}
8. โปรเจกต์ตัวอย่าง
Smart Temperature Monitor (ESP8266 + DHT22 + Line Notify)
วัดอุณหภูมิห้องเซิร์ฟเวอร์ ถ้าเกิน 40C ส่ง Line Notify
- ESP8266 NodeMCU — ~100 บาท
- DHT22 — ~80 บาท
- Power: Adapter 5V Micro USB
Smart Switch 4 ช่อง (ESP32 + 4 Relay + Touch)
ควบคุมไฟ 4 ดวงผ่าน Web + Capacitive Touch บน ESP32
- ESP32 — ~180 บาท
- 4-Ch Relay 3.3V — ~80 บาท
- Power: 12V 2A -> Buck 3.3V
- Touch: GPIO32,33,25,26 (Touch 9,8,6,7)
Soil Moisture + Auto Watering (ESP32 + Solar)
วัดความชื้นดิน 3 จุด เปิด Solenoid Valve อัตโนมัติ ใช้ Solar + Deep Sleep
- ESP32 Deep Sleep ~5µA
- Solar Panel 6V 5W — ~250 บาท
- LiFePO4 12V 7Ah — ~450 บาท
- Solenoid Valve 12V — ~180 บาท
9. สรุป — เลือก ESP ไหนดี?
| เกณฑ์ | ESP8266 | ESP32 |
|---|---|---|
| งบน้อย | ✅ ~80 บาท | ~180 บาท |
| ต้องการ BLE | ❌ ไม่มี | ✅ มี |
| GPIO มาก | ❌ 11 ขา | ✅ 34 ขา |
| ADC แม่นยำ | ❌ 0-1V 10-bit | ✅ ADC1 12-bit |
| RAM | ❌ 80KB | ✅ 520KB |
| IoT Sensor เดี่ยว | ✅ เลือก | เกินจำเป็น |
| Deep Sleep | ✅ 10µA | ✅ 5µA |
💡 คำแนะนำ: ซื้อ ESP8266 NodeMCU ก่อน (~100 บาท) เรียนรู้พื้นฐาน Web Server + MQTT พอคล่องแล้วค่อยซื้อ ESP32 สำหรับโปรเจกต์ที่ต้องการ BLE หรือ GPIO เยอะ
10. แหล่งเรียนรู้
- ESP-IDF Programming Guide — คู่มือทางการจาก Espressif
- Random Nerd Tutorials — บทความ ESP พร้อม Source Code
- Last Minute Engineers — Pinout Diagram
⚠️ หมายเหตุ: เนื้อหานี้ค้นคว้าและเรียบเรียงโดย Hermes AI — ข้อมูลทางเทคนิคควรตรวจสอบก่อนนำไปใช้งานจริง