กลับไปหน้ารวมไฟล์
wireless-alert-bell-using-adafruit-io-58c62b.md

ในโปรเจกต์นี้ พี่ใช้ ESP8266-01 ตัวนึงเป็นตัวส่งสัญญาณเตือนไปยังจุดหมายปลายทาง (ซึ่งก็คือ Buzzer ที่ต่อกับ NodeMCU) ผ่านทางอินเทอร์เน็ต โดยใช้ MQTT Protocol ตัวปุ่มกดเตือนสามารถกดได้จากที่ไหนก็ได้ในโลก ตราบใดที่ทั้งสอง ESP8266 ต่ออินเทอร์เน็ตผ่าน WiFi ได้ ตัวปุ่มกดเดียวนี่แหละ ทำได้หลายฟังก์ชันเลย

  1. กดสั้นๆ (ประมาณ 500 ถึง 1500 มิลลิวินาที) - จะส่งสัญญาณเตือนแบบที่ 1 (alert-1) โดยให้ Buzzer ดังเป็นจังหวะสั้นๆ
  2. กดค้างยาวๆ (มากกว่า 1500 มิลลิวินาที) - จะส่งสัญญาณเตือนแบบที่ 2 (alert-2) โดยให้ Buzzer ดังค้างเลย
  3. กดจิ๊บเดียว (น้อยกว่า 500 มิลลิวินาที) - ปิดการเตือนทั้งหมด

MQTT Protocol

MQTT เป็นโปรโตคอลส่งข้อมูลแบบเบาๆ ที่ใช้หลักการ Publish/Subscribe ในการแลกเปลี่ยนข้อมูลระหว่าง Client กับ Server พี่เลือกใช้เจ้านี่เพราะมันเหมาะสุดๆ สำหรับทำโปรเจกต์ "Internet of things" มันเร็ว ใช้แพ็กเก็ตข้อมูลน้อย และออกแบบมาสำหรับอุปกรณ์ที่มีทรัพยากรจำกัด

MQTT Broker ทำหน้าที่เป็นตัวกลางแลกเปลี่ยนข้อมูลระหว่าง Client (NodeMCU และ ESP8266-01) โดยอิงตาม Topic ที่สนใจ Topic ที่พี่ใช้ในโปรเจกต์นี้คือ "alert" เนื่องจาก ESP8266-01 เป็นฝั่งส่งสถานะของปุ่มกด มันจะ "Publish" ข้อมูลไปยัง Topic "alert" นี้ให้กับ MQTT Broker ส่วนฝั่งรับ (NodeMCU) จะ "Subscribe" ไปยัง Topic เดียวกัน เพื่อรับสถานะของปุ่มกด จากนั้น Buzzer ที่ต่อกับ NodeMCU ก็จะทำงานตามสถานะที่ได้รับ พี่ใช้ MQTT Broker ของ Adafruit IO เพราะฟรีและใช้ง่าย สำหรับการนี้ เราต้องไปตั้งค่า Dashboard บน Adafruit IO ก่อน

Setting up the Adafruit Dashboard

ในการสร้าง Dashboard ใหม่ พี่ทำตามขั้นตอนที่adafruit io แนะนำไว้

  1. หลังจากสร้าง Dashboard แล้ว เราจะเห็นหน้าจอว่างๆ อยากเพิ่ม Block อะไร ก็กดที่ไอคอน "+" เลย
Initial dashboard setup
  1. เลือก Block ประเภท Gauge
Select the Gauge block
  1. สร้าง Feed ใหม่ชื่อว่า "alert" แล้วเลือก Feed นี้ (โค้ดใน ESP8266 จะถูกโปรแกรมให้ส่งข้อมูลมา Feed นี้)
  1. ตั้งค่า min และ max ของ Gauge เป็น '1' กับ '3' โดยที่ค่า '1' คือปิดการเตือน, '2' คือ trigger alert-1 และ '3' คือ trigger alert-2
Enter the min and max value of the gauge
  1. เย่! ตอนนี้ Gauge ของเราพร้อมใช้งานแล้ว จะเห็นมันโผล่มาใน Dashboard ของเรา
Final Dashboard setup

เพื่อให้สามารถ "Publish" และ "Subscribe" ข้อมูลจาก Gauge นี้ได้ เราต้องอัปโหลด Sketch ไปยัง NodeMCU และ ESP8266-01

Uploading the sketch

Sketch สำหรับ ESP8266 ทั้งสองตัวนี้ พี่ดัดแปลงมาจากตัวอย่าง Sketch (examples-> Adafruit MQTT Library-> mqtt_esp8266)

ถ้าน้องยังไม่เคยเล่น ESP8266 มาก่อน อย่าลืมติดตั้งบอร์ด ESP8266 ใน Arduino IDE ก่อนนะ พี่ทำตามขั้นตอนที่ให้ไว้ ก่อนจะอัปโหลด Sketch ครั้งแรก

Sketch นี้ต้องใช้ libraries ต่อไปนี้ ซึ่งน้องติดตั้งได้จากใน Arduino IDE เลย (tools->Library Manager)

1. Adafruit IO Arduino (by Adafruit)

2. Adafruit MQTT Library (by Adafruit)

3. ArduinoHttpClient (by arduino)

ก่อนอัปโหลด Sketch ไปยัง ESP8266 ทั้งสองโมดูล อย่าลืมใส่ค่า SSID, Password, Username, Aio key ลงใน Sketch ด้วยนะ

เราสามารถกำหนด SSID และ Password ที่ต่างกันให้กับ ESP8266 ทั้งสองตัวได้ เพราะมันทำงานผ่านอินเทอร์เน็ต

ค่า username และ aio key หาได้จากมุมขวาบนของ adafruit dashboard นำมาใส่ใน Sketch ใน IDE ให้ตรงกัน

การอัปโหลด Sketch ลง ESP8266-01 อาจจะยุ่งยากนิดนึง พี่ใช้ Arduino UNO ในการโปรแกรม ESP8266-01 ต่อสายตามรูปด้านล่างนี้เลย

ใน IDE ให้เลือกบอร์ดเป็น "Generic ESP8266 module" แล้วค่อยอัปโหลด Sketch

ถ้าอัปโหลดไม่ผ่าน ลองดึงสาย 3.3V หรือ Ground ออกแล้วเสียบใหม่ แล้วลองอัปโหลดอีกครั้ง ถ้ายังมีปัญหา พี่แนะนำให้ดู Tutorial ที่ให้ไว้ นะ

สำหรับ NodeMCU การอัปโหลด Sketch ง่ายกว่าเยอะ แค่เลือกบอร์ดเป็น "NodeMCU 1.0(ESP-12E Module)" พร้อมกับเลือก COM Port ให้ถูกต้อง แล้วอัปโหลด Sketch ของ NodeMCU ไปเลย

Final Execution

หลังจากอัปโหลด Sketch ลง ESP8266 ทั้งสองโมดูลเรียบร้อยแล้ว ต่อวงจรตาม Schematic ที่ให้ไว้ได้เลย

น้องสามารถใช้ไฟ 3.3V จาก Arduino ในการจ่ายไฟให้ ESP8266-01 ได้ พี่ใช้ไฟ 3V จากแบตเตอรี่ AA 2 ก้อนแยกมาให้ ESP8266-01 เพื่อให้พกพาง่าย แต่แบตเตอรี่หมดไวมาก เลยในวิดีโอพี่ใช้แบตเตอรี่ Li-ion 3.7V ที่ชาร์จไม่เต็ม (ไม่แนะนำให้ทำตามนะ) พี่แนะนำให้ใช้ Voltage Regulator เวลาใช้แบตเตอรี่ Li-po/Li-ion (ดูข้อมูลเพิ่มเติมได้)

LED ที่ต่อกับ Pin-2 ของ ESP8266-01 จะแสดงสถานะเกี่ยวกับการกดปุ่มและการเชื่อมต่อกับ MQTT ตอนเริ่มต้น LED จะกระพริบทุก 1 วินาที แสดงว่าเชื่อมต่อกับ MQTT สำเร็จแล้ว ถ้ากดปุ่มเพื่อ trigger alert-1 (กดระหว่าง 500 ถึง 1500 มิลลิวินาที) LED จะกระพริบ 1 ครั้ง ถ้ากดปุ่มสำหรับ alert-2 (มากกว่า 1.5 วินาที) LED จะติดค้างจนกว่าจะปิด (เมื่อกดปุ่มจิ๊บเดียว)

ESP8266-01(transmitter)

น้องจะสังเกตเห็นว่าค่าใน Gauge บน Dashboard เปลี่ยนไปเมื่อกดปุ่มบน ESP8266-01 นั่นหมายความว่าการสื่อสารฝั่งส่งสำเร็จแล้ว

ถ้าค่าใน Gauge เปลี่ยน NodeMCU จะรับค่าได้ และสั่งให้ Buzzer ดังตามการกดปุ่ม LED ในตัวของ NodeMCU ก็จะแสดงสถานะเกี่ยวกับการเชื่อมต่อกับ MQTT Broker ด้วย ตอนแรกเปิด NodeMCU LED จะติด (HIGH) แสดงว่ากำลังเชื่อมต่อ พอ LED ดับ (LOW) แสดงว่าเชื่อมต่อกับ Broker สำเร็จแล้ว

NodeMCU (Receiver)

EXPANDED TECHNICAL DETAILS

Cloud-to-Hardware Messaging

โปรเจกต์นี้สร้างระบบ "การแจ้งเตือนทางกายภาพ" ที่สั่งให้กระดิ่งดังเมื่อมีเหตุการณ์เฉพาะเกิดขึ้นที่ไหนก็ได้บนอินเทอร์เน็ต

  • MQTT Data Bridge: Arduino เชื่อมต่อกับบริการคลาวด์ Adafruit IO ผ่าน MQTT Protocol โดยมันจะ "Subscribe" ไปยัง "Feed" เฉพาะ (เช่น Feed ที่แทนการกดกริ่งประตู หรือการแจ้งเตือนราคาหุ้น)
  • Physical Actuation: เมื่อมีค่าใหม่มาที่ Feed, Arduino จะสั่งงาน Solenoid หรือ Servo แรงบิดสูง เพื่อตีกระดิ่งหรือระฆังโลหะจริงๆ

Cross-Platform Connectivity

  • IFTTT / Zapier Integration: Adafruit IO สามารถเชื่อมโยงกับบริการเว็บอื่นๆ ได้ ทำให้กระดิ่งสามารถดังได้เมื่อน้องได้รับอีเมลสำคัญ, มีคน mention ใน Twitter, หรือเมื่อกล้องหน้าประตูตรวจจับการเคลื่อนไหว

ข้อมูล Frontmatter ดั้งเดิม

title: "Wireless alert bell using Adafruit IO"
description: "Uses a single button to trigger 2 types of alert via the internet."
author: "shubhamsantosh99"
category: ""
tags:
  - "human welfare"
  - "internet of things"
views: 2255
likes: 0
price: 1499
difficulty: "Intermediate"
components:
  - "1x Arduino UNO"
  - "1x Tactile Switch, Top Actuated"
  - "1x NodeMCU ESP8266 Breakout Board"
  - "1x Jumper wires (generic)"
  - "1x ESP8266 ESP-01"
  - "1x Resistor 47.5k ohm"
  - "1x Buzzer"
  - "1x LED (generic)"
  - "1x Battery Holder, AA x 2"
  - "1x Resistor 221 ohm"
  - "1x AA Batteries"
tools: []
apps:
  - "1x Adafruit IO"
  - "1x Arduino IDE"
downloadableFiles: []
documentationLinks: []
passwordHash: "8dee01ac4741fb76eec71dd03a6c8253c9451930d31fbe16c89f19ab99d7623c"
encryptedPayload: "U2FsdGVkX1+zDgw3EEnRtmk5M3FTf5lKugtphyl3ljWkHnkD4dZChUMMEoGQcQz3Q5RaTMNT3/hVZEGkL3FDxi3A71jqANWYkZRgEopdViQc2d4NCD3rzbxhwzwzIY4y"
seoDescription: "Build a Wireless alert bell with Adafruit IO. Trigger two alert types via the internet using a single button."
videoLinks:
  - "https://www.youtube.com/embed/aRDuR-sCuJA"
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/wireless-alert-bell-using-adafruit-io-58c62b_cover.jpg"
lang: "th"