ภาพรวมระบบ
มาตรวัดอุณหภูมิ
มาตรวัดความชื้น
มาตรวัดอุณหภูมิคอนกรีต (DS18B20)
สถิติข้อมูล
การแจ้งเตือนล่าสุด
กราฟข้อมูล
อุณหภูมิ (°C) - แบบเรียลไทม์
ความชื้นสัมพัทธ์ (%RH) - แบบเรียลไทม์
อุณหภูมิอากาศ vs คอนกรีต (°C)
อุณหภูมิคอนกรีต DS18B20 (°C) - แบบเรียลไทม์
ประวัติข้อมูล
| # | เวลา | อุณหภูมิอากาศ (°C) | สถานะ | คอนกรีต DS18B20 (°C) | ความชื้น (%) | สถานะ | Dew Point (°C) |
|---|---|---|---|---|---|---|---|
| รอข้อมูล... | |||||||
ประวัติ Ticket แจ้งเตือน
ตั้งค่าระบบ
เกณฑ์อุณหภูมิคอนกรีต
กำหนดค่าเกณฑ์อุณหภูมิสำหรับระดับการเตือนต่างๆ (อ้างอิง ACI 305R)
เกณฑ์ความชื้นสัมพัทธ์ในคอนกรีต
กำหนดค่าเกณฑ์ความชื้นสำหรับการบ่มคอนกรีต
ตั้งค่า ESP32
กำหนดความถี่การส่งข้อมูลจาก ESP32 (ESP32 จะโหลดค่าใหม่ทุก 5 นาที)
การแจ้งเตือน LINE OA (Messaging API)
ตั้งค่าการแจ้งเตือนผ่าน LINE Official Account — แจ้งเตือนส่งจาก PHP Server โดยตรง
เอกสารระบบ
ภาพรวมระบบ (System Overview)
ระบบตรวจสอบคอนกรีตเรียลไทม์ ออกแบบสำหรับงานวิศวกรรมโยธา ติดตามอุณหภูมิและความชื้นระหว่างกระบวนการ Hydration ของคอนกรีต อ้างอิงมาตรฐาน ACI 305R — รองรับ หลายจุดตรวจ (Multi-device) แต่ละ device_id มี ticket และข้อมูลแยกอิสระ
DS18B20 GPIO 5
JSON
Web Hosting
MySQL
3 Tables
JSON
Poll 15s
Message
Auto Ticket
ฮาร์ดแวร์ที่ใช้
| อุปกรณ์ | รุ่น / รายละเอียด |
|---|---|
| Microcontroller | ESP32 (38-pin DevKit) |
| Sensor อากาศ | DHT22 (AM2302) — อุณหภูมิอากาศ & ความชื้น |
| Sensor คอนกรีต | DS18B20 (Waterproof Probe) — อุณหภูมิในเนื้อคอนกรีต |
| Power | 5V USB หรือ 3.7V LiPo |
| Network | WiFi 2.4 GHz (Built-in) |
การตั้งค่า Firmware (ino)
แก้ไขค่าเหล่านี้ใน concrete_monitoring.ino ก่อน Flash
| ค่าที่ต้องแก้ไข | ค่าตัวอย่าง |
|---|---|
WIFI_SSID | "MyWiFi" |
WIFI_PASSWORD | "password123" |
API_URL | "https://esp.bpa.co.th/api.php" |
deviceId | "ESP32_01" |
concrete_temp = null โดยอัตโนมัติ — ไม่กระทบ DHT22 และระบบยังทำงานได้ตามปกติ (DEVICE_DISCONNECTED_C error handling)ESP32 DevKit V1 — Pinout Diagram
แผนผังขา (Pinout) ของ ESP32 DevKit V1 — โปรเจคนี้ใช้ GPIO 4 (DHT22) และ GPIO 5 (DS18B20)
GPIO 4 DHT22 — DATA (ต่อ Pull-up 10kΩ ไปที่ 3.3V)
GPIO 5 DS18B20 — DATA (ต่อ Pull-up 4.7kΩ ไปที่ 3.3V)
ESP32 ทำงานที่ 3.3V — ห้ามต่อสัญญาณ 5V เข้า GPIO โดยตรง
ปุ่ม BOOT (GPIO0) ใช้กดค้างตอน Upload ถ้า Port ไม่ตอบสนอง
เซ็นเซอร์ DS18B20 — อุณหภูมิในเนื้อคอนกรีต
DS18B20 เป็น Waterproof Digital Temperature Probe ใช้โปรโตคอล OneWire วัดอุณหภูมิได้แม่นยำ ±0.5°C เหมาะสำหรับฝังในเนื้อคอนกรีตเพื่อติดตาม Heat of Hydration
- Auto Detect ตรวจสอบการเชื่อมต่ออัตโนมัติทุกรอบ
- Null Safety ส่ง
concrete_temp = nullถ้าไม่ได้ต่อ Sensor - No Config ไม่ต้องตั้งค่าใน Settings — เปิด/ปิดด้วยการต่อ/ถอด
- OneWire ใช้ GPIO 5 + 4.7kΩ pull-up resistor
- Alert 🔴 เปิด Ticket + ส่ง LINE เฉพาะระดับ อันตราย (concrete_temp > temp_orange_max)
DS18B20_OFFSET ใน Firmware ก่อน Flash ค่าเริ่มต้น = 0.0°C-- ในช่องคอนกรีต, Gauge ว่าง — DHT22 และระบบอื่นๆ ยังทำงานได้ตามปกติโครงสร้างฐานข้อมูล MySQL
Database: bpacoth1_esp32 | Host: Web Hosting (phpMyAdmin) | Charset: utf8mb4
| Column | Type | หน้าที่ |
|---|---|---|
id | INT PK | Auto increment |
device_id | VARCHAR | รหัสอุปกรณ์ |
temperature | DECIMAL | อุณหภูมิ (°C) |
humidity | DECIMAL | ความชื้น (%) |
dew_point | DECIMAL | จุดน้ำค้าง (°C) |
concrete_temp | DECIMAL NULL | อุณหภูมิคอนกรีต DS18B20 (°C) |
temp_color | VARCHAR | green/yellow/orange/red |
hum_color | VARCHAR | green/yellow/red |
recorded_at | DATETIME | เวลาบันทึก |
| Column | Default | หน้าที่ |
|---|---|---|
temp_green_max | 35.0 | เกณฑ์อุณหภูมิปกติ |
temp_yellow_max | 45.0 | เกณฑ์เฝ้าระวัง |
temp_orange_max | 60.0 | เกณฑ์เสี่ยง |
hum_green_min | 95.0 | ความชื้นปกติ |
hum_yellow_min | 80.0 | ความชื้นเฝ้าระวัง |
send_interval | 30 | ส่งข้อมูลทุก N วินาที |
line_token | '' | Channel Access Token (LINE OA) |
line_user_id | '' | User ID (U...) หรือ Group ID (C...) |
line_enabled | 1 | เปิด/ปิด LINE |
line_cooldown | 5 | cooldown (นาที) |
| Column | Type | หน้าที่ |
|---|---|---|
id | INT PK | Auto increment |
device_id | VARCHAR | รหัสอุปกรณ์ |
alert_type | VARCHAR | temp / hum / both |
temperature | DECIMAL | ค่า ณ เวลาเตือน |
humidity | DECIMAL | ค่า ณ เวลาเตือน |
message | TEXT | ข้อความแจ้งเตือน |
status | ENUM | open / closed |
opened_at | DATETIME | เวลาเปิด ticket |
closed_at | DATETIME | เวลาปิด ticket |
API Endpoints
Base URL: https://esp.bpa.co.th/api.php
| Method | Endpoint | หน้าที่ | Response |
|---|---|---|---|
| GET | ?limit=N |
ดึง sensor data ล่าสุด N รายการ + stats + open ticket | { data, total, current, stats, open_ticket, device_filter } |
| GET | ?limit=N&device_id=X |
กรองข้อมูลเฉพาะ device นั้น (stats และ open_ticket ก็กรองด้วย) | { data, total, current, stats, open_ticket, device_filter } |
| GET | ?action=devices |
รายชื่ออุปกรณ์ทั้งหมด + จำนวนการอ่านค่า + เวลาล่าสุด | { devices: [{ device_id, reading_count, last_seen }] } |
| GET | ?action=devices_status |
สถานะล่าสุดของแต่ละ device + open ticket (สำหรับ Device Cards) | { devices: [{ device_id, temperature, humidity, temp_color, open_ticket_id, ... }] } |
| GET | ?action=settings |
ดึงค่า settings ทั้งหมด (ESP32 โหลดทุก 5 นาที) | { temp_green_max, ..., send_interval } |
| GET | ?action=check_ticket&device_id=X |
เช็ค open ticket ของ device | { has_open_ticket, ticket_id } |
| GET | ?action=tickets&limit=N |
ดึงประวัติ ticket ทั้งหมด (รองรับ &device_id=X) | { tickets: [{ id, device_id, alert_type, status, ... }] } |
| POST | (body: sensor JSON) |
บันทึก sensor + Auto open/close ticket + ส่ง LINE OA อัตโนมัติ | { status:"ok", id, ticket_action, ticket_id } |
| POST | ?action=settings |
บันทึก settings จาก Dashboard | { status:"ok" } |
| POST | ?action=close_ticket |
ปิด ticket manual จาก Dashboard + ส่ง LINE OA | { status:"ok" } |
เกณฑ์อุณหภูมิคอนกรีต
อ้างอิง ACI 305R — Hot Weather Concreting
เกณฑ์ความชื้นสัมพัทธ์ในคอนกรีต
ความชื้นสำหรับการบ่มคอนกรีต (Curing)
ระบบ Ticket แจ้งเตือน
เปิด Ticket และส่ง LINE OA เฉพาะระดับ 🔴 อันตราย เท่านั้น — อุณหภูมิ > temp_orange_max หรือ ความชื้น < hum_yellow_min
"opened" → เปิด Ticket ใหม่ + ส่ง LINE OA
"exists" → Ticket เปิดอยู่แล้ว (ไม่ส่ง LINE ซ้ำ)
"closed" → ปิด Ticket อัตโนมัติ + ส่ง LINE OA
null → ค่าปกติ ไม่มี Ticket
วิธีตั้งค่า LINE OA (Messaging API)
การแจ้งเตือนส่งจาก PHP Server → LINE OA โดยตรง ไม่ผ่าน ESP32
Group ID: เพิ่ม LINE OA เข้า Group → ส่งข้อความใน Group → ดู Webhook Event → groupId (ขึ้นต้น C...)
ปิด Ticket — ค่าพ้นระดับอันตราย (auto) หรือปิด manual ใน Dashboard
Multi-device — หลายจุดตรวจ
รองรับ ESP32 หลายตัวพร้อมกัน แต่ละตัวใช้ device_id ต่างกัน ข้อมูล + Ticket แยกอิสระ
- device_id แก้ใน Firmware เช่น
"ESP32_01","ESP32_02" - API_URL ใช้ URL เดียวกันทุกตัว
- Ticket แต่ละ device มี open ticket แยกกัน
- LINE แจ้งเตือนระบุ device_id ในข้อความ
- Device Cards แสดงสถานะทุกอุปกรณ์พร้อมกัน (ปรากฏเมื่อมี > 1 device)
- Dropdown กรองข้อมูล/กราฟ/ticket เฉพาะ device ที่เลือก
- คลิก Card เปลี่ยน filter ทั้ง Dashboard ทันที
- Auto Refresh อัปเดต Device Cards ทุก 30 วินาที
ขั้นตอนการติดตั้งระบบ
server/database.sql → สร้าง database bpacoth1_esp32 พร้อม 3 tables อัตโนมัติserver/api.php ไปที่ Web Hosting เช่น public_html/api.php — ตรวจสอบ DB credentials ใน api.php (DB_HOST, DB_USER, DB_PASS, DB_NAME)esp32/concrete_monitoring.ino ใน Arduino IDE → ติดตั้ง Libraries: DHT sensor library (Adafruit), OneWire (Paul Stoffregen), DallasTemperature (Miles Burton) → แก้ SSID, Password, API_URL → Upload | ถ้าไม่ใช้ DS18B20 ไม่ต้องต่อ Sensor — ระบบยังทำงานได้web/ ทั้ง folder ไปที่ Hosting หรือเปิด index.html ใน Browser — Dashboard จะดึงข้อมูลจาก API ทุก 15 วินาทีอัตโนมัติการแก้ปัญหา Upload ESP32
ปัญหาที่พบบ่อยเมื่อ Upload โค้ดจาก Arduino IDE ไปยัง ESP32
fatal error: OneWire.h: No such file or directory
compilation terminated.
| Library | โดย | หน้าที่ |
|---|---|---|
DHT sensor library | Adafruit | อ่านค่า DHT22 (อุณหภูมิ/ความชื้น) |
OneWire | Paul Stoffregen | โปรโตคอล OneWire สำหรับ DS18B20 |
DallasTemperature | Miles Burton | อ่านค่า DS18B20 (อุณหภูมิคอนกรีต) |
Sketch uses 1069408 bytes (81%) of program storage space. ✅
Failed uploading: no upload port provided ❌
COM3 / COM4 / COM5 ที่มี ESP32 ต่ออยู่Connecting... → ปล่อยปุ่มCH340 → ค้นหา "CH341SER driver download" | CP2102 → ค้นหา "CP210x driver silabs"
จากนั้น Restart เครื่อง แล้วลอง Upload ใหม่
Ctrl+Shift+M) ตั้ง Baud rate 115200 ควรเห็น:
================================
ระบบตรวจสอบคอนกรีตเรียลไทม์
================================
[WiFi] Connected! IP: 192.168.x.x
[NTP] Time synchronized
[SYSTEM] Ready! Starting monitoring...
Android App — ESP Monitor
แอปพลิเคชัน Android สร้างด้วย Capacitor ที่แปลง Web Dashboard เป็น Native App รองรับ Android 7.0 (API 24) ขึ้นไป
| ชื่อแอป | ESP Monitor |
| App ID | com.wattanacode.concretemonitoring |
| Min SDK | Android 7.0 (API 24) |
| Background Color | #1a1a2e (Dark Navy) |
| Framework | Capacitor 6.x |
| Web Scheme | HTTPS |
| Node.js | v18+ |
| Java JDK | 17+ |
| Android Studio | Hedgehog+ |
| Android SDK | API 24+ (Target 34) |
| Capacitor CLI | npx cap (ไม่ต้องติดตั้งแยก) |
concrete-monitoring/
npm install
web/ หรือ capacitor.config.json
npx cap sync android
npx cap open android
รอ Gradle Sync เสร็จ (ครั้งแรกใช้เวลาสักครู่)
APK จะอยู่ที่:
android/app/build/outputs/apk/debug/app-debug.apk
แก้ไขที่ capacitor.config.json
{
"appId": "com.wattanacode.concretemonitoring",
"appName": "ESP Monitor",
"webDir": "web",
"server": {
"androidScheme": "https"
},
"android": {
"allowMixedContent": true,
"backgroundColor": "#1a1a2e"
}
}
capacitor.config.json ต้องรัน npx cap sync android เสมอ
ไฟล์ .png ในโฟลเดอร์ android/app/src/main/res/
| โฟลเดอร์ | ขนาด |
|---|---|
mipmap-mdpi | 48 × 48 px |
mipmap-hdpi | 72 × 72 px |
mipmap-xhdpi | 96 × 96 px |
mipmap-xxhdpi | 144 × 144 px |
mipmap-xxxhdpi | 192 × 192 px |
"appName" แล้วรัน npx cap sync android
วิธีที่แนะนำ — sync จะอัปเดต strings.xml ให้อัตโนมัติ
android/app/src/main/res/values/strings.xml
แก้
app_name และ title_activity_main ตรงๆ
Libraries & Dependencies
- WiFi.h Built-in ESP32
- HTTPClient.h Built-in ESP32
- DHT.h Adafruit DHT Sensor Library
- OneWire.h Paul Stoffregen — OneWire Protocol
- DallasTemperature.h Miles Burton — DS18B20
- time.h NTP Time Sync
- PDO MySQL Connection
- PHP 7.4+ REST API
- MySQL 5.7+ Database
- CORS Header Allow-Origin *
- Chart.js 4.4 กราฟเรียลไทม์
- chartjs-adapter-date-fns Time Axis
- Font Awesome 6.5 Icons
- Google Fonts: Prompt Thai Typography