ESP8266 และ ESP32 — เขียนโปรแกรม เชื่อมต่อเซ็นเซอร์ ทำโปรเจกต์ IoT

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
MicroPythonPython, 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) — ขาสำคัญ

GPIOArduinoฟังก์ชั่นข้อควรระวัง
GPIO0D3Flash Button / Bootถ้า LOW ตอน Boot = Flash Mode
GPIO2D4Onboard LEDต้อง HIGH ตอน Boot
GPIO4D2I2C SDA / OneWire✅ ใช้ได้ทั่วไป
GPIO5D1I2C SCL✅ ใช้ได้ทั่วไป
GPIO12D6SPI MISO✅ ใช้ได้ทั่วไป
GPIO13D7SPI MOSI✅ ใช้ได้ทั่วไป
GPIO14D5SPI SCK✅ ใช้ได้ทั่วไป
GPIO15D8SPI CSต้อง LOW ตอน Boot
GPIO16D0Deep Sleep Wakeใช้ Wake from Deep Sleep
A0A0ADC 0-1V⚠️ รับสูงสุด 1V! ต้องใช้ Voltage Divider

ESP32 — ขาสำคัญ

GPIOฟังก์ชั่นข้อควรระวัง
GPIO0Boot Modeถ้า LOW = Flash Mode (กด BOOT)
GPIO2Onboard LED✅ ใช้ได้ทั่วไป
GPIO12ADC2_CH0⚠️ ถ้า HIGH ตอน Boot = Flash Voltage 3.3V
GPIO21I2C SDA✅ ขา I2C มาตรฐาน
GPIO22I2C SCL✅ ขา I2C มาตรฐาน
GPIO25,26,32,33DAC / ADC✅ 2 DAC (25,26) + ADC1
GPIO34-39ADC1 เท่านั้น⚠️ INPUT เท่านั้น ไม่มี Pull-up
GPIO4-39Touch SensorESP32 มี 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. การจัดการพลังงาน

โหมดESP8266ESP32รายละเอียด
Active (WiFi on)~80mA~80-120mAทำงานปกติ
Modem Sleep~15mA~5-10mACPU ทำงาน, WiFi ปิด
Light Sleep~1mA~0.8mACPU หยุด, 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 ไหนดี?

เกณฑ์ESP8266ESP32
งบน้อย✅ ~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. แหล่งเรียนรู้

⚠️ หมายเหตุ: เนื้อหานี้ค้นคว้าและเรียบเรียงโดย Hermes AI — ข้อมูลทางเทคนิคควรตรวจสอบก่อนนำไปใช้งานจริง

⚠️ เนื้อหาถูกสร้างโดย AI (Hermes AI) — ข้อมูลทางเทคนิคอาจต้องตรวจสอบก่อนนำไปใช้งานจริง