back to top

Geleceğin Buzdolabını Bugün Yap! Akıllı Buzdolabı Projesi ile Evine Yapay Zeka Çağını Getir

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:

Ürün KoduAçıklama
17103WaveShare 4inch HDMI LCD, 800×480, IPS
22709SanDisk 64GB microSD Kart Class10 – 98MB/s
22561Raspberry Pi 5 – 4GB
23131Raspberry Pi 5 için 27W USB-C Güç Adaptörü
14849Tinylab 3D 1.75 mm Turuncu PLA Filament
12958Raspberry Pi Kamera Modül V2
22866Raspberry Pi Kamera Kablosu Standard – Mini – 200mm V2

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çaAçıklama
Çerçeve Destek Dik durmasını sağlar
Alt KasaAnakart ve kabloları tutar
PanelEkran için pencere içerir
Orta GövdeEkranı 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!

Son Çıkan Yazılar

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz