วัตถุประสงค์ วัตถุประสงค์ของโปรเจกต์นี้คือการสร้างต้นแบบอุปกรณ์ราคาประหยัดสำหรับตรวจวัดความดันของอุปกรณ์อุตสาหกรรมในพื้นที่ห่างไกลโดยใช้ Cellular data
Schematic (ขยายเพื่อดูรายละเอียด)
เกจวัดความดันแบบ Analog = ~85 psi & ค่าที่อ่านได้แบบ Digital = 84.80 psi ขั้นตอนการทำงานของโปรเจกต์ ต่อไปนี้คือขั้นตอนการทำงานทีละขั้นของโปรเจกต์ โดยเริ่มตั้งแต่การไหลของข้อมูลจาก Pressure transducer ไปจนถึงการแจ้งเตือนทางอีเมลที่สร้างโดย Script ที่แนบมากับ Google Sheet
ขั้นตอนที่ 1: จาก Pressure Transducer ไปยัง Uno Pressure transducer จะเปลี่ยนค่าความดันให้เป็นสัญญาณไฟฟ้าแบบ Analog
Arduino Uno จะแปลงสัญญาณ Analog จาก Pressure transducer ให้เป็นค่าความดัน (psi)
ขั้นตอนที่ 2: จาก Uno ไปยัง MKR GSM 1400 ผ่าน Serial เมื่อทำการสื่อสารระหว่างอุปกรณ์ Arduino สองตัวผ่าน Serial:
เชื่อมต่อ RX ของอุปกรณ์ตัวที่ 1 เข้ากับ TX ของอุปกรณ์ตัวที่ 2 เชื่อมต่อ TX ของอุปกรณ์ตัวที่ 1 เข้ากับ RX ของอุปกรณ์ตัวที่ 2 อุปกรณ์ทั้งสองต้องมี Ground ร่วมกัน ความถี่ในการส่งข้อมูล (จาก Uno ไปยัง MKR GSM 1400)
ภาวะปกติ (NORMAL): ทุกๆ 30 นาที (transmitFrequency) Uno จะทำการ serial.print ข้อมูลไปยัง MKR GSM 1400 ซึ่งจะส่งข้อมูลต่อไปยัง Cloud การกระตุ้นด้วยค่าสูง/ต่ำ (HIGH/LOW TRIGGER): หากความดันสูงกว่า 40 psi (highTrigger) หรือต่ำกว่า 20 psi (lowTrigger) และค้างอยู่ในสถานะนั้นนานกว่า 2 นาที (dtLastTriggerLimit) Uno จะทำการ serial.print ข้อมูลไปยัง MKR GSM 1400 ซึ่งจะส่งข้อมูลต่อไปยัง Cloud การเรียกดูข้อมูลทันที (DEMAND POLL): หาก Pin A1 บน Uno ถูกกระตุ้นให้เป็น High จะมีการ serial.print ข้อมูลไปยัง MKR GSM 1400 เพื่อส่งข้อมูลไปยัง Cloud หมายเหตุ: Pin A1 ถูกตั้งชื่อว่า "buttonPin" ใน Code สำหรับ Uno โดย Pin A1 สามารถเป็น High ได้ 2 วิธี (1) กดปุ่ม Push button บน Breadboard (2) หาก Pin A3 บน MKR GSM 1400 เป็น High มันจะกระตุ้นให้ Pin A1 เป็น High เนื่องจาก Pin A3 ถูกควบคุมโดย Input ใน Arduino Cloud เราจึงสามารถเรียกดูค่าความดันปัจจุบันจากระยะไกลได้ตลอดเวลาโดยไม่ต้องรอรอบการส่งข้อมูลปกติ หมายเหตุ
Code สำหรับ Uno สามารถปรับแต่งเพื่อตรวจสอบ Input อื่นๆ เพิ่มเติมได้ เช่น อุณหภูมิ, ความชื้น, แรงดันแบตเตอรี่ เป็นต้น พร้อมกำหนดจุดแจ้งเตือน High และ Low เพิ่มจากค่าความดันในเวอร์ชันปัจจุบัน Code ที่ใช้สำหรับ Arduino Uno ในโปรเจกต์นี้แนบมาพร้อมกับคำอธิบายข้อมูลสำคัญในส่วน Comment
ชื่อไฟล์: "InstrumentReader"
ขั้นตอนที่ 3: จาก MKR GSM 1400 ไปยัง Arduino Cloud ผ่าน Cellular MKR GSM 1400 จะประมวลผลข้อมูล Serial จาก Arduino Uno และส่งข้อมูลไปยัง Arduino Cloud โดยใช้ Cellular data
สิ่งที่ควรทราบคือใน Code สำหรับ MKR GSM 1400 คุณจะเห็นการใช้ Serial1.read แทน Serial.read ข้อมูลอ้างอิงบนเว็บไซต์ Arduino มีคำอธิบายที่ดีมาก โดยตารางในรูปภาพด้านล่างแสดงให้เห็นว่า Pin TX/RX บนบอร์ดตระกูล MKR จะเข้าถึงได้ผ่าน Serial1
https://www.arduino.cc/reference/en/language/functions/communication/serial/
เอกสารอ้างอิง Serial บนเว็บไซต์ Arduino -- Pin TX/RX บนบอร์ด MKR เข้าถึงผ่าน Serial1 Arduino Cloud
โปรเจกต์นี้ตั้งค่าด้วย 2 ตัวแปรใน Arduino Cloud รูปภาพด้านล่างแสดงวิธีการแสดงผลตัวแปรเหล่านี้บน Dashboard ของ Arduino Cloud
Arduino Cloud Dashboard ตัวแปรแรกชื่อ "dataStringCloud" เปรียบเสมือนแพ็กเกจที่รวมข้อมูลทั้งหมดจากอุปกรณ์ วิธีการนี้ถูกนำมาใช้แทนการแยกหนึ่งตัวแปรต่อหนึ่งค่า เพื่อให้ง่ายต่อการประมวลผลข้อมูลใน Google Sheets เพราะการใช้ชื่อตัวแปรแยกกันทำให้ยากต่อการระบุว่าค่าที่ส่งมานั้นคงเดิมหรือข้อมูลไม่อัปเดต ข้อมูลจากแพ็กเกจนี้จะถูกแยก (Parsed) ใน Google Sheets อีกครั้ง
ตัวแปรที่สองชื่อ "pinCloud" ใช้สำหรับควบคุม MKR GSM 1400 จาก Arduino Cloud โดยมีฟังก์ชัน Switch ใน Code ที่ควบคุมการทำงานตามค่าของ pinCloud เมื่อ pinCloud = 1 ขา A1 จะถูกกระตุ้นให้เป็น High ทำให้ LED บนบอร์ดสว่างขึ้น เมื่อ pinCloud = 2 ขา A3 จะถูกกระตุ้นให้เป็น High ซึ่งส่งผลให้ Arduino Uno ส่งข้อมูลปัจจุบันตามที่ได้อธิบายไว้ข้างต้น
Code ที่ใช้สำหรับ Arduino MKR GSM 1400 ในโปรเจกต์นี้แนบมาพร้อมกับคำอธิบายข้อมูลสำคัญในส่วน Comment
ชื่อไฟล์: "CommunicationsDevice"
ขั้นตอนที่ 4: จาก Arduino Cloud ไปยัง Google Sheets ผ่าน Webhook ข้อมูลจะถูกถ่ายโอนจาก Arduino Cloud ไปยัง Google Sheets โดยใช้ Webhook
หัวใจสำคัญของ Webhook คือฟังก์ชัน doPost ที่เขียนไว้ใน Script ของไฟล์ Google Sheets
นี่คือสรุปวิธีการตั้งค่า Webhook แบบรวดเร็ว โปรดทราบว่ากระบวนการเริ่มที่ Google Sheets คุณจะยังไม่ไปที่ Arduino Cloud จนกว่าจะถึงขั้นตอนสุดท้าย เพื่อที่จะไปจาก A ไป B ให้เริ่มที่ B ก่อน
สร้างไฟล์ Google Sheets ใหม่ คลิก "เครื่องมือ (Tools)" บนแถบเครื่องมือ และเลือก "โปรแกรมแก้ไขสคริปต์ (Script editor)" เขียน Code พร้อม ฟังก์ชัน doPost (อ้างอิงจากไฟล์ GoogleSheetsScript.js ที่แนบมากับโปรเจกต์นี้) คลิก "ทำให้ใช้งานได้ (Publish)" บนแถบเครื่องมือ และเลือก "ใช้งานเป็นแอปพลิเคชันเว็บ... (Deploy as web app...)" หน้าต่างโต้ตอบจะปรากฏขึ้นพร้อม 3 ช่องข้อมูล (1) เวอร์ชันโปรเจกต์ (Project Version): ให้เลือก "ใหม่ (New)" เสมอ หลังจากการอัปเดตครั้งแรก มันจะขึ้นเป็นหมายเลขเวอร์ชันปัจจุบัน หากคุณไม่เลือก "ใหม่" การเปลี่ยนแปลงจะไม่ส่งผล (2) เรียกใช้แอปในชื่อ (Execute the App as): "ฉัน (อีเมลของคุณ@gmail.com)" (3) ใครที่มีสิทธิ์เข้าถึงแอป (Who has access to the app): "ทุกคน แม้แต่บุคคลนิรนาม (Anyone, even anonymous)" กด Deploy หลังจากตรวจสอบค่าในทั้ง 3 ช่องแล้ว หน้าต่างโต้ตอบที่สองจะปรากฏขึ้นพร้อม "URL ของแอปพลิเคชันเว็บปัจจุบัน (Current web app URL)" นี่คือ URL ที่คุณต้องคัดลอกและวางลงในแท็บ Webhook บน Arduino Cloud URL นี้จะคงเดิมเสมอไม่ว่าจะเปลี่ยนเวอร์ชันโปรเจกต์ก็ตาม คลิกตกลง และเสร็จสิ้นขั้นตอน! ส่วนสำคัญของ Code JavaScript ที่ใช้ในโปรเจกต์นี้มีต้นแบบมาจากโปรเจกต์อื่นที่ชื่อ "Arduino IoT Cloud Google Sheets Integration" สามารถดูลิงก์โปรเจกต์ได้ด้านล่าง
https://create.arduino.cc/projecthub/Arduino_Genuino/arduino-iot-cloud-google-sheets-integration-71b6bc?ref=part&ref_id=64347&offset=9
ขั้นตอนที่ 5: ใช้ Google Sheets เพื่อแยกข้อมูล (Parse Data) ใช้ Google Sheets เพื่อแยกค่าแต่ละตัวจาก dataStringCloud และแสดงรายการข้อมูลที่ไม่ซ้ำกันซึ่งถูกส่งมาจาก Arduino Cloud
ลิงก์ด้านล่างคือไฟล์ Google Sheets ที่ใช้สำหรับการทดสอบอุปกรณ์ล่าสุด เซลล์ในไฟล์นี้ถูกใส่สีตามวิธีการนำเข้าข้อมูลตามที่ระบุไว้ในคำอธิบายสัญลักษณ์ (Legend) ของแต่ละแผ่นงาน
https://docs.google.com/spreadsheets/d/1XwCir2Llw8RvGPGgZI3Yk6U5a3LeIfUACNuO1Gr_LFQ/edit?usp=sharing
แผ่นที่ 1 จาก 5 - RawData - เซลล์ทั้งหมดในแผ่นนี้ถูกเติมข้อมูลโดย Code JavaScript แผ่นที่ 2 จาก 5 - DataParsed - ใช้ฟังก์ชัน "split" เพื่อแยกข้อมูลจาก dataStringCloud แผ่นที่ 3 จาก 5 - DataFiltered - ใช้ฟังก์ชัน "filter" & "unique" เพื่อแสดงข้อมูลที่แตกต่างกัน แผ่นที่ 4 จาก 5 - Data - จัดระเบียบข้อมูลจาก DataFiltered เป็นแหล่งข้อมูลสำหรับฟังก์ชัน sendEmail แผ่นที่ 5 จาก 5 - กราฟ ขั้นตอนที่ 6: ใช้ Google Sheets เพื่อส่งการแจ้งเตือน คุณอาจสังเกตเห็นว่ามีสองฟังก์ชันในไฟล์ JavaScript สำหรับโปรเจกต์นี้ (GoogleSheetsScript.js) ที่อ้างถึงในขั้นตอนที่ 4
ฟังก์ชัน doPost - ส่งข้อมูลจาก Arduino Cloud Webhook โดยจะทำงานเมื่อมีข้อมูลใหม่ใน Arduino Cloud ฟังก์ชัน sendEmail - ส่งอีเมลตามค่าที่ดึงมาจากแผ่นงานที่ชื่อ "Data" ในไฟล์ Google Sheets ของโปรเจกต์ โดยจะทำงานทุกๆ หนึ่งนาทีตามการตั้งค่าในส่วน Trigger ขั้นตอนการตั้งค่า Trigger สำหรับฟังก์ชัน sendEmail
คลิก "เครื่องมือ (Tools)" บนแถบเครื่องมือ เลือก "โปรแกรมแก้ไขสคริปต์ (Script Editor)" จากหน้าต่าง Script editor ให้ดำเนินการต่อดังนี้: คลิก "แก้ไข (Edit)" บนแถบเครื่องมือ เลือก "ทริกเกอร์ของโครงการปัจจุบัน (Current project's triggers)" จากหน้าต่าง G Suite Developer Hub ให้ดำเนินการต่อดังนี้: เลือก "เพิ่มทริกเกอร์ (Add Trigger)" ที่มุมขวาล่างของหน้าต่าง ในหน้าต่างโต้ตอบ ให้เลือกตั้งค่าเพื่อให้ฟังก์ชัน sendEmail ทำงาน หมายเหตุ: การเรียกใช้ Trigger ตามเวลา (Time-Driven) ทำให้สามารถสร้างการแจ้งเตือนทางอีเมลได้เมื่ออุปกรณ์หยุดอัปเดตข้อมูล Google Sheets - Script - การตั้งค่า Trigger อายุการใช้งานแบตเตอรี่ ~24 ชั่วโมง
ส่วนนี้สามารถปรับปรุง (Optimize) ได้โดยการปิดหรือถอดหน้าจอแสดงผลออก อีกทางเลือกหนึ่งคือการถอด Sensor ที่ไม่จำเป็นออก เช่น DHT22 และ DS3231
การใช้งานข้อมูล (Data Usage) ~0.7 เมกะไบต์ต่อวัน
สามารถปรับปรุงได้โดยการลดขนาดหรือความถี่ในการส่งข้อมูล เช่น เพื่อลดขนาดข้อมูล ให้ส่งเฉพาะค่าความดันแทนที่จะส่งทั้งความดัน, อุณหภูมิ, ความชื้น และเวลา หรือเพื่อลดความถี่ ให้ส่งข้อมูลทุกชั่วโมงแทนที่จะเป็นทุก 30 นาที
ต้นทุนโปรเจกต์ รวมทั้งหมด = $241
Arduino MKR GSM 1400 ($70) 2 x แบตเตอรี่ LiPo 3.7V ($30) 2 x หน้าจอแสดงผล LED ($29) Sensor วัดอุณหภูมิ / ความชื้น - DHT22 ($10) วงจร Step-up Converter ($5) Logic Level Converter ($4) อื่นๆ - LED, ตัวต้านทาน, สายไฟ ฯลฯ ($25) ฮาร์ดแวร์ / เครื่องมือ ฮาร์ดแวร์และเครื่องมือทั้งหมดที่ใช้ในโปรเจกต์นี้ซื้อมาจากร้านค้าต่อไปนี้:
Pressure Transducer หน้าจอแสดงผล I2C กล่องพลาสติก หัวแร้งบัดกรี ข้อต่อเคเบิลแกลน, ปืนเป่าลมร้อน และท่อหด สายไฟขนาด 22 Gauge - ขนาดพอดีสำหรับใช้งานกับ Breadboard มัลติมิเตอร์ มัลติมิเตอร์พร้อมสายวัดขนาด 22 Gauge วาล์วถัง 1/8" NPT สายไฟแบบเกลียว (5 x 18 Gauge) -- หาซื้อได้ง่าย บทสรุป... ขอบคุณที่สละเวลาตรวจสอบโปรเจกต์นี้
ยินดีรับคำถาม / ข้อเสนอแนะ / ความคิดเห็น และคำแนะนำทุกรูปแบบ