Teknoloji artık mutfağa da girdi! Kendi kendine meyve tanıyan, stok durumunu takip eden bir buzdolabı yapmak ister miydin? Bu projeyle, Raspberry Pi 5 ve yapay zeka destekli görüntü işleme kullanarak evindeki buzdolabını akıllandırıyoruz. Hem eğlenceli hem de oldukça faydalı olan bu sistem sayesinde limonun azaldığını veya havucun fazlalaştığını gerçek zamanlı görebilecek, ihtiyacına göre stok kontrolü yapabileceksin.
Hazırsan gel, bu harika projeye birlikte göz atalım!
Projenin Görselleri










Kullanılan Malzemeler
Projede temel olarak bir Raspberry Pi 5 ile görüntü işleme, dokunmatik ekranla arayüz ve 3D yazıcı ile tasarlanmış özel bir kasa kullandık. İşte tüm bileşenler:
Projenin Amacı: Stok Takibini Otomatikleştirmek!
Hazırladığımız bu projeyle amacımız, buzdolabına koyduğun ürünleri (meyve, sebze vb.) kamera ve yapay zeka sayesinde otomatik olarak tanımak ve buna göre stok takibi yapabilmek. Geleneksel listelerle uğraşmak yerine, sensör ve yazılımın işbirliğiyle tamamen dijital bir çözüm sunuluyor.
Örneğin:
- Dolaba bir limon koyduğunda sistem bunu algılar ve limon stoğunu otomatik +1 yapar.
- Aynı şekilde çıkardığında ise “çıkarma modu” ile stok -1 olur.
3D Baskı ile Estetik ve Modüler Tasarım
Sistemin gövdesi 3D yazıcıdan çıkan özel parçalardan oluşuyor. Projeye hem dayanıklılık hem de şık bir görünüm kazandırıyor. Turuncu PLA filament ile basılan bu parçalar, ekran ve kamerayı sabitlemek için ideal ölçülere sahip. Kendi zevkinize göre istediğiniz renkte filamentler kullanabilirsiniz.




Parça | Açıklama |
Çerçeve Destek | Dik durmasını sağlar |
Alt Kasa | Anakart ve kabloları tutar |
Panel | Ekran için pencere içerir |
Orta Gövde | Ekranı ve modülü sabitler |
Stl dosyalarını buradan indirebilirsiniz:
Akıllı Buzdolabı Projesi STL
Arayüz: Dokunmatik ile Kolay Kullanım
Python ile geliştirilen arayüzde:
- Her meyve için (+) ve (-) butonları mevcut
- Kaydet butonuyla değişiklikler stok.txt dosyasına yazılıyor
- Çıkarma moduyla ekleme/çıkarma işlemi anında değiştirilebiliyor
Görüntüde meyve algılandığında ekranda adını ve güven skorunu gösteriyor. Sistem, bu bilgiye göre sayacı artırıyor ya da azaltıyor.
Yazılımın Kalbi: Yapay Zeka Modeli
Kullanılan model TensorFlow Lite formatında. Eğittiğiniz .h5 modelini şu şekilde .tflite’a dönüştürebilirsiniz:
import tensorflow as tf
# .h5 model yolunu buraya yaz
model = tf.keras.models.load_model("keras_model.h5")
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
# Çıktıyı kaydet
with open("model.tflite", "wb") as f:
f.write(tflite_model)
Ana Python Kodunun Temel Mantığı
- Kamera sürekli çalışıyor.
- Görüntüler 224×224 boyutuna getirilip modele veriliyor.
- En güvenilir sonuç alındığında stok güncelleniyor.
- GUI, tkinter ile tasarlandı.
Ayrıca: - cikarma_modu değişkeni, çıkarma mı ekleme mi yapılacağını belirliyor
- stok.txt dosyasıyla kalıcı stok takibi sağlanıyor.
Kodlar:
import tkinter as tk
from tkinter import messagebox
from PIL import Image, ImageTk
import os
import threading
import time
import cv2
import numpy as np
import tflite_runtime.interpreter as tflite
from picamera2 import Picamera2
import queue
# === Dosya ayarları ===
STOK_DOSYASI = "/home/emre/Desktop/stok.txt"
meyveler = {
"Elma": 0,
"Havuc": 0,
"Limon": 0
}
# === Stok işlemleri ===
def stok_oku():
if not os.path.exists(STOK_DOSYASI):
return {}
stok = {}
with open(STOK_DOSYASI, "r", encoding="utf-8") as f:
for satir in f:
try:
meyve, adet = satir.strip().split(":")
stok[meyve] = int(adet)
except:
continue
return stok
def stok_yaz(stok):
with open(STOK_DOSYASI, "w", encoding="utf-8") as f:
for meyve, adet in stok.items():
f.write(f"{meyve}:{adet}\n")
def kaydet():
stok = stok_oku()
for meyve, sayac in sayaclar.items():
mevcut = stok.get(meyve, 0)
degisim = sayac.get()
yeni_stok = mevcut - degisim if cikarma_modu.get() else mevcut + degisim
stok[meyve] = yeni_stok
stok_yaz(stok)
for sayac in sayaclar.values():
sayac.set(0)
messagebox.showinfo("Başarılı", "Stok başarıyla güncellendi!")
# === Tkinter Arayüz ===
pencere = tk.Tk()
pencere.title("Akıllı Buzdolabı")
pencere.geometry("400x600")
pencere.configure(bg="#f2f2f2")
sayaclar = {}
cikarma_modu = tk.BooleanVar(value=False)
title_label = tk.Label(pencere, text="Buzdolabı Stok Takibi", font=("Arial", 14, "bold"), bg="#f2f2f2")
title_label.pack(pady=10)
for meyve in meyveler:
frame = tk.Frame(pencere, bg="#ffffff", bd=1, relief="solid")
frame.pack(pady=6, padx=15, fill="x")
label = tk.Label(frame, text=meyve, font=("Arial", 12), width=10, bg="#ffffff")
label.pack(side="left", padx=5)
sayac = tk.IntVar(value=0)
sayaclar[meyve] = sayac
tk.Button(frame, text="-", font=("Arial", 12), width=3, bg="#ff9999", fg="white",
command=lambda m=meyve: sayaclar[m].set(sayaclar[m].get() - 1)).pack(side="left", padx=3)
tk.Label(frame, textvariable=sayac, font=("Arial", 12), width=4, bg="#ffffff").pack(side="left", padx=3)
tk.Button(frame, text="+", font=("Arial", 12), width=3, bg="#ffcc66", fg="white",
command=lambda m=meyve: sayaclar[m].set(sayaclar[m].get() + 1)).pack(side="left", padx=3)
def cikarma_modu_toggle():
if cikarma_modu.get():
cikarma_buton.config(text="Çıkarma Modu: Açık", bg="#ff4444")
else:
cikarma_buton.config(text="Çıkarma Modu: Kapalı", bg="#4CAF50")
cikarma_buton = tk.Button(
pencere, text="Çıkarma Modu: Kapalı", font=("Arial", 12, "bold"),
bg="#4CAF50", fg="white", width=20, height=2,
command=lambda: [cikarma_modu.set(not cikarma_modu.get()), cikarma_modu_toggle()]
)
cikarma_buton.pack(pady=10)
kaydet_buton = tk.Button(
pencere, text="💾 Kaydet", font=("Arial", 12, "bold"),
bg="#2196F3", fg="white", width=15, height=2,
command=kaydet
)
kaydet_buton.pack(pady=5)
kamera_label = tk.Label(pencere, bg="#f2f2f2")
kamera_label.pack(pady=10)
tanima_label = tk.Label(pencere, text="Algılanan meyve: -", font=("Arial", 12), bg="#f2f2f2")
tanima_label.pack()
# === Model Yükleme ===
with open("/home/emre/Desktop/fruits-tm-model/labels.txt", "r") as f:
labels = [line.strip() for line in f.readlines()]
interpreter = tflite.Interpreter(model_path="/home/emre/Desktop/fruits-tm-model/model.tflite")
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
def predict(frame):
img = cv2.resize(frame, (224, 224))
img = img.astype(np.float32)
img = (img / 127.5) - 1
img = np.expand_dims(img, axis=0)
interpreter.set_tensor(input_details[0]['index'], img)
interpreter.invoke()
return interpreter.get_tensor(output_details[0]['index'])
# === Kamera ve GUI Entegrasyonu ===
frame_queue = queue.Queue()
son_meyve = None
son_zaman = 0
def kamera_takip():
picam2 = Picamera2()
config = picam2.create_preview_configuration(main={"format": "RGB888", "size": (640, 480)})
picam2.configure(config)
picam2.start()
while True:
frame = picam2.capture_array()
prediction = predict(frame)
index = np.argmax(prediction)
class_name = labels[index].capitalize()
confidence = prediction[0][index]
if frame_queue.empty():
frame_queue.put((frame.copy(), class_name, confidence))
time.sleep(0.2)
def gui_guncelle():
global son_meyve, son_zaman
try:
frame, class_name, confidence = frame_queue.get_nowait()
# RGB → BGR dönüşümü, çünkü PIL bazen yanlış yorumluyor
img_rgb = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
img_pil = Image.fromarray(img_rgb).resize((300, 200))
img_tk = ImageTk.PhotoImage(img_pil)
kamera_label.imgtk = img_tk
kamera_label.configure(image=img_tk)
# Tahmin ve sayaç güncelleme
if confidence > 0.90 and class_name in sayaclar:
simdi = time.time()
if class_name != son_meyve or (simdi - son_zaman > 5):
if cikarma_modu.get():
sayaclar[class_name].set(sayaclar[class_name].get() - 1)
tanima_label.config(text=f"Çıkarma Modu - Algılanan: {class_name} ({confidence*100:.1f}%)")
else:
sayaclar[class_name].set(sayaclar[class_name].get() + 1)
tanima_label.config(text=f"Ekleme Modu - Algılanan: {class_name} ({confidence*100:.1f}%)")
son_meyve = class_name
son_zaman = simdi
except queue.Empty:
pass
pencere.after(100, gui_guncelle)
kamera_thread = threading.Thread(target=kamera_takip, daemon=True)
kamera_thread.start()
pencere.after(100, gui_guncelle)
pencere.mainloop()
Projenin Kullanım Senaryosu
Diyelim ki buzdolabına 3 havuç ve 2 limon yerleştirdin. Sistem bunları algılıyor ve arayüze işliyor. Stokta 1 limon kaldığında, “limon bitiyor” uyarısı alabilir, ihtiyaç listeni buna göre güncelleyebilirsin.
Projenin Tüm Detaylarını Anlattığımız YouTube Videomuzu İzleyin!
Projenin yapım aşamalarını adım adım anlattığımız videomuz yayında!
Kamera bağlantısından yapay zeka modeline, 3D baskıdan yazılım kurulumuna kadar tüm detayları görsel olarak takip edebilir, kendi projeni oluştururken destek alabilirsin.
Videoyu izlemek için tıklayın:
Beğenmeyi ve abone olmayı unutmayın!
Mutfakta Akıllı Dönem Başladı!
Bu projeyle:
- Görüntü işleme temelli ürün tanıma yapmayı,
- TFLite modeliyle embedded AI uygulamayı,
- 3D yazıcı ile işlevsel ürün kabı üretmeyi,
- Dokunmatik ekranlı GUI geliştirmeyi öğrenmiş oldun.
İster kendi kullanımın için geliştirebilir, istersen okullarda STEM projesi olarak sunabilirsin.
Hadi ne duruyorsun, malzemelerini hazırla ve geleceği evine getir!