Khám Phá Coffee-Cam: Dự Đoán Thời Gian Pha Cà Phê Một Cách Thông Minh Với IoT Và Machine Learning


Summary

Bài viết này khám phá Coffee-Cam - một hệ thống thông minh giúp dự đoán thời gian pha cà phê bằng công nghệ IoT và Machine Learning. Nó không chỉ mang đến sự tiện lợi mà còn thể hiện cam kết bền vững với môi trường. Key Points:

  • Coffee-Cam ứng dụng Computer Vision để phân tích hình ảnh và dự đoán thời gian pha chế một cách chính xác hơn, vượt qua các phương pháp truyền thống.
  • Hệ thống sử dụng Machine Learning để học thói quen người dùng và tối ưu hóa năng lượng tiêu thụ, giúp tiết kiệm chi phí và bảo vệ môi trường.
  • Thêm cảm biến đa dạng kết nối IoT cho phép thu thập dữ liệu thời gian thực, hỗ trợ phát hiện lỗi trong quá trình pha chế và đảm bảo chất lượng cà phê.
Nhờ những cải tiến đột phá trong công nghệ, bài viết cung cấp cái nhìn sâu sắc về cách Coffee-Cam có thể nâng cao trải nghiệm pha cà phê của bạn.

Vấn đề với máy pha cà phê trong văn phòng

Tất cả bắt đầu - như nhiều ý tưởng vĩ đại khác - với cà phê. Hoặc chính xác hơn, là sự thiếu hụt nó. Trong văn phòng của chúng tôi, chúng tôi thường xuyên gặp phải một vấn đề khó chịu: bạn sẽ đi đến máy pha cà phê, đầy những giấc mơ về caffeine, chỉ để phát hiện ra rằng nó đang trong quá trình làm sạch. 30 phút chỉ toàn là sự thất vọng.

Máy pha cà phê này không chỉ đơn thuần là một thiết bị; nó được chế tạo từ những vật liệu bền bỉ như thép không gỉ và nhựa cao cấp. Với khả năng điều chỉnh nhiệt độ nước cùng thời gian pha, mỗi tách cà phê đều có thể trở nên hoàn hảo hơn bao giờ hết. Hơn nữa, việc tích hợp cảm biến IoT giúp theo dõi tình trạng của máy móc và tối ưu hóa quy trình sử dụng, từ đó mang lại trải nghiệm uống cà phê tuyệt vời hơn cho mọi người trong văn phòng.

Ý tưởng tạo ra Coffee-Cam

Có lẽ có cách nào đó tốt hơn. ## Ý Tưởng Nảy Ra Ở Máy Pha Cà Phê Một ngày nọ, ai đó đã nói đùa: "Giá mà chúng ta có thể nhìn từ bàn làm việc để biết máy pha cà phê đang được vệ sinh hay không!" Thật không may, chiếc máy pha cà phê của chúng tôi không tích hợp API - mặc dù đây là một sản phẩm dành cho người dùng chuyên nghiệp.

Tuy nhiên, ý tưởng về một giải pháp thông minh đã xuất hiện trong đầu mọi người. Chúng tôi có thể phát triển một hệ thống Coffee-Cam sử dụng cảm biến IoT để theo dõi quá trình làm sạch và nhiệt độ cũng như độ ẩm bên trong máy. Điều này sẽ giúp đảm bảo rằng cà phê luôn đạt chất lượng tốt nhất.

Ngoài ra, thiết kế của Coffee-Cam nên sử dụng vật liệu bền vững như nhựa tái chế hoặc inox không gỉ để góp phần vào bảo vệ môi trường. Hơn nữa, việc tích hợp công nghệ machine learning sẽ rất hữu ích trong việc phân tích thói quen của người dùng và tối ưu hóa thời gian pha chế cà phê. Tất cả những yếu tố này sẽ khiến sản phẩm trở nên thông minh và tiện lợi hơn cho mọi người.
Extended Perspectives Comparison:
Kết luậnNội dung
Dự án IoT CoffeeCamMột hệ thống thông minh giúp phát hiện trạng thái máy pha cà phê và gửi thông báo qua Slack.
Công nghệ sử dụngTensorFlow cho nhận diện hình ảnh kết hợp với Python để xây dựng mô hình học sâu.
Quy trình hoạt độngHệ thống phát hiện hộp đựng cà phê và tự động gửi tin nhắn dựa trên trạng thái của máy.
Giá trị mang lạiTăng cường sự hài lòng trong văn phòng thông qua việc tự động hóa công việc đơn giản.
Yêu cầu kỹ thuậtMột chiếc Raspberry Pi, webcam và một số dòng mã Python là đủ để triển khai.

Ý tưởng tạo ra Coffee-Cam

Lắp đặt camera và sử dụng Motion

Chúng tôi có một chiếc Raspberry Pi và một chiếc webcam cũ nằm không sử dụng. Và thế là, một buổi hackathon nhỏ với cà phê đã bắt đầu. Đầu tiên, chúng tôi gắn webcam lên máy pha cà phê và cài đặt phần mềm Motion trên Raspberry Pi. Để nâng cao hiệu quả của việc lắp đặt camera này, cần chú ý đến những thông số như chất lượng hình ảnh (độ phân giải cao để nhận diện chuyển động chính xác), cảm biến chuyển động nhạy bén hơn nữa, cùng với việc chọn vị trí lắp đặt hợp lý nhằm tối ưu hóa góc nhìn. Ngoài ra, nếu tích hợp AI vào quá trình phân tích dữ liệu từ camera, điều đó sẽ giúp cải thiện độ chính xác trong dự đoán thời gian pha chế cà phê.

Phân loại hình ảnh bằng TensorFlow

Nó cung cấp cho chúng tôi một giao diện web đơn giản, cho phép phát trực tiếp hình ảnh từ camera - rất lý tưởng để theo dõi màn hình của máy. Từ đó, thật dễ dàng để kiểm tra thủ công xem hộp "Cleaning" có hiển thị trên màn hình hay không. Bạn chỉ cần mở trình duyệt, nhập địa chỉ IP của Raspberry Pi và xem webcam.

Phân loại hình ảnh bằng TensorFlow

Tạo chatbot Slack thông minh

Bước đầu tiên khá tốt. Nhưng mà mỗi lần phải kiểm tra trình duyệt thì vẫn chưa thật sự lý tưởng lắm.

Cấu trúc mã nguồn của dự án

Quay trở lại với bảng vẽ...! ## Bước 2: Phân loại hình ảnh với TensorFlow Chúng tôi cần tự động hóa. Vị trí camera được cố định, điều này khiến nó trở thành một sân chơi tuyệt vời để phân biệt giữa các hình ảnh. Vì vậy, tôi đã khởi động TensorFlow và bắt đầu đào tạo một mạng nơ-ron nhỏ. Tôi đã thu thập các ảnh chụp màn hình từ luồng camera - một số có màn hình làm sạch hiển thị, một số thì không. Với chỉ vài chục ví dụ cho mỗi loại, mô hình đã bất ngờ đáng tin cậy trong việc phân loại xem máy đang ở chế độ làm sạch hay sẵn sàng hoạt động. Một đoạn trích nhỏ về những gì tôi phải đối mặt: người nào đó đang cầm một tách cà phê, đồng nghiệp của tôi làm rối loạn bộ dữ liệu thử nghiệm của tôi, hộp làm sạch và không có hộp nào cả (từ trái sang phải, trên xuống dưới).

Cấu trúc mã nguồn của dự án

Huấn luyện mô hình phân loại

Một phần quan trọng cuối cùng: thông báo. Bởi vì máy pha cà phê thường là người làm việc chăm chỉ nhất trong văn phòng, những tin nhắn đơn giản sẽ trở nên nhàm chán. Vì vậy, bot đã được thêm một chút tính cách. Tôi đã sử dụng ChatGPT để tạo ra một số câu, dưới đây là những gì tôi đã tích hợp:

messages = [
"🧼 Tôi đang ở spa. Đó là tên của sự sang trọng. Còn bạn: chế độ dọn dẹp.",
"😶 ‍🌫 ️ Quá nhiều tình yêu của bạn đang bám vào tôi. Để tôi cọ sạch đi.",
"🛁 Ngày spa cho tôi. Các bạn cứ nghỉ ngơi đi.",
"😐 Không, tôi không bị hỏng đâu. Tôi đang bận tắm bọt.",
"🧽 Tôi đang tự làm sạch mình. Tại sao? Bởi vì bạn đối xử với tôi như một con vật.",
"💤 Dọn dẹp đang diễn ra. Vui lòng đừng gõ cửa, tôi khá nhạy cảm.",
"🙃 Vệ sinh rất quan trọng. Đó là điều mà nhà trị liệu của tôi đã nói.",
"🚿 Tôi đang tắm rửa. Bạn cũng nên thử đi.",
"🤖 Bảo trì đang tiếp tục. Tâm trạng? Nằm giữa sự từ chối và xà phòng.",
"🫣 Tôi đang loại bỏ những tội lỗi cà phê của bạn. Đừng nhìn."
] nếu is_positive khác thì [
"☕ Sẵn sàng cho ly cà phê tiếp theo rồi đây! Chúc bạn một ngày mạnh mẽ!",
"🧼 Mới được làm sạch và sẵn sàng hoạt động! Hãy cùng nhau thực hiện – bạn thật tuyệt!",
"🔧 Tôi đã trở lại hình dạng tốt nhất rồi! Thời gian dành cho năng lượng mới nhé.",
"📎 Hệ thống hoạt động trơn tru rồi! Ngày hôm nay chắc chắn sẽ suôn sẻ đúng không?",
"😌 Sạch sẽ, sẵn sàng – và trong tâm trạng thư giãn với cà phê.",
"☀️ Chào buổi sáng! Tôi đã sẵn sàng rồi đấy! Còn bạn thì sao?",
"👋 Trở lại trực tuyến đây! Tôi tin tưởng vào bạn (và caffeine).",
"🥸 Sẵn sàng để pha chế thôi nào! Hãy cùng nhau đạt được những điều tuyệt vời – hoặc ít nhất là tỉnh táo nhé!",
"🌞 Sẵn sàng để thắp sáng ngày của bạn! Cà phê ngay lập tức đến tay nhé!",
"📈 Tất cả đều ổn định rồi đấy! Hy vọng ngày của bạn sẽ diễn ra suôn sẻ như chính tôi lúc này."
]

Dự đoán trạng thái máy pha cà phê

Mã nguồn của tôi khá đơn giản: Một script Python để huấn luyện mô hình, một thư mục chứa tập dữ liệu của tôi (hộp / không hộp), và một script Python để phát hiện và chạy trong dịch vụ systemd.

Dưới đây là mã Python mà tôi đã sử dụng:

from tensorflow.keras import layers, models
import numpy as np
import cv2
import os
from sklearn.model_selection import train_test_split

def load_images_from_folder(folder, label):
images = []
labels = []
for filename in os.listdir(folder):
img_path = os.path.join(folder, filename)
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
if img is not None:
img = cv2.resize(img, (128, 128)) # Thay đổi kích thước ảnh về một kích thước đồng nhất
images.append(img)
labels.append(label)
return images, labels

def load_dataset():
images_with_box, labels_with_box = load_images_from_folder("dataset/box", 1)
images_without_box, labels_without_box = load_images_from_folder("dataset/no_box", 0)
images = np.array(images_with_box + images_without_box)
labels = np.array(labels_with_box + labels_without_box)
images = images / 255.0
images = images.reshape(-1, 128, 128, 1)
return train_test_split(images, labels, test_size=0.2, random_state=42)

def build_model():
model = models.Sequential([
layers.Conv2D(32, (3,3), activation='relu', input_shape=(128, 128, 1)),
layers.MaxPooling2D((2,2)),
layers.Conv2D(64,(3 ,3), activation='relu'),
layers.MaxPooling2D((2 ,2)),
layers.Flatten(),
layers.Dense(128 ,activation='relu'),
layers.Dense(1 ,activation='sigmoid')
])

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

return model

print("Bắt đầu")
# Tải dữ liệu kiểm tra
X_train ,X_test ,y_train ,y_test=load_dataset()
# Tạo mô hình
model=build_model()
# Huấn luyện mô hình
model.fit(X_train,y_train ,epochs=10 ,validation_data=(X_test,y_test))
model.save("box_detector_model.h5")
print("Hoàn thành việc huấn luyện!")


Những đoạn mã này giúp bạn xây dựng một hệ thống nhận diện có khả năng phân loại hình ảnh với hoặc không có hộp. Quy trình bắt đầu bằng việc tải các hình ảnh từ thư mục đã chỉ định và gán nhãn cho chúng tương ứng. Sau đó là bước chuẩn bị dữ liệu và xây dựng mô hình học sâu để thực hiện nhiệm vụ phân loại dựa trên các đặc điểm của hình ảnh. Cuối cùng là quá trình huấn luyện mô hình trước khi lưu lại kết quả cho những lần sử dụng sau.

Dự đoán trạng thái máy pha cà phê

Gửi thông báo qua Slack khi có thay đổi trạng thái


import time
import http.client
import requests
import tensorflow as tf
import numpy as np
import json
import cv2
import os
import random
from datetime import datetime

tf.get_logger().setLevel('INFO')

# Đặt ngưỡng thời gian để tránh gửi thông báo quá nhiều lần.
DETECTION_TIME_THRESHOLD = 40.0 # Giây có hộp, trước khi trạng thái thay đổi.
ABSENCE_TIME_THRESHOLD = 30.0 # Giây không có hộp, trước khi trạng thái thay đổi.

SLACK_TOKEN = "xoxb-...."
SLACK_CHANNEL = "#your-channel-name"
SAVE_DIR = "./false_positives"
os.makedirs(SAVE_DIR, exist_ok=True)

def send_slack_message(message):
conn = http.client.HTTPSConnection("slack.com")
headers = {
"Authorization": f"Bearer {SLACK_TOKEN}",
"Content-Type": "application/json",
}
data = json.dumps({
"channel": SLACK_CHANNEL,
"text": message,
})

conn.request("POST", "/api/chat.postMessage", body=data, headers=headers)
response = conn.getresponse()

if response.status != 200:
print(f"Có lỗi khi gửi tin nhắn qua Slack: {response.read().decode()}")
else:
response_data = json.loads(response.read().decode())
if not response_data.get("ok"):
print(f"Có lỗi khi gửi tin nhắn qua Slack: {response_data}")

conn.close()

def capture_and_predict(model, url):
response = requests.get(url, stream=True)

if response.status_code == 200:
img_array = np.asarray(bytearray(response.content), dtype=np.uint8)
img_color = cv2.imdecode(img_array, cv2.IMREAD_COLOR)

img_gray = cv2.cvtColor(img_color, cv2.COLOR_BGR2GRAY)
img_resized = cv2.resize(img_gray, (128, 128)) / 255.0

img_input = np.expand_dims(img_resized, axis=-1)
img_input = np.expand_dims(img_input, axis=0)

prediction = model.predict(img_input, verbose=0)[0][0]

return prediction > 0.5, img_color

else:
print("Đã xảy ra lỗi khi lấy hình ảnh.")

return None, None

_last_message = None

def get_coffee_message(is_positive=True):
global _last_message

messages_positive = [
"🧼 Tôi đang ở spa. Để bạn biết: chế độ làm sạch.",
"😶 ‍🌫️ Quá nhiều tình yêu của bạn bám lại trên tôi. Hãy để tôi tẩy sạch.",
"🛁 Ngày spa cho tôi. Bạn hãy nghỉ ngơi nhé.",
"😐 Không phải tôi hỏng đâu. Tôi chỉ đang bận tắm thôi.",
"🧽 Tôi đang làm sạch bản thân mình. Tại sao? Vì bạn đối xử với tôi như một con vật.",
"💤 Đang dọn dẹp đây! Xin đừng gõ cửa nhé!",
'🙃 Vệ sinh rất quan trọng! Đó là điều bác sĩ tâm lý của tôi nói.',
'🚿 Tôi đang tắm rửa đây! Bạn cũng nên thử đi.',
'🤖 Bảo trì đang diễn ra đây! Tâm trạng? Chỉ giữa sự từ bỏ và xà phòng.',
'🫣 Tôi đang loại bỏ những tội lỗi cà phê của bạn. Đừng nhìn!'
]

messages_negative=[
'☕ Sẵn sàng cho ly cà phê tiếp theo! Chúc bạn một ngày tràn đầy năng lượng!',
'🧼 Vừa mới được vệ sinh và sẵn sàng hoạt động trở lại – bạn thật tuyệt vời!',
'🔧 Tôi đã quay lại hình dạng hoàn hảo rồi! Lần này là lúc nạp năng lượng cho bạn.',
'📎 Hệ thống hoạt động bình thường rồi! Ngày hôm nay sẽ suôn sẻ thôi nhỉ?',
'😌 Sạch sẽ và trong tâm trạng bình yên – giờ thì bắt đầu ngày mới nào!',
'☀️ Chào buổi sáng! Tôi đã sẵn sàng rồi đó – còn bạn?',
'👋 Trở lại online rồi đây! Tin tưởng vào bạn (và cả caffeine).',
'🥸 Sẵn sàng pha cà phê - cùng nhau tạo nên những điều tuyệt vời nhé!',
'🌞 Chuẩn bị làm sáng ngày hôm nay - cà phê chuẩn bị đến tay bạn đấy!',
'📈 Tất cả đã sẵn sàng - cầu mong ngày của bạn thuận lợi như cách mà tôi hoạt động.'
]

messages_list=messages_positive if is_positive else messages_negative

message=random.choice(messages_list)

while message == _last_message:
message=random.choice(messages_list)

_last_message=message

return message


# Tải mô hình dự đoán.
model=tf.keras.models.load_model("box_detector_model.h5")

box_detected=False
last_detection_time=None
last_absence_time=None
previous_state=None

live_image_url="http:///current"

while True:

detected,last_image=capture_and_predict(model,live_image_url)

current_time=time.time()

if detected != previous_state:
print('Đã phát hiện hộp' nếu detected còn không thì print('Không có hộp')
previous_state=detected

if detected is None:
time.sleep(1)
continue

if detected:
last_absence_time=None

if not box_detected:
if last_detection_time is None:
last_detection_time=current_time
elif current_time - last_detection_time >= DETECTION_TIME_THRESHOLD :
box_detected=True
send_slack_message(get_coffee_message(True))

# 💾 Lưu ảnh cục bộ.
if last_image is not None:
timestamp=datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
filename=f"{SAVE_DIR}/box_{timestamp}.jpg"
cv2.imwrite(filename,last_image)
print(f"Ảnh đã được lưu tại: {filename}")

else :
# Hộp đã được phát hiện trước đó , không làm gì thêm
pass

else :
last_detection_time=None
if box_detected :
if last_absence_time is None :
last_absence_time=current_time
elif current_time-last_absence_time >= ABSENCE_TIME_THRESHOLD :
box_detected=False
send_slack_message(get_coffee_message(False))
else :
# Hộp chưa được phát hiện , không làm gì thêm
pass

time.sleep(1)

Kết quả cuối cùng và tác động đến tinh thần làm việc

Kết quả: Một văn phòng thông minh hơn (và con người hạnh phúc hơn) Bắt đầu từ một trò đùa ngẫu hứng, dự án IoT này đã biến thành một điều gì đó thực sự có ảnh hưởng đến niềm vui hàng ngày - và không thể thiếu chút phép màu của machine learning. CoffeeCam là minh chứng rằng công nghệ không nhất thiết phải to lớn hay phức tạp để hữu ích. Đôi khi, chỉ cần một chiếc Pi, một webcam và một chút tò mò là đủ. Giờ thì tôi sẽ tự đi pha cho mình một ly cà phê. Chúc mừng!

Reference Articles


寺嶋 一彦 (Kazuhiko Terashima)

Expert

Related Discussions

❖ Related Articles