[IoT] เชื่อมต่อโลกฮาร์ดแวร์ และ สร้างระบบแจ้งเตือนผ่าน LINE Notify

Teerapong Singthong 👨🏻‍💻
iamgoangle
Published in
3 min readJun 12, 2019

สร้างระบบ Notification ง่ายๆ โดยใช้ NodeMCU ด้วยการรับค่าจาก Sensor แล้วส่งตรงไปยัง LINE Notify

บทความนี้ใช้วิธีการส่งข้อมูลแบบ Direct โดยไม่ผ่าน MQTT / IFTTT หรือ Public Cloud Service

1. บริการ LINE Notify คืออะไร และ สร้างอย่างไร

ขั้นตอนในการสร้าง LINE Notify ขึ้นมาใหม่ ผู้อ่านสามารถอ่านขั้นตอน และ วิธีการทำได้จากลิงค์ด้านล่างนี้ครับ

1.1 ทดสอบการ Push to LINE Notify

curl -X POST \
https://notify-api.line.me/api/notify \
-H 'Authorization: Bearer <your_token>' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'cache-control: no-cache' \
-d 'message=test'

your_token คือ authorization token ได้มาจากขั้นตอนที่ 1

Parameter อื่นๆ สามารถดูได้จากที่นี่ https://notify-bot.line.me/doc/en/

2. แนวทางการประยุกต์

ในโลกของไมโครคอนโทรลเลอร์ เราสามารถใช้ sensor ใดๆ ก็ได้มาต่อเข้ากับ NodeMCU หรือ บอร์ดชนิดใดก็ได้ ท่ีมีโมดูล WiFi สามารถเชื่อมต่อกับ Internet โดยการประยุกต์รับค่าจาก sensor ไม่ว่าจะเป็น Analog / Digital Input แล้วให้ตัวบอร์ด ส่งข้อมูลผ่าน HTTP / MQTT ไปยัง LINE Notification service

ตัวอย่างโปรเจคที่น่าสนใจ

  • โปรเจคช่วยผู้สูงอายุ SOS กดปุ่มส่ง Notify หาครอบครัว
  • โปรเจคตรวจสอบความร้อน / ความชื้น / ฝนตก
  • โปรเจคตรวจสอบอุณหภูมิ
  • โปรเจควัดความเข้มแสง ให้เปิดไฟอัตโนมัติ และ ส่ง Notifiy บอก
  • โปรเจคตรวจจับความเคลื่อนไหว
  • โปรเจคเตือนรดน้ำต้นไม้ เมื่อเซนเซอร์อ่านความชื้นในดินแล้วพบว่าค่าน้อย
  • อื่นๆ อีกมากมาย

ซึ่งโปรเจคที่เป็นไปได้นั้น ค่อนข้างอิสระที่จะนำเซนเซอร์มาใช้ตามจุดประสงค์ของแต่ละงาน แต่สิ่งที่คล้ายกัน คือ อ่านค่าเซนเซอร์ และ ส่งต่อไปยัง LINE Notify

2.1 ตัวอย่างโปรเจค “ไม่พลาดทุกการเตือน เมื่อมีการกดปุ่ม”

อุปกรณ์

  1. NodeMCU ESP8266 / ESP32
  2. Resister 220Ω
  3. Switch
  4. Breadboard
  5. สาย Jumper

วงจร

ตัวอย่างการต่อแบบ Simple เพื่อส่ง LINE Notify เมื่อกดปุ่ม

Code

Line: 1–4

Library ที่ใช้ในโปรเจคนี้

Line: 6–12

กำหนด WiFi SSID และ Password ที่ให้บอร์ดเชื่อมต่อ ซึ่งผมสร้าง network driver ้เอาไว้ว่าจะใช้จาก blynk library หรือ ESP8266WiFi library

Line: 15

ใส่ Blynk token ที่ได้มา https://medium.com/iamgoangle/iot-blynk-to-on-off-led-ddc49ff891c2

Line: 17–21

LINE Notify server ที่เราจะส่งข้อมูลไปหาจากบอร์ด โดย fingerprint ผมหามาให้เรียบร้อยแล้ว

Line: 29–33

พวก delay timer ยังไม่ได้ใช้ตอนนี้ แต่โปรเจคถัดไปจะได้ใช้ครับ ซึ่งมันจะเกี่ยวของกับ Non/Blocking Timer

Line: 36–37

กำหนด digital input และ output โดยที่ Switch = D2 เทียบเท่ากับ GPIO04 หรือ ขา 19 บนบอร์ด ทำหน้าที่รับ Input เข้ามา และ LED = D3 เทียบเท่ากับ GPI00 หรือ ขา 18 ทำหน้าที่ส่ง Output ออกไป

Line: 39–73

ฟังก์ชันเชื่อมต่อ WiFi

Line: 75–140

ฟังก์ชันส่ง LINE Notify โดยกำหนด parameter msg ชนิด String เพื่อใช้ส่งข้อความ และ debug ชนิด boolean เพื่อ debug payload ที่ส่งผ่าน HTTP Request

Line: 154–163

กำหนด buadrate ที่ 115200 ความเร็วในการส่งสัญญาน

pinMode(sw, INPUT_PULLUP); กำหนดไว้ว่าสัญญานสำหรับ switch เป็น 1 เสมอ คือ ปุ่มยังไม่กด

pinMode(led, OUTPUT); กำหนดให้ขา D3 ทำหน้าที่ส่ง output

Line: 168–183

เป็นโค๊ดง่ายๆ ในการอ่าน digital input ถ้ากดปุ่มสัญญานที่ได้รับจะเท่ากับ 0 ให้ไฟติด และ ส่ง LINE Notify แต่ถ้าไม่ให้ปิดไฟ

Certificate Fingerprint คืออะไร?

เป็นค่า hash value แทนที่จะที่นำเสนอ public certificate key แบบเต็มๆ เพื่อให้ client เอาค่า hash นี้มาตรวจสอบก่อนว่า hash เปลี่ยนไปหรือไม่? ถ้าไม่ก็ถือว่า cerificate ไม่น่าเชื่อถือไปเลย (fail fast) แต่ถ้าถูกต้องค่าตรงกับใน rom ก็เอา certificate ไป verify กับ CA เพื่อยืนยันว่าปลายทางเป็นเจ้าของ certificate จริงๆ

— ที่มา สอนแฮกเว็บแบบแมวๆ และ Wikipedia

สามารถเอาค่า fingerprint มาจากไหน?

openssl x509 -noout -fingerprint -sha1 -inform pem -in [certificate-file.crt]

เราจะใช้ SHA-1 สำหรับค่าใน NodeMCU ครับ — ที่มา digicert

Demo

2.2 ส่งค่าความชื้น และ อุณหภูมิ ทุกๆ 1 ชม ไปหา LINE Notify

อุปกรณ์

  1. MHT11 ทำหน้าที่วัด Humidity และ Temperature
  2. NodeMCU ESP8266 หรือ ESP32
  3. Breadboard
  4. สาย Jumper

Circuit

Code

แนะนำให้ใช้ millis() แทน delay()

เราต้องสร้าง scheduler job โดยใช้ millis() แทนที่จะใช้ delay() สาเหตุเพราะ millis() เป็น Non Blocking I/O ในขณะที่ delay() นั้นเป็น Blocking I/O

Demo

จะเห็นได้ว่าการทำโปรเจค IoT กับการส่ง LINE Notify นั้นไม่ยากเลยใช่ไหมครับ สุดท้ายผมก็ขอให้ผู้อ่านทุกท่านสนุกกับโปรเจค IoT และ ประยุกต์ใช้ LINE API และ บริการอื่นๆของไลน์กันเยอะๆนะครับ :)

บทความตอนต่อไป ผมอยากจะลองใช้ MQTT Cloud กับงาน Motion Sensor หรือ งานควบคุมอุปกรณ์ไฟฟ้าในบ้าน ผ่านระบบอินเตอร์เน็ต รอติดตามกันนะครับผม

--

--

Teerapong Singthong 👨🏻‍💻
iamgoangle

Engineering Manager, ex-Solution Engineering Lead at LINE | Tech | Team Building | System Design | Architecture | SWE | Large Scaling System