บทนำและวัตถุประสงค์ของโปรเจกต์ (Objective)
ในยุคของ Internet of Things (IoT) การรวบรวมข้อมูลจากเซนเซอร์เป็นเพียงจุดเริ่มต้นเท่านั้น ความท้าทายที่แท้จริงคือการจัดการกับข้อมูลมหาศาล (Big Data) อย่างมีประสิทธิภาพ โปรเจกต์นี้ถูกออกแบบมาเพื่อนำเสนอสถาปัตยกรรมต้นแบบสำหรับการประมวลผลข้อมูลอุณหภูมิและความชื้นแบบ Real-time และ Batch processing โดยใช้บอร์ด Arduino (ESP8266) ร่วมกับเทคโนโลยี Open Source ในระบบนิเวศของ Big Data
หัวใจสำคัญของโปรเจกต์นี้คือการสร้างระบบที่ "Data-Agnostic" หรือไม่ยึดติดกับรูปแบบข้อมูลเฉพาะเจาะจงจากฮาร์ดแวร์ ทำให้สถาปัตยกรรมนี้มีความยืดหยุ่นสูง (Scalability) สามารถนำไปประยุกต์ใช้กับเซนเซอร์ประเภทอื่นๆ หรือขยายขอบเขตการทำงานได้ตามจินตนาการของวิศวกรผู้พัฒนา เพื่อเปลี่ยนจากข้อมูลดิบ (Raw Data) ให้กลายเป็นข้อมูลเชิงลึก (Insights) ที่นำไปใช้งานได้จริง
รายละเอียดเวอร์ชันซอฟต์แวร์ (Versions)
เพื่อให้ระบบทำงานประสานกันได้อย่างสมบูรณ์ โปรเจกต์นี้เลือกใช้ซอฟต์แวร์เวอร์ชันที่มีความเสถียรดังนี้:
- Arduino IDE: 1.8.5 (สำหรับการพัฒนา Firmware บน ESP8266)
- Apache Hive: 1.2.1 (สำหรับ Data Warehouse และ Batch Processing)
- Apache Kafka: 0.10.0 (สำหรับ Message Streaming ความเร็วสูง)
- Apache Spark: 1.6.2 (เครื่องมือประมวลผลข้อมูลขนาดใหญ่)
- Zeppelin Notebook: 0.6.0 (สำหรับการทำ Data Visualization และ Interactive Analytics)
- Apache NiFi: 1.2.0 (สำหรับการทำ Data Orchestration และ Flow Management)
สถาปัตยกรรมการไหลของข้อมูล (Data Flow)

1. การสร้างข้อมูลจากเซนเซอร์ (Data Generation)
ที่ระดับ Edge Computing ตัวบอร์ดจะทำการอ่านค่าจากเซนเซอร์ DHT (Temperature & Humidity) ทุกๆ 3 วินาที โดยข้อมูลที่จับได้ประกอบด้วย:
- ความชื้นสัมพัทธ์ในอากาศ (Percentage of Humidity)
- อุณหภูมิในหน่วยองศาเซลเซียส (°C) และฟาเรนไฮต์ (°F)
- Heat Index Calculation: ระบบจะคำนวณ "ดัชนีความร้อน" ซึ่งเป็นค่าที่บอกถึงอุณหภูมิที่มนุษย์รู้สึกจริง โดยคำนวณจากความสัมพันธ์ระหว่างอุณหภูมิและความชื้น
- Time Synchronization: ตัวเครื่องจะส่ง Request ไปยัง External Web Service (NTP Server) เพื่อดึงเวลาที่แม่นยำตาม Time Zone ที่กำหนด ทำให้ข้อมูลทุกชุดมี Timestamp ที่ถูกต้อง
2. การส่งข้อมูลผ่านโปรโตคอล MQTT (Data Publication)
เมื่อได้ข้อมูลครบถ้วน บอร์ดจะทำการแพ็กข้อมูลลงในรูปแบบ JSON Payload ซึ่งประกอบด้วยค่าจากเซนเซอร์, ข้อมูลที่คำนวณได้, วันเวลา, Milliseconds นับตั้งแต่เริ่มทำงาน และ Unique Identifier ของอุปกรณ์ จากนั้นจะทำการตรวจสอบการเชื่อมต่ออินเทอร์เน็ตและ MQTT Broker ก่อนจะ Publish ข้อมูลไปยัง Topic ที่กำหนดภายใต้ระบบรักษาความปลอดภัย (Username/Password)
3, 4 & 5. การดักจับข้อมูลแบบ Real-time ด้วย Apache NiFi
Apache NiFi ทำหน้าที่เป็นตัวจัดการการไหลของข้อมูล (Orchestrator):
- Subscription: NiFi เชื่อมต่อไปยัง Mosquitto (MQTT Broker) เพื่อดักฟังข้อความที่เข้ามาแบบ Real-time
- Data Enrichment: เพิ่มฟิลด์ข้อมูลทางเทคนิค (Metadata) เข้าไปใน JSON เดิม เพื่อระบุแหล่งที่มาและรายละเอียดของ Broker
- Dual-Path Distribution:
- ส่งข้อมูลเข้าสู่ Apache Hive เพื่อเก็บเป็นข้อมูลประวัติ (Historical Data) สำหรับการวิเคราะห์ย้อนหลังแบบ Batch
- ส่งข้อมูลเข้าสู่ Apache Kafka เพื่อเตรียมพร้อมสำหรับการประมวลผลแบบ Stream Processing ที่ต้องการความหน่วงต่ำ (Low Latency)
6 & 7. การประมวลผลและการวิเคราะห์ (Data Processing & Analytics)
ในส่วนสุดท้าย ข้อมูลจะถูกประมวลผลผ่าน Zeppelin Notebook โดยใช้ภาษา Scala และ SQL บน Engine ของ Spark:
- ทำการ Query ข้อมูลจาก Hive เพื่อดูแนวโน้มย้อนหลัง
- เชื่อมต่อกับ Kafka Topic เพื่อประมวลผลข้อมูลแบบ Windowing (เช่น การหาค่าเฉลี่ยอุณหภูมิในทุกๆ 1 นาที)
- นำข้อมูลที่ประมวลผลแล้วกลับไปบันทึกลงใน Hive เพื่อสร้าง Report ต่อไป
รายละเอียดทางเทคนิคและการตั้งค่า (Technical Details)
ไลบรารีที่จำเป็น (Libraries)
- Adafruit Unified Sensor & DHT sensor library: สำหรับการติดต่อสื่อสารกับเซนเซอร์ DHT11/DHT22
- PubSubClient: สำหรับการเชื่อมต่อโปรโตคอล MQTT
- NTPClient & Time: สำหรับการจัดการเวลาผ่านเครือข่าย
การตั้งค่า Arduino IDE สำหรับ ESP8266
เนื่องจากโปรเจกต์นี้รันบนโมดูล ESP8266 โดยตรง (ซึ่งมีประสิทธิภาพสูงกว่า Arduino Uno ในด้านความเร็วและหน่วยความจำ) จึงต้องตั้งค่าดังนี้:
- Board: "ESP8266 Generic Module"
- CPU Frequency: 80 MHz
- Flash Size: 512K
- Upload Speed: 115200
ข้อควรระวัง: การ Upload โปรแกรมลงใน ESP8266 จำเป็นต้องเข้าสู่ Flash Mode โดยการจัดขา Pin ตามไดอะแกรม Pinout ที่กำหนด และแนะนำให้ตรวจสอบว่าไม่มีโปรแกรมอื่นค้างอยู่ในบอร์ด Arduino ที่อาจรบกวนการสื่อสาร Serial ได้
ผลการทดสอบและการทำงาน (Execution & Observations)
เมื่อระบบเริ่มทำงาน เราสามารถติดตามสถานะได้ผ่าน Serial Monitor ซึ่งจะแสดงขั้นตอนการเชื่อมต่อ WiFi, การดึงเวลาจาก NTP และการ Publish ข้อความไปยัง MQTT Broker

ความน่าสนใจของระบบนี้คือการทำงานที่ขนานกัน (Parallelism) เมื่อเราดูภาพเปรียบเทียบระหว่างการรับข้อมูลใน Mosquitto (ซ้าย) และ Kafka (ขวา) จะเห็นว่าข้อมูลถูกส่งผ่าน NiFi ไปยัง Kafka แทบจะทันที (Near Real-time)

ในฝั่งของ Data Warehouse (Hive) จำนวน Record จะเพิ่มขึ้นอย่างต่อเนื่องตามรอบการส่งข้อมูล ซึ่งเราสามารถใช้ SQL Query เพื่อตรวจสอบความถูกต้องของข้อมูลได้ตลอดเวลา

การวิเคราะห์ระดับสูงด้วย Zeppelin & Spark
โปรเจกต์นี้ไม่ได้หยุดแค่การเก็บข้อมูล แต่ยังรวมถึงการใช้ Machine Learning เบื้องต้น:
- Windowed Averaging: คำนวณค่าเฉลี่ยอุณหภูมิในช่วงเวลาที่กำหนด
- K-means Clustering: จัดกลุ่มข้อมูลอุณหภูมิและความชื้นเพื่อจำแนกสภาวะแวดล้อมโดยอัตโนมัติ
- Visualization: สร้างกราฟเส้นแสดงแนวโน้มอุณหภูมิ (°C/°F) และความชื้นเทียบกับเวลา



แนวทางการพัฒนาในอนาคต (Next Improvements)
เพื่อให้โปรเจกต์สมบูรณ์ยิ่งขึ้น สามารถพัฒนาต่อยอดได้ในหัวข้อต่อไปนี้:
- การรวมเซนเซอร์หลายประเภท (Multi-sensor integration) เข้ากับบอร์ดเดียว
- การใช้เทคนิค Multiplexing เพื่อรับสัญญาณจากเซนเซอร์จำนวนมากผ่านโมดูล WiFi
- การเพิ่มส่วนแสดงผลที่ตัวอุปกรณ์ เช่น จอ OLED, ไฟ LED แจ้งเตือนสถานะ หรือเสียง Alarm เมื่ออุณหภูมิเกินกำหนด
- การออกแบบวงจรที่มีปุ่มกดภายนอกสำหรับสลับโหมด Flash/Run เพื่อความสะดวกในการพัฒนา
แหล่งข้อมูลอ้างอิง (Source)
คุณสามารถดูโค้ดฉบับเต็ม (Sketches), เทมเพลตของ NiFi, Zeppelin Notebooks และข้อมูลทดสอบได้ที่: Github Repository: arduino-temperature-streaming-demo
(หมายเหตุ: ปัจจุบันเนื้อหาใน Repository เป็นภาษาสเปน ซึ่งเป็นโอกาสอันดีในการฝึกทักษะภาษาไปพร้อมกับการเรียนรู้เทคโนโลยี Big Data!)