Mục lục:

Máy bơm máy pha cà phê thông minh được điều khiển bằng cảm biến siêu âm Raspberry Pi & HC-SR04 và Cloud4RPi: 6 bước
Máy bơm máy pha cà phê thông minh được điều khiển bằng cảm biến siêu âm Raspberry Pi & HC-SR04 và Cloud4RPi: 6 bước

Video: Máy bơm máy pha cà phê thông minh được điều khiển bằng cảm biến siêu âm Raspberry Pi & HC-SR04 và Cloud4RPi: 6 bước

Video: Máy bơm máy pha cà phê thông minh được điều khiển bằng cảm biến siêu âm Raspberry Pi & HC-SR04 và Cloud4RPi: 6 bước
Video: Smart Coffee Machine Pump Controlled by Raspberry Pi & HC-SR04 Ultrasonic Sensor 2024, Tháng mười một
Anonim
Máy bơm máy pha cà phê thông minh được điều khiển bằng cảm biến siêu âm Raspberry Pi & HC-SR04 và Cloud4RPi
Máy bơm máy pha cà phê thông minh được điều khiển bằng cảm biến siêu âm Raspberry Pi & HC-SR04 và Cloud4RPi

Về lý thuyết, mỗi khi bạn đến máy pha cà phê để lấy cốc buổi sáng, chỉ có một trong hai mươi cơ hội là bạn sẽ phải đổ đầy nước vào bình. Tuy nhiên, trong thực tế, có vẻ như máy móc bằng cách nào đó đã tìm ra cách để luôn đặt việc vặt này cho bạn. Bạn càng muốn uống cà phê, bạn càng có nhiều khả năng nhận được thông báo đáng sợ “đổ đầy bình nước”. Các đồng nghiệp của tôi cũng cảm thấy như vậy về điều này. Chúng tôi là những kẻ mọt sách, chúng tôi quyết định triển khai công nghệ có thể chấm dứt điều này.

Quân nhu

Thiết bị của chúng tôi

Chúng tôi có máy pha cà phê SAECO Aulika Focus. Cho đến ngày nay, chúng tôi đã sử dụng một máy bơm tay để đổ đầy nước vào bình chứa nước của máy từ một bình nước tiêu chuẩn 5 Gallon (19L).

Mục tiêu của chúng tôi

  1. Sử dụng một máy bơm điện được điều khiển bởi một số loại bộ điều khiển hoặc một máy vi tính thông qua một rơ le.
  2. Có một cách để đo mực nước trong bình chứa của máy pha cà phê để hệ thống của chúng tôi biết khi nào cần đổ đầy nước vào bình.
  3. Có phương tiện để điều khiển hệ thống, tốt nhất là trong thời gian thực từ thiết bị di động.
  4. Nhận thông báo (thông qua Slack hoặc một dịch vụ tương tự) nếu có bất kỳ sự cố nào xảy ra với hệ thống.

Bước 1: Chọn thiết bị

Chọn thiết bị
Chọn thiết bị
Chọn thiết bị
Chọn thiết bị
Chọn thiết bị
Chọn thiết bị
Chọn thiết bị
Chọn thiết bị

Máy bơm

Tìm kiếm nhanh trên web sẽ hiển thị một số mẫu máy bơm điện được thiết kế cho chai nước mà bạn lựa chọn. Các máy bơm như vậy thường được điều khiển bằng công tắc BẬT / TẮT (ví dụ: Hot Frost A12 hoặc SMixx ХL-D2). Đây là máy bơm chúng tôi đã chọn cho dự án của mình.

Thiết bị điều khiển

Chúng tôi đã thử một số thiết bị nhưng vẫn ổn định trên Raspberry Pi do những ưu điểm sau:

  • Nó có GPIO cho phép chúng tôi kết nối cảm biến tiệm cận
  • Nó hỗ trợ Python

Chúng tôi đã cài đặt phiên bản mới của Raspbian Buster Lite và mọi thứ cần thiết để chạy Python 3.

Cách chúng tôi chuyển đổi máy bơm

Để kiểm soát nguồn điện, chúng tôi đã chọn một rơle trạng thái rắn công suất trung bình (12V / 2A) phù hợp với dòng điện xoay chiều. Rơle kết nối máy bơm với ổ cắm và được điều khiển bằng chân kỹ thuật số của Raspberry Pi.

Cách chúng tôi kiểm tra mực nước

Điều quan trọng đối với chúng tôi là không làm thay đổi cấu trúc của máy pha cà phê, vì vậy chúng tôi quyết định sử dụng cảm biến tiệm cận Siêu âm HC-SR04 để đo mực nước.

Chúng tôi đã in 3d một nắp thùng nước tùy chỉnh với hai lỗ cho bộ phát của cảm biến. Chúng tôi dễ dàng tìm thấy thư viện GitHub cho cảm biến.

Bước 2: Thiết kế hệ thống

Thiết kế hệ thống
Thiết kế hệ thống
Thiết kế hệ thống
Thiết kế hệ thống

Logic của hệ thống

Hệ thống được thiết kế với logic đơn giản sau:

  • Hệ thống liên tục theo dõi khoảng cách giữa cảm biến và mặt nước.
  • Bất cứ khi nào thay đổi về khoảng cách vượt quá giá trị ngưỡng, hệ thống sẽ gửi thông tin về trạng thái của nó lên đám mây.
  • Nếu khoảng cách vượt quá giá trị tối đa cho phép (bồn chứa rỗng), hệ thống sẽ kích hoạt máy bơm và tắt nó khi khoảng cách nhỏ hơn giá trị tối thiểu cho phép.
  • Bất cứ khi nào trạng thái của hệ thống thay đổi (ví dụ: máy bơm kích hoạt), nó sẽ thông báo cho đám mây.

Trong trường hợp xảy ra lỗi, thông báo sẽ được gửi đến kênh Slack.

Khi máy pha cà phê không hoạt động, hệ thống sẽ gửi dữ liệu chẩn đoán đến dịch vụ đám mây mỗi phút một lần. Ngoài ra, nó gửi trạng thái của nó lên đám mây cứ sau 5 phút.

Khi máy bơm hoạt động, hệ thống sẽ gửi dữ liệu thường xuyên hơn nhưng không quá một lần sau mỗi nửa giây.

def send (đám mây, biến, dist, error_code = 0, force = False): pump_on = is_pump_on () phần trăm = biến calc_water_level_percent (dist) ['Khoảng cách'] ['value'] = biến dist ['WaterLevel'] [' giá trị '] = biến phần trăm [' PumpRelay '] [' value '] = biến pump_on [' Trạng thái '] [' value '] = calc_status (error_code, phần trăm, pump_on)

hiện tại = thời gian ()

global last_sending_time if force or current - last_sending_time> MIN_SEND_INTERVAL: readings = cloud.read_data () cloud.publish_data (readings) last_sending_time = current

Làm việc với máy bơm

Chúng tôi xác định các hằng số sau đây làm cơ sở cho logic hoạt động của máy bơm.

# Ghim GPIO (BCM) GPIO_PUMP = 4 GPIO_TRIGGER = 17 GPIO_ECHO = 27

# Bơm

START_PUMP = 1 STOP_PUMP = 0 PUMP_BOUNCE_TIME = 50 # mili giây PUMP_STOP_TIMEOUT = 5 # giây

QUAN TRỌNG: Nếu bạn định sử dụng Pin 4, đừng quên tắt tùy chọn 1-Wire raspi-config để tránh xung đột.

Khi khởi động chương trình, chúng tôi đăng ký một cuộc gọi lại và đặt trạng thái ban đầu thành TẮT.

Đây là mã cho chức năng bật tắt máy bơm:

def toggle_pump (value): if pump_disabled: return if is_pump_on ()! = value: log_debug ("[x]% s"% ('START' if value else 'STOP')) GPIO.setup (GPIO_PUMP, GPIO. OUT) GPIO.output (GPIO_PUMP, giá trị) # Bắt đầu / Dừng đổ

Như đã định nghĩa trong mã khởi động ở trên, khi rơle BẬT, lệnh gọi lại sau được gọi:

pump_on = False def pump_relay_handle (pin): global pump_on pump_on = GPIO.input (GPIO_PUMP) log_debug ("Rơ le máy bơm đã thay đổi thành% d"% pump_on)

Trong lệnh gọi lại, chúng tôi lưu trạng thái hiện tại của máy bơm vào một biến. Trong vòng lặp chính của ứng dụng, chúng tôi có thể phát hiện thời điểm máy bơm chuyển đổi như hình dưới đây:

def is_pump_on (): global pump_on return pump_on

nếu GPIO.event_detected (GPIO_PUMP):

is_pouring = is_pump_on () #… log_debug ('[!] Đã phát hiện sự kiện bơm:% s'% ('Bật' nếu is_pouring khác 'Tắt')) send (đám mây, biến, khoảng cách, lực lượng = True)

Đo khoảng cách

Khá dễ dàng để đo khoảng cách đối với mặt nước bằng cảm biến tiệm cận siêu âm. Trong kho lưu trữ của mình, chúng tôi đã chia sẻ một số tập lệnh python cho phép bạn kiểm tra cảm biến.

Trong các ứng dụng thực tế, các chỉ số cảm biến có thể dao động do hiệu ứng nảy của cảm biến và dao động nước. Trong một số trường hợp, các bài đọc có thể bị thiếu hoàn toàn. Chúng tôi đã triển khai một lớp BounceFilter tích lũy N giá trị gần đây, loại bỏ các đỉnh và tính giá trị trung bình của các phép đo còn lại. Quá trình đo được thực hiện bởi thuật toán không đồng bộ sau.

# Giữ số đo cảm biến cuối cùng = BounceFilter (size = 6, discard_count = 1)

read_complete = threading. Event ()

def wait_for_distance ():

read_complete.clear () thread = threading. Thread (target = read_distance) thread.start ()

nếu không read_complete.wait (MAX_READING_TIMEOUT):

log_info ('Hết thời gian chờ của cảm biến đọc') trả về Không trả về các bài đọc.avg ()

def read_distance ():

try: value = hcsr04.raw_distance (sample_size = 5) round = value nếu giá trị là Không có gì khác làm tròn (giá trị, 1) readings.add (làm tròn) ngoại trừ Exception as err: log_error ('Internal error:% s'% err) cuối cùng: read_complete.set ()

Bạn có thể tìm thấy triển khai đầy đủ của bộ lọc trong các nguồn.

Bước 3: Xử lý các tình huống khẩn cấp

Xử lý các tình huống khẩn cấp
Xử lý các tình huống khẩn cấp
Xử lý các tình huống khẩn cấp
Xử lý các tình huống khẩn cấp
Xử lý các tình huống khẩn cấp
Xử lý các tình huống khẩn cấp

Điều gì sẽ xảy ra nếu cảm biến bị cháy, rơi ra hoặc chỉ vào một khu vực sai? Chúng tôi cần một cách để báo cáo những trường hợp như vậy để chúng tôi có thể thực hiện hành động thủ công.

Nếu cảm biến không cung cấp các kết quả đo khoảng cách, hệ thống sẽ gửi trạng thái đã thay đổi lên đám mây và tạo ra thông báo tương ứng.

Logic được minh họa bằng đoạn mã dưới đây.

khoảng cách = wait_for_distance () # Đọc độ sâu nước hiện tại nếu khoảng cách là Không: log_error ('Lỗi khoảng cách!') thông báo_in_background (calc_alert (SENSOR_ERROR)) gửi (đám mây, các biến, khoảng cách, error_code = SENSOR_ERROR, force = True)

Chúng tôi có một phạm vi mực nước hoạt động cần được duy trì khi cảm biến ở đúng vị trí của nó. Chúng tôi kiểm tra xem mực nước hiện tại có giảm trong phạm vi này không:

# Khoảng cách từ cảm biến đến mực nước # dựa trên ngăn chứa nước của máy pha cà phê MIN_DISTANCE = 2 # cm MAX_DISTANCE = 8 # cm

# Khoảng cách nằm ngoài phạm vi dự kiến: không bắt đầu đổ

nếu khoảng cách> MAX_DISTANCE * 2: log_error ('Khoảng cách nằm ngoài phạm vi:%.2f'% khoảng cách) tiếp tục

Chúng tôi tắt máy bơm nếu nó hoạt động khi xảy ra lỗi.

if is_pump_on () and prev_distance <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('[!] Máy bơm dừng khẩn cấp. Không có tín hiệu từ cảm biến khoảng cách')

toggle_pump (STOP_PUMP)

Chúng tôi cũng xử lý trường hợp bình hết nước. Chúng tôi kiểm tra xem mực nước không thay đổi khi máy bơm chạy. Nếu vậy, hệ thống đợi trong 5 giây và sau đó kiểm tra xem máy bơm đã tắt chưa. Nếu không, hệ thống thực hiện tắt máy bơm khẩn cấp và gửi thông báo lỗi.

PUMP_STOP_TIMEOUT = 5 # secsemergency_stop_time = Không có

def set_emergency_stop_time (bây giờ, is_pouring):

global khẩn cấp_stop_time khẩn cấp_stop_time = bây giờ + PUMP_STOP_TIMEOUT nếu / is_pouring khác Không có

def check_water_source_empty (bây giờ):

trả lại khẩn cấp_stop_time và bây giờ> khẩn cấp_stop_time

# --------- vòng lặp chính -----------

if GPIO.event_detected (GPIO_PUMP): is_pouring = is_pump_on () set_emergency_stop_time (now, is_pouring) #…

global pump_disabled

if check_water_source_empty (now): log_error ('[!] Máy bơm dừng khẩn cấp. / Nguồn nước cạn') toggle_pump (STOP_PUMP) pump_disabled = True

Trên đây là một ví dụ về nhật ký thông báo được tạo trong khi dừng khẩn cấp.

Bước 4: Chạy hệ thống 24/7

Chạy hệ thống 24/7
Chạy hệ thống 24/7

Mã trên thiết bị được gỡ lỗi và chạy mà không gặp vấn đề gì. Chúng tôi đã khởi chạy nó như một dịch vụ, vì vậy nó sẽ khởi động lại nếu Raspberry Pi được khởi động lại. Để thuận tiện, chúng tôi đã tạo một Makefile giúp triển khai, chạy dịch vụ và xem nhật ký.

. PHONY: cài đặt nhật ký trạng thái dừng chạy bắt đầu triển khai MAIN_FILE: = coffee-pump / main.py SERVICE_INSTALL_SCRIPT: = service_install.sh SERVICE_NAME: = coffee-pump.service

Tải về:

chmod + x $ (SERVICE_INSTALL_SCRIPT) sudo./$(SERVICE_INSTALL_SCRIPT) $ (MAIN_FILE)

chạy:

sudo python3 $ (MAIN_FILE)

bắt đầu:

sudo systemctl start $ (SERVICE_NAME)

trạng thái:

trạng thái sudo systemctl $ (SERVICE_NAME)

ngừng lại:

sudo systemctl stop $ (SERVICE_NAME)

nhật ký:

sudo journalctl -u coffee-pump - kể từ hôm nay

triển khai:

rsync -av coffee-pump sensor-setup Makefile *.sh pi@XX. XX. XXX. XXX: ~ /

Bạn có thể tìm thấy tệp này và tất cả các tập lệnh được yêu cầu trong kho lưu trữ của chúng tôi.

Bước 5: Giám sát đám mây

Giám sát đám mây
Giám sát đám mây
Giám sát đám mây
Giám sát đám mây
Giám sát đám mây
Giám sát đám mây
Giám sát đám mây
Giám sát đám mây

Chúng tôi đã sử dụng Cloud4RPi để triển khai bảng điều khiển. Đầu tiên, chúng tôi đã thêm các widget để chỉ ra các thông số thiết yếu của hệ thống.

Nhân tiện, tiện ích cho biến TRẠNG THÁI có thể sử dụng các sơ đồ màu khác nhau dựa trên giá trị của nó (xem hình ảnh ở trên).

Chúng tôi đã thêm một tiện ích biểu đồ để hiển thị dữ liệu động. Trong hình ảnh bên dưới, bạn có thể thấy thời điểm máy bơm BẬT và TẮT và mực nước tương ứng.

Nếu bạn phân tích khoảng thời gian dài hơn, bạn có thể thấy các đỉnh - đó là khi máy bơm đang chạy.

Cloud4RPi cũng cho phép bạn thiết lập các mức độ làm mịn khác nhau.

Bước 6: Nó hoạt động

Image
Image

Nó hoạt động! Toàn bộ bảng điều khiển trông như hình dưới đây.

Hiện tại, máy bơm tự động của chúng tôi đã chạy được vài tuần và tất cả những gì chúng tôi cần làm là thay bình nước. Mã đầy đủ cho dự án của chúng tôi có sẵn trong kho lưu trữ GitHub của chúng tôi.

Đề xuất: