การสร้าง Industrial IoT Datalogger ด้วย ESP32 (Rust) + Cloudflare Serverless: จาก Zero Hardware สู่ Multi-Device System
เมื่อโจทย์คือการทำ Datalogger ระดับอุตสาหกรรมอ่านค่า Modbus RS-485 แต่ไม่มีอุปกรณ์จริงสักชิ้น! มาดูเส้นทางการแก้ปัญหาด้วยการสร้าง Simulator, เขียน Firmware ด้วยภาษา Rust บน ESP32 และวาง Architecture บน Cloudflare แบบ $0/เดือนที่รองรับขยายสเกลได้หลายอุปกรณ์
บทเรียนการสร้าง Industrial IoT Datalogger ด้วย ESP32 (Rust) + Cloudflare Serverless: จาก Zero Hardware สู่ Multi-Device System ในโลกของ Industrial IoT (IIoT) การอ่านค่าจากอุปกรณ์วัดระดับโรงงาน เช่น Power Meter หรือ Flow Meter ผ่านโปรโตคอล Modbus RS-485 และสัญญาณ Analog (4-20mA / 0-10V) ถือเป็นโจทย์มาตรฐานที่เจอกันบ่อยมากครับ แต่จะเกิดอะไรขึ้นถ้าเราต้องพัฒนาระบบนี้ขึ้นมาเพื่อพิสูจน์แนวคิด (Proof of Concept) หรือเตรียมสร้าง Portfolio ยื่นประมูลงาน โดยที่เราไม่มีทั้ง Power Meter, Flow Meter หรือโมดูล RS-485 จริงอยู่ในมือเลยแม้แต่ชิ้นเดียว? บทความนี้ผมจะมาแชร์ประสบการณ์และสถาปัตยกรรมระบบที่ผมออกแบบและพัฒนาขึ้นมาจริง โดยใช้ภาษา Rust บน ESP32 ร่วมกับ Cloudflare Serverless Ecosystem ที่นอกจากจะแก้ปัญหาเรื่องไม่มี Hardware จริงได้แล้ว ยังรันระบบบน Cloud ได้ฟรี ($0/เดือน) อีกด้วย! 1. แนวคิดการออกแบบระบบ Datalogger อุตสาหกรรม เป้าหมายของระบบนี้คือการสร้าง Datalogger ที่มีความเสถียรสูง สามารถเก็บค่าพารามิเตอร์ไฟฟ้า ค่าน้ำมัน/น้ำไหล และสัญญาณอนาล็อก แล้วยิงขึ้น Cloud เพื่อดูผลแบบ Real-time และกดดาวน์โหลดไฟล์รายงานย้อนหลังได้ 90 วัน ความท้าทายหลักๆ มี 3 เรื่อง: ความเสถียรฝั่ง Hardware: บอร์ดต้องทำงาน continuous 24/7 ได้โดยไม่ค้าง (Hang) หรือ Memory Leak ต้นทุนระบบ Cloud: ต้องไม่มีค่า Server รายเดือนมาคอยกวนใจในระยะเริ่มต้น การขยายระบบ (Scalability): ต้องรองรับการเพิ่มจำนวนตู้ควบคุม (ESP32) หลายๆ ตู้ในอนาคตได้โดยไม่ต้องเปลี่ยน Architecture หลัก 2. ทลายข้อจำกัด "ไร้เซนเซอร์จริง" ด้วยการสร้าง Simulator เมื่อไม่มีอุปกรณ์จริง วิธีแก้ปัญหาทางวิศวกรรมซอฟต์แวร์ที่ดีที่สุดคือ "การจำลอง (Simulation)" ครับ ผมออกแบบโครงสร้างข้อมูล (Struct) ในฝั่ง Firmware ให้มีรูปแบบเหมือนกับ Register ของ Modbus RTU และค่า Analog จริงๆ: Power Meter: จำลองค่า Voltage (220V \pm \text{noise}), Current, Power (kW) Flow Meter: จำลอง Flow Rate (m^3/h) ด้วยสูตรคณิตศาสตร์ Sine Wave เพื่อให้ค่าแกว่งขึ้นลงสมจริง และทำ Total Flow สะสม Analog Inputs: นำพิน ADC ของ ESP32 มาต่อเข้ากับตัวต้านทานปรับค่าได้ (Potentiometer) เพื่อหมุนจำลองแรงดัน 0-10\text{V} หรือกระแส 4-20\text{mA} แบบสดๆ หน้าโต๊ะทำงาน การทำ Simulator แบบนี้ทำให้เราสามารถเขียนโค้ดฝั่ง Network, Serialization (JSON) และ Cloud Backend รอไว้ได้เลย 100% โดยที่เมื่อได้อุปกรณ์ RS-485 จริงมาในอนาคต เราแค่สลับโมดูลอ่านค่าจาก Simulator ไปเป็น Driver RS-485 จริงเท่านั้น! 3. ทำไมต้องเขียน Firmware ESP32 ด้วยภาษา Rust? หลายคนอาจจะคุ้นเคยกับการเขียน ESP32 ด้วย C/C++ (Arduino IDE หรือ ESP-IDF) แต่ในโปรเจกต์นี้ผมเลือกใช้ Rust (esp-idf-hal / esp-idf-svc) ด้วยเหตุผลสำคัญดังนี้: Memory Safety: Rust ไม่มี Pointer สเปกตรัมที่อาจทำให้เกิด Memory Leak หรือระบบแฮงก์กลางอากาศ ซึ่งเป็นหัวใจสำคัญของงาน Industrial Concurrency ความไวสูง: การจัดการ Threading และ Async I/O ทำได้ปลอดภัย ไร้ปัญหา Data Race Ecosystem ที่เติบโต: ปัจจุบันโครงการ esp-rs ซัพพอร์ต ESP32 อย่างเป็นทางการ มีเครื่องมืออย่าง espup และ espflash ที่ทำให้การพัฒนาลื่นไหลมาก ในโค้ด Firmware ผมเขียนระบบ Wi-Fi Failover Logic ไว้ด้วย หาก Wi-Fi หลักหลุด บอร์ดจะทำการ Reconnect อัตโนมัติ หรือสลับไปต่อ SSID สำรองทันที พร้อมซิงค์เวลามาตรฐานผ่าน NTP ก่อนจะแพ็กข้อมูล JSON ยิงขึ้น Cloud 4. วางโครงสร้าง Cloudflare: Workers + D1 + R2 สำหรับฝั่ง Cloud หากเราไปใช้บริการ VM อย่าง AWS EC2 หรือ DigitalOcean เราจะต้องจ่ายค่า Server ทุกเดือน แม้จะไม่มีข้อมูลวิ่งก็ตาม ผมจึงเลือกใช้ Cloudflare Serverless Stack ที่มี Free Tier ใจกว้างมาก ขั้นตอนการ Setup Environment: Cloudflare Workers (API Gateway): ใช้ Hono Framework (TypeScript/Rust Wasm) สร้าง REST API รับ HTTP POST /ingest จาก ESP32 มีระบบ Validate Schema ของ JSON อย่างเข้มงวด Cloudflare D1 (Database): สร้าง Serverless SQLite บน Edge เพื่อเก็บ Log ข้อมูล ออกแบบ Table พร้อมสร้าง Index บนพิน device_id และ created_at เพื่อให้ Query ข้อมูลย้อนหลังได้ไวในระดับมิลลิวินาที Cloudflare R2 (Object Storage): สร้าง Bucket สำหรับจัดเก็บไฟล์ Backup/Export รายงาน CSV และ Excel 5. ทดลองส่งข้อมูล & ปรับปรุงให้รองรับ Multi-Device หลังจากทดสอบส่งข้อมูลจาก ESP32 บอร์ดแรกสำเร็จ โจทย์ถัดมาคือ "แล้วถ้าโรงงานมี ESP32 แยกกัน 10 ตู้ล่ะ?" ผมปรับปรุง Data Schema ให้ทุกๆ Payload ที่ส่งขึ้นมา ต้องมี device_id เป็น Unique Identifier พร้อมระบุสถานะเครือข่าย (เช่น SSID, RSSI)
ทางฝั่ง Cloudflare Workers ผมใช้เทคนิค Atomic Transaction ใน D1 เพื่ออัปเดต 2 ตารางพร้อมกันในการเรียกครั้งเดียว: ตาราง sensor_logs: เพิ่ม Record ข้อมูลใหม่เข้าคลัง ตาราง devices: อัปเดต last_seen และสถานะ Online/Offline ของอุปกรณ์ ผลลัพธ์คือ หน้า Web Dashboard สามารถแสดงรายชื่อตู้ ESP32 ทั้งหมดได้ในหน้าเดียว แยกสถานะ Online/Offline ของแต่ละตู้ได้แบบ Real-time! 6. จัดทำระบบ Backup ข้อมูล และดาวน์โหลดรายงานย้อนหลัง โจทย์ของงาน Industrial Datalogger คือ "ต้องโหลดไฟล์ Excel ย้อนหลังได้ 3 เดือน (90 วัน)" ผมแก้โจทย์นี้ด้วยการทำระบบ Data Lifecycle Management: Auto-Purge (Cron Trigger): เขียน Cron Job บน Cloudflare Workers ให้รันทุกเที่ยงคืน เพื่อลบข้อมูลใน D1 Database ที่มีอายุเกิน 90 วันโดยอัตโนมัติ ช่วยให้ขนาดความจุ D1 ไม่เคยเกินโควต้าฟรี (5 GB) Export Engine (CSV/Excel -> R2): เมื่อผู้ใช้เลือกช่วงเวลา (Date Range) บนหน้า Dashboard แล้วกด "Export" ตัว Workers จะไป Query ข้อมูลจาก D1 นำมาจัดฟอร์แมตเป็นไฟล์ .csv หรือ .xlsx แล้วอัปโหลดไปฝากไว้ที่ Cloudflare R2 จากนั้นจะส่งลิงก์ดาวน์โหลด (Presigned URL) กลับมาให้ผู้ใช้กดโหลดลงเครื่องทันที 🎯 สรุปผลลัพธ์ และสิ่งที่ได้เรียนรู้ โปรเจกต์นี้พิสูจน์ให้เห็นว่า การไม่มี Hardware จริง ไม่ใช่อุปสรรคในการพัฒนาระบบ IoT ระดับอุตสาหกรรม การใช้ Simulation ทำให้เราได้ระบบที่พร้อมใช้งาน 90% ตั้งแต่ก่อนเห็นหน้างานจริง นอกจากนี้ การจับคู่ระหว่าง ESP32 (Rust) + Cloudflare Serverless ยังมอบประโยชน์มหาศาล: ความเสถียร: โค้ด Rust ไร้ปัญหาเรื่อง Memory Leak ประหยัด: ค่า Server เป็น 0 บาท/เดือน บน Cloudflare Free Tier (รองรับการยิงข้อมูลได้สูงสุดถึง 100,000 requests/วัน) พร้อมใช้งานจริง: มีระบบ Multi-device, Dashboard และ Export File ครบตามสเปกงานอุตสาหกรรม สำหรับใครที่กำลังลังเลว่าจะเริ่มลองเขียน Rust บน ESP32 หรืออยากลองย้ายงาน IoT ขึ้น Cloudflare บอกได้เลยครับว่า "ลุยได้เลย มันคุ้มค่าและเปลี่ยนโลกการพัฒนาระบบ IoT ไปเลยครับ!"