หน้าแรก ดูโปรเจกต์ทั้งหมด
Easy

โปรเจกต์ IoT Pressure Sensor: MKR GSM + Arduino Cloud + Google Sheets

อุปกรณ์ IoT สำหรับ Monitor Pressure (0-150 psi) แบบ Remote โดยใช้ Cellular Data พร้อมรับ Notification เมื่อ Pressure สูงหรือต่ำกว่า Set-points ที่ตั้งไว้

โปรเจกต์ IoT Pressure Sensor: MKR GSM + Arduino Cloud + Google Sheets

วิดีโอสาธิต

Video

▶ กดเพื่อดูวิดีโอสาธิตโปรเจกต์

รายการอุปกรณ์และเครื่องมือ

1x DHT22 Temperature & Humidity Sensor
🛒 สั่งซื้อ
1x DS3231 RTC Module
🛒 สั่งซื้อ
2x 3.7V LiPo Battery (2000 mAh or greater)
🛒 สั่งซื้อ
1x Basic Starter Kit with Assorted LEDs & Resistors
🛒 สั่งซื้อ
1x Logic Level Converter - BSS138 - 4-channel I2C-safe Bi-directional
-
1x Voltage Step-up Converter
🛒 สั่งซื้อ
1x Breadboard (generic)
🛒 สั่งซื้อ
1x Pressure Transducer (0-150 psi)
-
1x Arduino MKR GSM 1400
-
}

รายละเอียดและวิธีทำ

วัตถุประสงค์

วัตถุประสงค์ของโปรเจกต์นี้คือการสร้างต้นแบบอุปกรณ์ราคาประหยัดสำหรับตรวจวัดความดันของอุปกรณ์อุตสาหกรรมในพื้นที่ห่างไกลโดยใช้ 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 ที่ใช้แปลงสัญญาณ Analog จาก Pressure transducer เป็นค่าความดัน (psi) อ้างอิงจากคำแนะนำในวิดีโอ YouTube ต่อไปนี้: https://www.youtube.com/watch?v=AB7zgnfkEi4
  • โพสต์ใน Arduino Forum เรื่อง "Serial Input Basics" มีประโยชน์อย่างมากในการเขียน Code เพื่อสื่อสารระหว่างอุปกรณ์โดยใช้ข้อมูล Serial: https://forum.arduino.cc/index.php?topic=288234.0

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

ขั้นตอนที่ 6: ใช้ Google Sheets เพื่อส่งการแจ้งเตือน

คุณอาจสังเกตเห็นว่ามีสองฟังก์ชันในไฟล์ JavaScript สำหรับโปรเจกต์นี้ (GoogleSheetsScript.js) ที่อ้างถึงในขั้นตอนที่ 4

  • ฟังก์ชัน doPost - ส่งข้อมูลจาก Arduino Cloud Webhook โดยจะทำงานเมื่อมีข้อมูลใหม่ใน Arduino Cloud
  • ฟังก์ชัน sendEmail - ส่งอีเมลตามค่าที่ดึงมาจากแผ่นงานที่ชื่อ "Data" ในไฟล์ Google Sheets ของโปรเจกต์ โดยจะทำงานทุกๆ หนึ่งนาทีตามการตั้งค่าในส่วน Trigger

ขั้นตอนการตั้งค่า Trigger สำหรับฟังก์ชัน sendEmail

  • เปิดไฟล์ Google Sheets
  • คลิก "เครื่องมือ (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)
  • Arduino Uno ($22)
  • 2 x แบตเตอรี่ LiPo 3.7V ($30)
  • 2 x หน้าจอแสดงผล LED ($29)
  • กล่องพลาสติกกันน้ำ ($22)
  • Pressure Sensor ($19)
  • Sensor วัดอุณหภูมิ / ความชื้น - DHT22 ($10)
  • RTC Module - DS3231 ($5)
  • วงจร Step-up Converter ($5)
  • Logic Level Converter ($4)
  • อื่นๆ - LED, ตัวต้านทาน, สายไฟ ฯลฯ ($25)

ฮาร์ดแวร์ / เครื่องมือ

ฮาร์ดแวร์และเครื่องมือทั้งหมดที่ใช้ในโปรเจกต์นี้ซื้อมาจากร้านค้าต่อไปนี้:

  • Harbor Freight
  • Home Depot

บทสรุป...

ขอบคุณที่สละเวลาตรวจสอบโปรเจกต์นี้

ยินดีรับคำถาม / ข้อเสนอแนะ / ความคิดเห็น และคำแนะนำทุกรูปแบบ

Code

🔒 ปลดล็อก Code

สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้

รหัสอ้างอิงโปรเจกต์: iot-pressure-sensor-mkr-gsm-arduino-cloud-google-sheets-4f507f
2450 บาท
PromptPay QR Code