ทำไมผู้ประกอบการเดี่ยวควรลองทำ IoT เอง
ถ้าคุณเป็นผู้ประกอบการเดี่ยวที่ดูแลทุกอย่างด้วยตัวเอง การรู้ว่า "ตู้แช่ร้านเริ่มไม่เย็น" หรือ "ห้องเซิร์ฟเวอร์ร้อนผิดปกติ" ก่อนที่ของจะเสียหาย คือเงินที่ประหยัดได้จริง ข่าวดีคือคุณไม่ต้องจ้างใครและไม่ต้องลงทุนหลักหมื่น ด้วยบอร์ด ESP32 ราคาหลักร้อย คุณต่อเซ็นเซอร์วัดอุณหภูมิแล้วให้มันส่งแจ้งเตือนเข้า LINE ของคุณเองได้ภายในเย็นเดียว บทความนี้พาทำจริงตั้งแต่ต่อสายจนข้อความเด้งเข้ามือถือ และตั้งใจให้ "ทำเองได้" จริง ๆ ไม่ต้องมีพื้นฐานอิเล็กทรอนิกส์
อัปเดตสำคัญ: หลายบทความเก่าสอนส่งเข้า LINE ผ่าน "LINE Notify" — วิธีนั้น ใช้ไม่ได้แล้ว LINE Notify ปิดบริการถาวรตั้งแต่ 31 มีนาคม 2025 (endpoint
notify-api.line.meตายหมด) บทความนี้ใช้ LINE Messaging API ซึ่งเป็นทางที่ LINE แนะนำเองให้มาแทน และยังฟรีสำหรับการใช้งานส่วนตัว
อุปกรณ์และราคา (อยู่ในหลักร้อย)
- ESP32 DevKit V1 (DOIT/NodeMCU 30 ขา) ~ 230–290 บาท
- เซ็นเซอร์ DS18B20 ตัวเปล่า ~ 40 บาท หรือรุ่นโพรบกันน้ำสาย 1 เมตร ~ 60–80 บาท
- Breadboard 830 จุด (MB-102) ~ 50–70 บาท
- สาย jumper ชุด 40 เส้น ~ 30–40 บาท
- ตัวต้านทาน 4.7kΩ ~ 1–5 บาท (มักแถมในชุด resistor)
รวมทั้งชุดสำหรับมือใหม่ประมาณ 350–480 บาท — งบหลักร้อยจริง
ต่อวงจร ESP32 + DS18B20
ต่อแบบ external power (แนะนำสำหรับมือใหม่) 4 จุดเท่านั้น:
- VCC (สายแดง) ของ DS18B20 → ขา 3V3 ของ ESP32 (ห้ามใช้ 5V/VIN เด็ดขาด เพราะ GPIO ของ ESP32 ทนแค่ 3.3V ถ้าจ่าย 5V สาย DATA จะดึงขึ้น 5V ทำบอร์ดพังได้)
- GND (สายดำ) → ขา GND
- DATA (สายเหลือง/ขาว) → ขา GPIO4
- ตัวต้านทาน 4.7kΩ คร่อมระหว่าง DATA กับ VCC (3.3V) — คือเชื่อม DATA ↔ 3V3 ผ่าน R 4.7k บน breadboard
จุดพลาดอันดับ 1: ลืม pull-up 4.7kΩ ถ้าขาดตัวนี้ บัสจะลอย อ่านค่าได้ -127 หรือ 85.0 ตลอด (R ภายในของ ESP32 ไม่พอ ต้องใส่ตัวจริง) และอย่าใช้ GPIO0/2/12/15 (strapping pin บูตไม่ขึ้น) หรือ GPIO34–39 (input-only เขียนสัญญาณไม่ได้) — ใช้ GPIO4 ปลอดภัยสุด
เตรียม Arduino IDE และทดสอบอ่านค่า
ติดตั้ง board package ก่อน: ใน Preferences ใส่ URL https://espressif.github.io/arduino-esp32/package_esp32_index.json แล้วลง "esp32 by Espressif Systems" ใน Boards Manager เลือกบอร์ด ESP32 Dev Module จากนั้นลง 2 ไลบรารีผ่าน Library Manager: OneWire (Paul Stoffregen) และ DallasTemperature (Miles Burton)
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 4 // GPIO4 = ขา DATA
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(115200);
sensors.begin();
}
void loop() {
sensors.requestTemperatures(); // สั่งทุกตัวบนบัสวัดอุณหภูมิ
float tempC = sensors.getTempCByIndex(0); // อ่านตัวแรก
if (tempC == DEVICE_DISCONNECTED_C) { // = -127 แปลว่าต่อ/pull-up ไม่ดี
Serial.println("Error: sensor ไม่ตอบ ตรวจสายและ pull-up 4.7k");
} else {
Serial.print("Temp: "); Serial.print(tempC); Serial.println(" C");
}
delay(1000);
}
เปิด Serial Monitor ตั้ง baud 115200 (ถ้าตั้ง 9600 จะเห็นตัวอักษรขยะ) ถ้าได้ค่าอุณหภูมิจริงแปลว่าวงจรพร้อมแล้ว ค่า -127 = บัสมีปัญหา, ค่า 85.0 = เซ็นเซอร์ยังไม่ได้ convert (มักเพราะ pull-up หรือไฟไม่นิ่ง)
ตั้งค่า LINE Messaging API (แทน LINE Notify)
เพราะ LINE Notify ปิดไปแล้ว เราจะสร้างช่องทางส่งเองด้วย Messaging API ทำครั้งเดียว:
- ไป LINE Official Account Manager ล็อกอินด้วย LINE ส่วนตัว สร้าง Official Account (OA) ใหม่ (ฟรี)
- ไป LINE Developers Console ล็อกอิน LINE เดียวกัน สร้าง Provider (ใส่ชื่อตัวเอง/บริษัท)
- สร้าง channel แบบ Messaging API แล้วผูกกับ OA ที่เพิ่งสร้าง
- ในแท็บ Messaging API เลื่อนหา Channel access token (long-lived) กด Issue แล้วก๊อปเก็บไว้ — ค่านี้ใช้ใน
Authorization: Bearer - เอามือถือ เพิ่มเพื่อน OA ของตัวเอง (สแกน QR หรือค้นจาก Basic ID @xxxx) — สำคัญมาก ถ้าไม่ add จะ push เข้าไม่ได้
- หา userId ของตัวเอง (ขึ้นต้นด้วย
U...33 ตัว ไม่ใช่ LINE ID @ ที่เห็นในแอป): วิธีเร็วสุดคือตั้ง Webhook URL ของ channel ไปที่ webhook.site (สร้าง URL ฟรี) เปิด Use webhook = ON แล้วทักข้อความหา OA 1 ที จะเห็น JSON เข้ามา ดูที่source.userIdก๊อปเก็บไว้
โค้ดส่งเข้า LINE ด้วย ESP32
ESP32 ยิง HTTPS ตรงเข้า api.line.me ได้เลย ไม่ต้องมี server กลาง ต้องใช้ WiFiClientSecure (HTTP ธรรมดาใช้ไม่ได้ เพราะ LINE เป็น TLS เท่านั้น) endpoint คือ POST https://api.line.me/v2/bot/message/push
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
const char* WIFI_SSID = "ชื่อWiFi";
const char* WIFI_PASS = "รหัสWiFi";
const char* TOKEN = "ใส่ Channel Access Token ที่ Issue มา";
const char* USER_ID = "Uxxxxxxxx...ของคุณเอง";
void pushToLine(float tempC) {
WiFiClientSecure client;
client.setInsecure(); // ข้ามตรวจ cert (ง่ายสุดสำหรับงานอดิเรก)
HTTPClient https;
https.begin(client, "https://api.line.me/v2/bot/message/push");
https.addHeader("Content-Type", "application/json");
https.addHeader("Authorization", String("Bearer ") + TOKEN);
String body = String("{\"to\":\"") + USER_ID +
"\",\"messages\":[{\"type\":\"text\",\"text\":\"อุณหภูมิ: " +
String(tempC, 1) + " C\"}]}";
int code = https.POST(body); // สำเร็จ = HTTP 200, body {}
Serial.printf("LINE push HTTP %d\n", code);
https.end();
}
ใน setup() เพิ่ม WiFi.begin(WIFI_SSID, WIFI_PASS); แล้วรอจน WiFi.status() == WL_CONNECTED จากนั้นเรียก pushToLine(tempC) ตอนต้องการแจ้งเตือน ภาษาไทยใน text ส่งได้ (UTF-8) แต่ถ้าข้อความซับซ้อน แนะนำใช้ ArduinoJson ประกอบ body จะปลอดภัยกว่าต่อการ escape เอง หรือใช้ไลบรารีสำเร็จรูปอย่าง ESP32_LINE_Messaging_API (tomorrow56) ที่จัดการ JSON/TLS ให้
ข้อควรรู้ (สำคัญต่อการใช้จริง):
- แผนฟรี Communication Plan push ได้ 200 ข้อความ/เดือน ส่วนเกินจะถูกบล็อก — อย่าให้ ESP32 push ทุกวินาที ให้ push เฉพาะ event สำคัญ เช่น อุณหภูมิเกินค่าที่ตั้ง
- Channel Access Token คือความลับ ห้าม commit ลง git หรือแชร์โค้ดสาธารณะพร้อม token
client.setInsecure()ทำให้ไม่ verify เซิร์ฟเวอร์ (เสี่ยง MITM) งานจริงจังควรฝัง root CA ของ LINE ด้วยsetCACertแทน
ทดสอบและต่อยอด
ทดสอบ: อัปโหลดโค้ด เปิด Serial Monitor ถ้าได้ LINE push HTTP 200 และข้อความเด้งเข้า LINE = สำเร็จ ถ้าไม่เข้า เช็คว่า add เพื่อน OA แล้วหรือยัง และ userId ขึ้นต้นด้วย U จริง
ต่อยอดสำหรับธุรกิจ: ตั้งเงื่อนไข push เฉพาะตอนอุณหภูมิเกินเกณฑ์ (เช่น ตู้แช่ > 8°C), ใส่ deep sleep ให้ประหยัดไฟเมื่อใช้แบตเตอรี่, หรือเพิ่มเซ็นเซอร์ความชื้น/ประตูเปิด-ปิด คุณเพิ่งสร้างระบบเฝ้าระวังของธุรกิจตัวเองด้วยงบไม่ถึง 500 บาท — ทำเองได้จริง และนี่คือก้าวแรกของการเป็นเจ้าของที่ "รู้หน้างานตลอดเวลา"
