Cách gửi thông báo/cảnh báo từ Raspberry Pi Pico W tới điện thoại Android

Raspberry Pi chạy hệ điều hành Linux đầy đủ thì Raspberry Pi Pico W dựa vào firmware để cung cấp một lớp mà trên đó chúng ta có thể viết mã của mình. MicroPython là một trong những ngôn ngữ được hỗ trợ chính thức và nó đã có nhiều cải tiến để phù hợp với Raspberry Pi Pico. Một cải tiến là bao gồm các yêu cầu urequest (yêu cầu vi mô) cho phép Pico W và nhận các HTTP requests.

Trong cách thực hiện này, chúng tôi sẽ sử dụng urequest cùng với ntfy.sh , một dịch vụ và ứng dụng miễn phí dành cho thiết bị Android và Apple có thể chặn tin nhắn từ thiết bị IoT và hiển thị chúng trên thiết bị. Chúng tôi sẽ sử dụng nó để gửi cảnh báo đến điện thoại di động Android của mình, cảnh báo được kích hoạt bởi cảm biến PIR (Hồng ngoại thụ động) phát hiện chuyển động trong phòng. 

Ntfy.sh là một dịch vụ đơn giản và hiệu quả rõ rệt. Thay vì cài đặt một mô-đun Python/MicroPython cụ thể, nó hoạt động với các yêu cầu gửi tin nhắn từ Raspberry Pi Pico W bằng một chủ đề cụ thể (rất giống với cách hoạt động của MQTT).

Xây dựng mạch

Gửi cảnh báo từ Raspberry Pi Pico W

Mạch điện cho dự án này cực kỳ đơn giản. Chỉ có ba kết nối giữa cảm biến PIR và Raspberry Pi Pico.

Quảng cáo
Màu dâyRaspberry Pi PicoPIR
Màu đỏ5V (VBUS)VCC
Màu vàngGPIO 16OUT
ĐenGNDGND

Kết nối dây giữa Pico và cảm biến PIR trước khi tiếp tục.

Mã hóa dự án

1. Cài đặt ntfy.sh cho thiết bị Android / iOS.

2. Mở ứng dụng và nhấp vào + để tạo đăng ký mới.

Quảng cáo
Gửi cảnh báo từ Raspberry Pi Pico W

3. Tạo chủ đề mới và nhấp vào SubscribeChúng tôi đã chọn sử dụng thử nghiệm thứ. Tạo một chủ đề mang tính cá nhân cho bạn. Cũng lưu ý rằng các chủ đề có thể không được bảo vệ bằng mật khẩu, vì vậy đừng gửi dữ liệu nhạy cảm.

Gửi cảnh báo từ Raspberry Pi Pico W

4. Để ứng dụng mở trên thiết bị. 

Bây giờ chúng ta chuyển sang mã hóa Raspberry Pi Pico W.

5. Bạn cần tải xuống phiên bản MicroPython mới nhất cho Raspberry Pi Pico W.

6. Mở Thonny và nhấp vào nút Stop để làm mới kết nối. Điều này đảm bảo rằng Python Shell mở và hoạt động chính xác.

7. Tạo một file trống mới.

8. Nhập mô-đun mạng rồi nhập urequests, đổi tên thành request. Mô-đun mạng cho phép Pico W kết nối với internet. Urequests là phiên bản MicroPython của mô-đun yêu cầu của Python mà sẽ sử dụng để gửi tin nhắn từ Pico W. Urequests hiện được cài đặt sẵn trên bản phát hành firmware UF2 mới nhất.

Quảng cáo
import network
import urequests as requests

9. Nhập chức năng sleep theo thời gian và Pin từ máy. Chức năng sleep sẽ được sử dụng để thêm tạm dừng vào mã dự án. Mô-đun máy chứa các hàm và lớp cho phép mã của chúng ta điều khiển và đọc các chân GPIO.

from time import sleep
from machine import Pin

10. Tạo một object, pir và sử dụng nó để tạo kết nối tới chân đầu ra PIR tại GPIO 16. Pin này cần được đặt làm đầu vào và chúng ta nên kéo chân GPIO lên cao (3V) để khi PIR được kích hoạt, tín hiệu sẽ kéo chân xuống mức thấp.

pir = Pin(16, Pin.IN, Pin.PULL_UP)

11. Tạo một object, wlan đại diện cho kết nối WiFi, sau đó bật WiFi và kết nối với điểm truy cập WiFi.

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("YOUR SSID","YOUR PASSWORD")

12. Thêm độ trễ ba giây sau khi thực hiện kết nối WiFi. Điều này không thực sự cần thiết, quá trình kết nối là một “blocker”, nghĩa là nó phải hoàn thành trước khi có thể chuyển sang đường dây này.

sleep(3)

13. In trạng thái kết nối WiFi. True có nghĩa là chúng tôi được kết nối, False có nghĩa là chúng tôi không kết nối.

print(wlan.isconnected())

14. Tạo một vòng lặp while True và sử dụng nó để in trạng thái hiện tại của PIR GPIO pin. Chúng tôi đặt mã pin ở mức cao (kéo lên) trong mã của mình, vì vậy giá trị phải là 1.

while True:
   print(pir.value())

15. Tạo câu lệnh có điều kiện để kiểm tra xem cảm biến PIR đã được kích hoạt chưa. Việc kích hoạt cảm biến sẽ buộc chân GPIO được kết nối với chân đầu ra cảm biến xuống mức thấp (0) và mã của chúng tôi đang tìm kiếm sự thay đổi này.

Quảng cáo
   if pir.value() == 0:

16. Sử dụng các yêu cầu để gửi tin nhắn tới ntfy. Lưu ý rằng chúng ta cần chỉ định tên chủ đề, trong trường hợp của chúng ta là https://ntfy.sh/th-test , như một phần đối số của hàm. Đối số tiếp theo, dữ liệu là thông báo mà người dùng sẽ thấy. 

       requests.post("https://ntfy.sh/th-test",
                     data="Movement detected by sensor",

17. Bên trong yêu cầu chỉ định “headers” bao gồm title cho thông báo . Mức priority (5 là mức ưu tiên cao nhất) và Tags, được sử dụng để thêm biểu tượng cảm xúc ánh sáng xoay.

                     headers={
                         "Title": "ALERT: MOVEMENT DETECTED",
                         "Priority": "5",
                         "Tags": "rotating_light",
                         })

18. In thông báo tới Python shell. Điều này hoàn toàn dành cho mục đích gỡ lỗi.

       print("Movement detected, notification sent")

19. Thêm một điều kiện khác chỉ sử dụng pass để cho phép lặp mã.

   else:
       pass

20. Thêm độ trễ vào mã, bên trong vòng lặp while True nhưng nằm ngoài các kiểm tra có điều kiện. Độ trễ này có thể là 10 giây hoặc vài giờ. Tất cả phụ thuộc vào tần suất bạn muốn được cảnh báo.

   sleep(10)

21. Lưu mã vào Raspberry Pi Pico dưới dạng Alarm.py và nhấp vào Runđ để bắt đầu. Nếu bạn muốn mã này tự động chạy khi Pico W bật nguồn, hãy lưu file dưới dạng main.py. MicroPython được cấu hình để chạy main.py bất cứ khi nào bo mạch được bật nguồn.

22. Đặt tay bạn trước cảm biến để kích hoạt cảnh báo.

Quảng cáo
Gửi cảnh báo từ Raspberry Pi Pico W

23. Thiết bị Android/iOS sẽ nhận được thông báo.

Danh sách Code hoàn chỉnh

import network
import urequests as requests
from time import sleep
from machine import Pin
pir = Pin(16, Pin.IN, Pin.PULL_UP)
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("YOUR SSID","YOUR PASSWORD")
sleep(3)
print(wlan.isconnected())
while True:
   print(pir.value())
   if pir.value() == 0:
       requests.post("https://ntfy.sh/th-test",
                     data="Movement detected by sensor",
                     headers={
                         "Title": "ALERT: MOVEMENT DETECTED",
                         "Priority": "5",
                         "Tags": "rotating_light",
                         })
       print("Movement detected, notification sent")
   else:
       pass
sleep(10)