Cây trồng trong nhà cần được chú ý và khi bạn đang ngồi ở bàn làm việc, đôi khi bạn quên chăm sóc chúng. Bệnh nhân của chúng tôi là “Gary”, một cây mọng nước Gasteria từ Ikea, người cần được chăm sóc rất ít, và điều đó có nghĩa là tôi quên tưới nước cho anh ấy. Vì vậy, làm thế nào có thể Quả mâm xôi Pi Pico W giúp tôi chăm sóc Gary tốt hơn?
Cảm biến độ ẩm của đất đo độ dẫn điện của đất và gửi giá trị đến Raspberry Pi Pico W (hoặc bộ vi điều khiển khác) dưới dạng điện áp. Điện áp này được đọc bởi chân GPIO tương tự và được chuyển đổi thành giá trị trong khoảng từ 0 đến 65535. Số càng thấp, đất càng khô. Điều này sau đó có thể được sử dụng như một trình kích hoạt để gửi tin nhắn.
Trong phần hướng dẫn này, chúng ta sẽ tìm hiểu cách thực hiện một loạt các chỉ số cảm biến, tìm ra giá trị trung bình của chúng và sử dụng giá trị đó để xác định xem Gary có cần đồ uống hay không. Gary sau đó sẽ gửi tin nhắn cho chúng tôi qua Telegram Bot.
Đối với dự án này, bạn sẽ cần
Xây dựng mạch
Mạch cực kỳ đơn giản. Chúng tôi có một cảm biến độ ẩm đất được kết nối với ba chân của GPIO. Hai chân đầu tiên, nguồn 3V3 và GND cung cấp năng lượng cần thiết cho cảm biến.
Chân thứ ba, Tín hiệu, là chân đầu ra gửi giá trị đến Raspberry Pi Pico. Đầu ra là điện áp mà GPIO tương ứng đọc là giá trị trong khoảng từ 0 đến 65535. Giá trị này sau đó được sử dụng trong mã để xác định xem nhà máy có đang khát nước hay không.
Cảm biến độ ẩm đất kết nối như sau.
Màu sắc | Cảm biến độ ẩm đất | Quả mâm xôi Pi Pico |
---|---|---|
Màu đỏ | +/VCC | 3V3 (Chân vật lý 36) |
Màu vàng | S / Tín hiệu | GP26 |
Đen | – / GND | Bất kỳ chân nối đất/GND nào |
Thiết lập Bot Telegram
Telegram là một dịch vụ nhắn tin tức thì dễ sử dụng, có một phương tiện đơn giản mới mẻ để chúng ta có thể giao tiếp từ Raspberry Pi Pico W. Sử dụng Bot, chúng ta có thể tạo một kênh dành riêng cho cây trồng trong nhà hoặc thậm chí là an ninh gia đình.
Tạo một Bot Telegram là một quá trình đơn giản và may mắn thay, chúng tôi có The BotFather sẵn sàng trợ giúp chúng tôi.
1. Đăng nhập vào tài khoản Telegram của bạn. Chúng tôi đã sử dụng ứng dụng khách Windows để có quy trình làm việc dễ dàng hơn.
2. Tạo một cuộc trò chuyện với BotFather. BotFather là một bot được sử dụng để tạo và quản lý bot.
3. Tạo bot mới bằng lệnh /newbot và nhấn Enter. BotFather sẽ tạo một trình hướng dẫn để hướng dẫn bạn trong quá trình tạo bot.
/newbot
4. Ghi lại khóa API, nó là cần thiết cho dự án. Không có điều này, chúng tôi không thể giao tiếp với bot bằng mã của mình.
5. Trong Telegram, tạo một cuộc trò chuyện mới với IDBot, yêu cầu ID của bạn. Ghi lại ID.
/getid
Viết Mã
Tất cả mã dự án được viết bằng MicroPython, sử dụng bản phát hành MicroPython mới nhất cho Raspberry Pi Pico W. Chúng tôi sử dụng Thonny để viết và kiểm tra mã trực tiếp trên Raspberry Pi Pico W.
1. Thực hiện theo các bước sau để tải xuống phiên bản MicroPython mới nhất cho Raspberry Pi Pico W. Các bước quan trọng nhất là tải xuống và cài đặt hình ảnh chương trình cơ sở UF2 và thiết lập Thonny. Phần còn lại là tùy chọn.
2. mở Thonny Và nhấp vào nút Dừng để làm mới kết nối. Điều này đảm bảo rằng Python Shell đang mở và hoạt động bình thường.
3. Tạo một tệp mới và dán nội dung của liên kết này. Lưu tệp dưới dạng stats.py vào thư mục gốc của Raspberry Pi Pico W. Tệp này là một mô-đun chứa tất cả các chức năng thống kê cần thiết để chọn giá trị trung bình từ danh sách dữ liệu. Dự án được tạo bởi Roberto Colistete Junior.
4. Tạo một tệp mới và trong đó tạo bốn đối tượng, SSID, MẬT KHẨU, API và ID.
5. Đối với đối tượng SSID, hãy gán cho nó tên của điểm truy cập / bộ định tuyến Wi-Fi của bạn.
SSID = “YOUR WI-FI AP NAME HERE”
6. Đối với mật khẩu, chỉ định mật khẩu Wi-Fi.
PASSWORD = “YOUR SECRET PASSWORD”
7. Đối với API, chỉ định khóa API Telegram Bot. Đảm bảo rằng khóa nằm trong “ “.
API = "YOUR TELEGRAM BOT API KEY"
số 8. Đối với ID, chỉ định ID người dùng Telegram của bạn. Đảm bảo rằng ID nằm trong “ “ vì điều này sẽ đặt giá trị dưới dạng chuỗi.
ID = “YOUR USER ID HERE”
9. Lưu tệp vào Raspberry Pi Pico W dưới dạng secret.py.
SSID = “YOUR WI-FI SSID”
PASSWORD “YOUR WI-FI PASSWORD”
API = “YOUR TELEGRAM BOT API KEY”
ID = “YOUR TELEGRAM USER ID”
10. Tạo một tệp mới và nhập một loạt mô-đun Python.
Một. Máy móc chứa các chức năng và lớp cần thiết để sử dụng GPIO (Pin) và đầu vào tương tự (ADC).
b. Thời gian được sử dụng để thêm độ trễ cho mã.
c. Mạng tạo kết nối Wi-Fi.
d. yêu cầu (yêu cầu vi mô) là phiên bản yêu cầu MicroPython được sử dụng để gửi và nhận dữ liệu qua mạng.
đ. Số liệu thống kêmột mô-đun chứa các chức năng để thực hiện phân tích thống kê dữ liệu.
f. bí mậtmột mô-đun chứa tất cả chi tiết Wi-Fi và khóa API của chúng tôi.
from machine import Pin, ADC
import time
import network
import urequests
import statistics
import secrets
11. Tạo đối tượng, cảm biến và tạo kết nối với cảm biến độ ẩm đất tại GPIO 26. Đối tượng này sẽ đặt đầu vào của cảm biến là tương tự, sử dụng giá trị từ 0 đến 65535 để biểu thị độ dẫn điện của đất. Con số càng cao, độ dẫn điện càng tốt.
sensor = ADC(Pin(26))
12. Tạo một đối tượng, wlan và sử dụng nó để tạo kết nối với điểm truy cập Wi-FI của bạn. Kết nối được kích hoạt, sau đó sử dụng SSID và MẬT KHẨU được lưu trữ trong secret.py, chúng tôi kết nối với điểm truy cập. Tạm dừng năm giây để kết nối trở nên ổn định, sau đó chúng tôi in trạng thái hiện tại của kết nối. Nếu kết nối chúng ta thấy TRUE, nếu không kết nối, chúng ta thấy FALSE.
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(secrets.SSID, secrets.PASSWORD)
time.sleep(5)
print(wlan.isconnected())
13. Tạo một danh sách trống có tên là “bài đọc”. Một danh sách còn được gọi là một mảng và chúng tôi sử dụng nó để lưu trữ nhiều giá trị ở định dạng dễ đọc.
readings = []
14. Tạo phần đầu tiên của câu lệnh try, except và đặt mã để chạy vòng lặp while True. Hãy thử, ngoại trừ là một câu lệnh xử lý lỗi. Đoạn mã này sẽ cố gắng chạy những gì có trong nó, nhưng nếu có một ngoại lệ hoặc lỗi, nó sẽ mặc định một phần mã sẽ xử lý nó.
try:
while True:
15. Sử dụng vòng lặp for, thu thập năm giá trị đọc từ cảm biến độ ẩm của đất và nối từng giá trị đọc vào danh sách giá trị đọc trong khoảng thời gian một giây. Đoạn code này sẽ đọc chân GPIO kết nối với cảm biến sau đó lấy giá trị và lưu vào danh sách. In các bài đọc rất hữu ích để gỡ lỗi bất kỳ vấn đề nào.
for i in range(5):
reading = sensor.read_u16()
readings.append(reading)
print(readings)
time.sleep(1)
16. Bên ngoài vòng lặp for, hãy tạo một đối tượng, median_value và trong đó lưu trữ giá trị trung bình (điểm giữa) từ tập hợp các bài đọc.
median_value = statistics.median(readings)
17. Sử dụng câu lệnh có điều kiện để kiểm tra median_value với giá trị được mã hóa cứng. Trong các thử nghiệm của chúng tôi, chúng tôi đã chọn 400 là điểm mà nhà máy gasteria của chúng tôi sẽ cần nước. Tinh chỉnh giá trị này để đáp ứng nhu cầu của nhà máy của bạn.
if median_value < 400:
18. Nếu nhà máy cần nước, sử dụng urequest gửi tin nhắn đến Telegram sau đó in tin nhắn ra Python shell. Lưu ý rằng chúng tôi sử dụng secret.API để chèn khóa API của chúng tôi và secret.ID để gửi ID người dùng của chúng tôi. Tin nhắn thực sự ở đây sendMessage?text=Gary khát nước.
urequests.get("https://api.telegram.org/bot"+secrets.API+"/sendMessage?text=Gary is thirsty&chat_id="+secrets.ID)
print("Message Sent")
19. Sử dụng khác, nhà máy xác định rằng nó có đủ nước và không cần nước vào lúc này. Điều này sau đó kích hoạt độ trễ một giờ đối với mã.
else:
print("Gary has enough water")
time.sleep(3600)
20. Tạo một trình xử lý ngoại lệ, được thiết kế để xử lý Lỗi hệ điều hành (không có kết nối Wi-Fi) in thông báo tới trình bao Python. Các dòng print(“@”*68) tạo đường viền trang trí bên trên và bên dưới thư.
except OSError:
print("@"*68)
print("@ Cannot connect to the Wi-Fi, please check your SSID and PASSWORD @")
print("@"*68)
21. Lưu mã dưới dạng main.py trên Raspberry Pi Pico W. Điều này sẽ buộc Pico W tải mã mỗi khi được bật nguồn.
22. Cấp nguồn cho Pico W và đợi cây trong nhà của bạn đòi nước!
Hoàn thành danh sách mã
from machine import Pin, ADC
import time
import network
import urequests
import statistics
import secrets
sensor = ADC(Pin(26))
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(secrets.SSID, secrets.PASSWORD)
time.sleep(5)
print(wlan.isconnected())
readings = []
try:
while True:
for i in range(5):
reading = sensor.read_u16()
readings.append(reading)
print(readings)
time.sleep(1)
median_value = statistics.median(readings)
if median_value < 400:
urequests.get("https://api.telegram.org/bot"+secrets.API+"/sendMessage?text=Gary is thirsty&chat_id="+secrets.ID)
print("Message Sent")
else:
print("Gary has enough water")
time.sleep(3600)
except OSError:
print("@"*68)
print("@ Cannot connect to the Wi-Fi, please check your SSID and PASSWORD @")
print("@"*68)