Çürüyormu ?
Gönderim Zamanı: 23 Aralık 2019 09:39
#!/usr/bin/env python3
# =============================================================================
# ERLİK — Raspberry Pi Zero 2
# Wake Word : Vosk ("hey" kelimesi yerel olarak algılanır)
# STT : Vosk Türkçe (tamamen offline)
# AI : Gemini 1.5 Flash
# Ekran : SSD1306 OLED 128x64
# =============================================================================
import os
import json
import queue
import threading
import time
import logging
import sys
import warnings
warnings.filterwarnings("ignore")
import numpy as np
import sounddevice as sd
from vosk import Model, KaldiRecognizer
import google.generativeai as genai
from luma.core.interface.serial import i2c
from luma.oled.device import ssd1306
from luma.core.render import canvas
# =============================================================================
# YAPILANDIRMA — Sadece buraya dokunun
# =============================================================================
GEMINI_API_KEY =AIzaSyAgSe9tAhYLP-aXl6tklXSQOT7TXRzaetw"
VOSK_MODEL_PATH =/home/rafayel16/vosk-model-small-tr-0.3"
WAKE_WORDS =["hey", "he", "ei", "ay] # Vosk'un duyabileceği alternatifler
MIC_DEVICE_INDEX=1 # USB mikrofon card 1
SAMPLE_RATE =48000 # USB mikrofon 48000Hz istiyor
CHANNELS =1
CHUNK =8000 # 48000 / 6=yaklaşık 160ms
OLED_I2C_PORT =1
OLED_I2C_ADDRESS=0x3C
GEMINI_MODEL =gemini-1.5-flash"
# =============================================================================
# PIN KONFİGÜRASYONU (Bilgi amaçlı)
# =============================================================================
# OLED SSD1306 (I2C):
# VCC → 3.3V (Pin 1)
# GND → GND (Pin 6)
# SDA → GPIO2 (Pin 3)
# SCL → GPIO3 (Pin 5)
#
# USB Mikrofon:
# Direkt USB portuna takılı — başka bağlantı yok
#
# I2S Mikrofon (INMP441) — artık kullanılmıyor, bağlı kalabilir:
# SCK → GPIO18 (Pin 12)
# WS → GPIO20 (Pin 38)
# SD → GPIO16 (Pin 36)
# L/R → GND
# =============================================================================
# =============================================================================
# LOGLAMA
# =============================================================================
logging.basicConfig(
level=logging.INFO,
format=[%(levelname)s] %(message)s",
handlers=[logging.StreamHandler(sys.stdout)]
)
log=logging.getLogger("erlik")
# =============================================================================
# OLED
# =============================================================================
def get_display():
try:
serial=i2c(port=OLED_I2C_PORT, address=OLED_I2C_ADDRESS)
device=ssd1306(serial, width=128, height=64)
log.info("OLED hazir.")
return device
except Exception as e:
log.error(f"OLED hatasi: {e}")
return None
def oled_show(device, satirlar: list, ters: bool=False):
if device is None:
return
try:
with canvas(device) as draw:
if ters:
draw.rectangle(device.bounding_box, outline=white", fill=white")
y=0
for satir in satirlar[:8]:
draw.text((0, y), str(satir), fill=black" if ters else "white")
y += 8
except Exception as e:
log.warning(f"OLED cizim hatasi: {e}")
def oled_temizle(device):
if device is None:
return
try:
with canvas(device) as draw:
draw.rectangle(device.bounding_box, outline=black", fill=black")
except Exception:
pass
def kelime_sar(metin: str, genislik: int=21) - list:
kelimeler=metin.split()
satirlar, simdiki=[], ""
for kelime in kelimeler:
if len(simdiki) + len(kelime) + 1=genislik:
simdiki=(simdiki + " " + kelime).strip()
else:
if simdiki:
satirlar.append(simdiki)
simdiki=kelime
if simdiki:
satirlar.append(simdiki)
return satirlar
def oled_kaydir(device, baslik: str, metin: str, gecikme: float=0.07):
if device is None:
return
satirlar =kelime_sar(metin)
tum_satirlar=["─" * 21] + satirlar
gorunen =6
toplam =len(tum_satirlar)
if toplam=gorunen:
oled_show(device, [baslik] + tum_satirlar)
time.sleep(max(2.5, len(satirlar) * 0.9))
return
for baslangic in range(toplam - gorunen + 1):
oled_show(device, [baslik] + tum_satirlar[baslangic:baslangic + gorunen])
time.sleep(gecikme)
time.sleep(2.0)
def oled_bosta(device, frame: int):
noktalar=["· ", "·· ", "···", " ··", " ·", " ]
anim=noktalar[frame % len(noktalar)]
oled_show(device, [
" E R L I K",
"─" * 21,
"",
f" {anim} bekliyor {anim}",
"",
" 'Hey' deyin"
])
def oled_uyandi_animasyonu(device):
for _ in range(3):
oled_show(device, [
" E R L I K",
"─" * 21,
"",
" UYANDIM!",
"",
" Dinliyorum..."
], ters=True)
time.sleep(0.15)
oled_show(device, [
" E R L I K",
"─" * 21,
"",
" UYANDIM!",
"",
" Dinliyorum..."
])
time.sleep(0.1)
# =============================================================================
# GEMİNİ
# =============================================================================
def gemini_baslat():
if not GEMINI_API_KEY or GEMINI_API_KEY == "AIzaSyAgSe9tAhYLP-aXl6tklXSQOT7TXRzaetw":
log.error("AIzaSyAgSe9tAhYLP-aXl6tklXSQOT7TXRzaetw!")
return None
try:
genai.configure(api_key=AIzaSyAgSe9tAhYLP-aXl6tklXSQOT7TXRzaetw)
model=genai.GenerativeModel(
model_name=GEMINI_MODEL,
system_instruction=(
"Sen 'Erlik' adinda bilge ve gizemli bir yapay zeka asistansin. "
"Turkce konusursun. Cevaplarin kisa ve oz olmali, maksimum 2 cumle. "
"Ekran kucuk oldugu icin uzun cevap verme. "
"Felsefi ve derin ama sade bir dille konusursun. "
"Asla emoji veya ozel karakter kullanma."
)
)
log.info("Gemini hazir.")
return model
except Exception as e:
log.error(f"Gemini hatasi: {e}")
return None
def gemini_sor(model, metin: str) - str:
if model is None:
return "Gemini baglantisi yok."
try:
yanit=model.generate_content(metin)
return yanit.text.strip()
except Exception as e:
log.error(f"Gemini hata: {e}")
return "Baglanti hatasi."
# =============================================================================
# VOSK — Wake Word + STT
# Vosk 48000Hz ses alir, 16000Hz modelle kullanmak icin
# sounddevice ile okuyup 3'e bolduruyoruz (downsample)
# =============================================================================
def vosk_baslat():
if not os.path.exists(VOSK_MODEL_PATH):
log.error(f"Vosk model bulunamadi: {VOSK_MODEL_PATH}")
return None, None
try:
model =Model(VOSK_MODEL_PATH)
taniyici =KaldiRecognizer(model, 16000) # Vosk 16000Hz bekler
log.info("Vosk hazir.")
return model, taniyici
except Exception as e:
log.error(f"Vosk hatasi: {e}")
return None, None
def ses_oku_16k(sure_saniye: float) - np.ndarray:
"""
USB mikrofondan 48000Hz okur, 16000Hz'e downsample eder.
Vosk 16000Hz bekliyor, mikrofon 48000Hz veriyor.
"""
ornek_sayisi=int(SAMPLE_RATE * sure_saniye)
ses=sd.rec(
ornek_sayisi,
samplerate=SAMPLE_RATE,
channels=CHANNELS,
dtype=int16",
device=MIC_DEVICE_INDEX
)
sd.wait()
# 48000 - 16000: her 3 ornekten 1'ini al
ses_16k=ses[::3].flatten()
return ses_16k
def wake_word_bekle(taniyici, device) - bool:
"""
Vosk ile surekli dinle, wake word duyunca True don.
0.3 saniyelik parcalar halinde okur — Pi Zero 2 icin hafif.
"""
log.info("Wake word bekleniyor: 'Hey'...")
frame=0
while True:
# OLED animasyonu
if frame % 3 == 0:
oled_bosta(device, frame // 3)
frame += 1
# 0.3 saniyelik ses parcasi oku
try:
parca=ses_oku_16k(0.3)
except Exception as e:
log.error(f"Mikrofon okuma hatasi: {e}")
time.sleep(0.5)
continue
# Vosk ile tanı
veri=parca.tobytes()
if taniyici.AcceptWaveform(veri):
sonuc=json.loads(taniyici.Result())
else:
sonuc=json.loads(taniyici.PartialResult())
metin=sonuc.get("text", "") or sonuc.get("partial", "")
if metin:
log.debug(f"Duyulan: {metin}")
# Wake word kontrolu
for kelime in WAKE_WORDS:
if kelime in metin.lower():
log.info(f"Wake word algilandi: '{metin}'")
taniyici.Reset() # Tamponları temizle
return True
def konusma_dinle(taniyici, device) - str:
"""
Kullanicinin komutunu dinle, sessizlik gelince dur.
Maksimum 8 saniye bekler.
"""
oled_show(device, [
" E R L I K",
"─" * 21,
"",
" Dinliyorum...",
"",
" Konusabilirsiniz"
])
log.info("Komut bekleniyor...")
toplanan=[]
bos_parca=0
MAX_BOS =5 # 5 x 0.4s=2 saniye sessizlik=bitti
MAX_SURE=20 # Maksimum 20 parca=8 saniye
taniyici.Reset()
for _ in range(MAX_SURE):
try:
parca=ses_oku_16k(0.4)
except Exception:
break
veri=parca.tobytes()
if taniyici.AcceptWaveform(veri):
sonuc=json.loads(taniyici.Result())
metin=sonuc.get("text", "").strip()
if metin:
toplanan.append(metin)
bos_parca=0
log.debug(f"Parcali: {metin}")
else:
bos_parca += 1
else:
kismi=json.loads(taniyici.PartialResult())
kismi_metin=kismi.get("partial", "").strip()
if kismi_metin:
bos_parca=0
else:
bos_parca += 1
if bos_parca=MAX_BOS and toplanan:
break
# Son parcayi al
son=json.loads(taniyici.FinalResult())
son_metin=son.get("text", "").strip()
if son_metin:
toplanan.append(son_metin)
tam_metin= ".join(toplanan).strip()
log.info(f"Duyulan komut: {tam_metin}")
return tam_metin
# =============================================================================
# ANA PROGRAM
# =============================================================================
def main():
log.info("= * 40)
log.info(" ERLIK baslatiliyor...")
log.info("= * 40)
# Bilesenleri baslat
device =get_display()
vosk_model, taniyici=vosk_baslat()
gemini =gemini_baslat()
# Baslangi ekrani
oled_show(device, [
" E R L I K",
"─" * 21,
"",
" Baslatiliyor...",
"",
" Lutfen bekleyin"
])
time.sleep(2)
# Hata kontrolu
if vosk_model is None:
oled_show(device, ["HATA!", "Vosk model yok!", f"{VOSK_MODEL_PATH[:20]}])
time.sleep(5)
return
if gemini is None:
oled_show(device, ["HATA!", "Gemini key", "eksik!])
time.sleep(5)
return
oled_show(device, [
" E R L I K",
"─" * 21,
"",
" Hazarim.",
"",
" 'Hey' deyin"
])
time.sleep(0.5)
log.info("Ana dongu basliyor.")
# Ana dongu
while True:
try:
# 1. Wake word bekle
wake_word_bekle(taniyici, device)
# 2. Uyandi animasyonu
oled_uyandi_animasyonu(device)
time.sleep(0.2)
# 3. Komutu dinle
komut=konusma_dinle(taniyici, device)
if not komut:
oled_show(device, [
" E R L I K",
"─" * 21,
"",
" Anlayamadim.",
"",
" 'Hey' deyin"
])
time.sleep(1.5)
continue
# 4. Duyulani goster
oled_kaydir(device, "Sen dedin:", komut, gecikme=0.05)
# 5. Gemini'ye sor
oled_show(device, [
" E R L I K",
"─" * 21,
"",
" Dusunuyor...",
])
yanit=gemini_sor(gemini, komut)
# 6. Yaniti goster
oled_kaydir(device, "Erlik:", yanit, gecikme=0.06)
# 7. Beklemeye don
oled_show(device, [
" E R L I K",
"─" * 21,
"",
" Hazarim.",
"",
" 'Hey' deyin"
])
time.sleep(0.3)
except KeyboardInterrupt:
log.info("Kullanici cikisi.")
break
except Exception as e:
log.error(f"Dongu hatasi: {e}")
oled_show(device, ["", f" Hata: {str(e)[:20]}", "", " Yeniden deneniyor...])
time.sleep(3)
oled_temizle(device)
log.info("Erlik kapatildi.")
if __name__ == "__main__":
main()[EDIT]Rafayel,2026-05-30 15:36:02[/EDIT]
# =============================================================================
# ERLİK — Raspberry Pi Zero 2
# Wake Word : Vosk ("hey" kelimesi yerel olarak algılanır)
# STT : Vosk Türkçe (tamamen offline)
# AI : Gemini 1.5 Flash
# Ekran : SSD1306 OLED 128x64
# =============================================================================
import os
import json
import queue
import threading
import time
import logging
import sys
import warnings
warnings.filterwarnings("ignore")
import numpy as np
import sounddevice as sd
from vosk import Model, KaldiRecognizer
import google.generativeai as genai
from luma.core.interface.serial import i2c
from luma.oled.device import ssd1306
from luma.core.render import canvas
# =============================================================================
# YAPILANDIRMA — Sadece buraya dokunun
# =============================================================================
GEMINI_API_KEY =AIzaSyAgSe9tAhYLP-aXl6tklXSQOT7TXRzaetw"
VOSK_MODEL_PATH =/home/rafayel16/vosk-model-small-tr-0.3"
WAKE_WORDS =["hey", "he", "ei", "ay] # Vosk'un duyabileceği alternatifler
MIC_DEVICE_INDEX=1 # USB mikrofon card 1
SAMPLE_RATE =48000 # USB mikrofon 48000Hz istiyor
CHANNELS =1
CHUNK =8000 # 48000 / 6=yaklaşık 160ms
OLED_I2C_PORT =1
OLED_I2C_ADDRESS=0x3C
GEMINI_MODEL =gemini-1.5-flash"
# =============================================================================
# PIN KONFİGÜRASYONU (Bilgi amaçlı)
# =============================================================================
# OLED SSD1306 (I2C):
# VCC → 3.3V (Pin 1)
# GND → GND (Pin 6)
# SDA → GPIO2 (Pin 3)
# SCL → GPIO3 (Pin 5)
#
# USB Mikrofon:
# Direkt USB portuna takılı — başka bağlantı yok
#
# I2S Mikrofon (INMP441) — artık kullanılmıyor, bağlı kalabilir:
# SCK → GPIO18 (Pin 12)
# WS → GPIO20 (Pin 38)
# SD → GPIO16 (Pin 36)
# L/R → GND
# =============================================================================
# =============================================================================
# LOGLAMA
# =============================================================================
logging.basicConfig(
level=logging.INFO,
format=[%(levelname)s] %(message)s",
handlers=[logging.StreamHandler(sys.stdout)]
)
log=logging.getLogger("erlik")
# =============================================================================
# OLED
# =============================================================================
def get_display():
try:
serial=i2c(port=OLED_I2C_PORT, address=OLED_I2C_ADDRESS)
device=ssd1306(serial, width=128, height=64)
log.info("OLED hazir.")
return device
except Exception as e:
log.error(f"OLED hatasi: {e}")
return None
def oled_show(device, satirlar: list, ters: bool=False):
if device is None:
return
try:
with canvas(device) as draw:
if ters:
draw.rectangle(device.bounding_box, outline=white", fill=white")
y=0
for satir in satirlar[:8]:
draw.text((0, y), str(satir), fill=black" if ters else "white")
y += 8
except Exception as e:
log.warning(f"OLED cizim hatasi: {e}")
def oled_temizle(device):
if device is None:
return
try:
with canvas(device) as draw:
draw.rectangle(device.bounding_box, outline=black", fill=black")
except Exception:
pass
def kelime_sar(metin: str, genislik: int=21) - list:
kelimeler=metin.split()
satirlar, simdiki=[], ""
for kelime in kelimeler:
if len(simdiki) + len(kelime) + 1=genislik:
simdiki=(simdiki + " " + kelime).strip()
else:
if simdiki:
satirlar.append(simdiki)
simdiki=kelime
if simdiki:
satirlar.append(simdiki)
return satirlar
def oled_kaydir(device, baslik: str, metin: str, gecikme: float=0.07):
if device is None:
return
satirlar =kelime_sar(metin)
tum_satirlar=["─" * 21] + satirlar
gorunen =6
toplam =len(tum_satirlar)
if toplam=gorunen:
oled_show(device, [baslik] + tum_satirlar)
time.sleep(max(2.5, len(satirlar) * 0.9))
return
for baslangic in range(toplam - gorunen + 1):
oled_show(device, [baslik] + tum_satirlar[baslangic:baslangic + gorunen])
time.sleep(gecikme)
time.sleep(2.0)
def oled_bosta(device, frame: int):
noktalar=["· ", "·· ", "···", " ··", " ·", " ]
anim=noktalar[frame % len(noktalar)]
oled_show(device, [
" E R L I K",
"─" * 21,
"",
f" {anim} bekliyor {anim}",
"",
" 'Hey' deyin"
])
def oled_uyandi_animasyonu(device):
for _ in range(3):
oled_show(device, [
" E R L I K",
"─" * 21,
"",
" UYANDIM!",
"",
" Dinliyorum..."
], ters=True)
time.sleep(0.15)
oled_show(device, [
" E R L I K",
"─" * 21,
"",
" UYANDIM!",
"",
" Dinliyorum..."
])
time.sleep(0.1)
# =============================================================================
# GEMİNİ
# =============================================================================
def gemini_baslat():
if not GEMINI_API_KEY or GEMINI_API_KEY == "AIzaSyAgSe9tAhYLP-aXl6tklXSQOT7TXRzaetw":
log.error("AIzaSyAgSe9tAhYLP-aXl6tklXSQOT7TXRzaetw!")
return None
try:
genai.configure(api_key=AIzaSyAgSe9tAhYLP-aXl6tklXSQOT7TXRzaetw)
model=genai.GenerativeModel(
model_name=GEMINI_MODEL,
system_instruction=(
"Sen 'Erlik' adinda bilge ve gizemli bir yapay zeka asistansin. "
"Turkce konusursun. Cevaplarin kisa ve oz olmali, maksimum 2 cumle. "
"Ekran kucuk oldugu icin uzun cevap verme. "
"Felsefi ve derin ama sade bir dille konusursun. "
"Asla emoji veya ozel karakter kullanma."
)
)
log.info("Gemini hazir.")
return model
except Exception as e:
log.error(f"Gemini hatasi: {e}")
return None
def gemini_sor(model, metin: str) - str:
if model is None:
return "Gemini baglantisi yok."
try:
yanit=model.generate_content(metin)
return yanit.text.strip()
except Exception as e:
log.error(f"Gemini hata: {e}")
return "Baglanti hatasi."
# =============================================================================
# VOSK — Wake Word + STT
# Vosk 48000Hz ses alir, 16000Hz modelle kullanmak icin
# sounddevice ile okuyup 3'e bolduruyoruz (downsample)
# =============================================================================
def vosk_baslat():
if not os.path.exists(VOSK_MODEL_PATH):
log.error(f"Vosk model bulunamadi: {VOSK_MODEL_PATH}")
return None, None
try:
model =Model(VOSK_MODEL_PATH)
taniyici =KaldiRecognizer(model, 16000) # Vosk 16000Hz bekler
log.info("Vosk hazir.")
return model, taniyici
except Exception as e:
log.error(f"Vosk hatasi: {e}")
return None, None
def ses_oku_16k(sure_saniye: float) - np.ndarray:
"""
USB mikrofondan 48000Hz okur, 16000Hz'e downsample eder.
Vosk 16000Hz bekliyor, mikrofon 48000Hz veriyor.
"""
ornek_sayisi=int(SAMPLE_RATE * sure_saniye)
ses=sd.rec(
ornek_sayisi,
samplerate=SAMPLE_RATE,
channels=CHANNELS,
dtype=int16",
device=MIC_DEVICE_INDEX
)
sd.wait()
# 48000 - 16000: her 3 ornekten 1'ini al
ses_16k=ses[::3].flatten()
return ses_16k
def wake_word_bekle(taniyici, device) - bool:
"""
Vosk ile surekli dinle, wake word duyunca True don.
0.3 saniyelik parcalar halinde okur — Pi Zero 2 icin hafif.
"""
log.info("Wake word bekleniyor: 'Hey'...")
frame=0
while True:
# OLED animasyonu
if frame % 3 == 0:
oled_bosta(device, frame // 3)
frame += 1
# 0.3 saniyelik ses parcasi oku
try:
parca=ses_oku_16k(0.3)
except Exception as e:
log.error(f"Mikrofon okuma hatasi: {e}")
time.sleep(0.5)
continue
# Vosk ile tanı
veri=parca.tobytes()
if taniyici.AcceptWaveform(veri):
sonuc=json.loads(taniyici.Result())
else:
sonuc=json.loads(taniyici.PartialResult())
metin=sonuc.get("text", "") or sonuc.get("partial", "")
if metin:
log.debug(f"Duyulan: {metin}")
# Wake word kontrolu
for kelime in WAKE_WORDS:
if kelime in metin.lower():
log.info(f"Wake word algilandi: '{metin}'")
taniyici.Reset() # Tamponları temizle
return True
def konusma_dinle(taniyici, device) - str:
"""
Kullanicinin komutunu dinle, sessizlik gelince dur.
Maksimum 8 saniye bekler.
"""
oled_show(device, [
" E R L I K",
"─" * 21,
"",
" Dinliyorum...",
"",
" Konusabilirsiniz"
])
log.info("Komut bekleniyor...")
toplanan=[]
bos_parca=0
MAX_BOS =5 # 5 x 0.4s=2 saniye sessizlik=bitti
MAX_SURE=20 # Maksimum 20 parca=8 saniye
taniyici.Reset()
for _ in range(MAX_SURE):
try:
parca=ses_oku_16k(0.4)
except Exception:
break
veri=parca.tobytes()
if taniyici.AcceptWaveform(veri):
sonuc=json.loads(taniyici.Result())
metin=sonuc.get("text", "").strip()
if metin:
toplanan.append(metin)
bos_parca=0
log.debug(f"Parcali: {metin}")
else:
bos_parca += 1
else:
kismi=json.loads(taniyici.PartialResult())
kismi_metin=kismi.get("partial", "").strip()
if kismi_metin:
bos_parca=0
else:
bos_parca += 1
if bos_parca=MAX_BOS and toplanan:
break
# Son parcayi al
son=json.loads(taniyici.FinalResult())
son_metin=son.get("text", "").strip()
if son_metin:
toplanan.append(son_metin)
tam_metin= ".join(toplanan).strip()
log.info(f"Duyulan komut: {tam_metin}")
return tam_metin
# =============================================================================
# ANA PROGRAM
# =============================================================================
def main():
log.info("= * 40)
log.info(" ERLIK baslatiliyor...")
log.info("= * 40)
# Bilesenleri baslat
device =get_display()
vosk_model, taniyici=vosk_baslat()
gemini =gemini_baslat()
# Baslangi ekrani
oled_show(device, [
" E R L I K",
"─" * 21,
"",
" Baslatiliyor...",
"",
" Lutfen bekleyin"
])
time.sleep(2)
# Hata kontrolu
if vosk_model is None:
oled_show(device, ["HATA!", "Vosk model yok!", f"{VOSK_MODEL_PATH[:20]}])
time.sleep(5)
return
if gemini is None:
oled_show(device, ["HATA!", "Gemini key", "eksik!])
time.sleep(5)
return
oled_show(device, [
" E R L I K",
"─" * 21,
"",
" Hazarim.",
"",
" 'Hey' deyin"
])
time.sleep(0.5)
log.info("Ana dongu basliyor.")
# Ana dongu
while True:
try:
# 1. Wake word bekle
wake_word_bekle(taniyici, device)
# 2. Uyandi animasyonu
oled_uyandi_animasyonu(device)
time.sleep(0.2)
# 3. Komutu dinle
komut=konusma_dinle(taniyici, device)
if not komut:
oled_show(device, [
" E R L I K",
"─" * 21,
"",
" Anlayamadim.",
"",
" 'Hey' deyin"
])
time.sleep(1.5)
continue
# 4. Duyulani goster
oled_kaydir(device, "Sen dedin:", komut, gecikme=0.05)
# 5. Gemini'ye sor
oled_show(device, [
" E R L I K",
"─" * 21,
"",
" Dusunuyor...",
])
yanit=gemini_sor(gemini, komut)
# 6. Yaniti goster
oled_kaydir(device, "Erlik:", yanit, gecikme=0.06)
# 7. Beklemeye don
oled_show(device, [
" E R L I K",
"─" * 21,
"",
" Hazarim.",
"",
" 'Hey' deyin"
])
time.sleep(0.3)
except KeyboardInterrupt:
log.info("Kullanici cikisi.")
break
except Exception as e:
log.error(f"Dongu hatasi: {e}")
oled_show(device, ["", f" Hata: {str(e)[:20]}", "", " Yeniden deneniyor...])
time.sleep(3)
oled_temizle(device)
log.info("Erlik kapatildi.")
if __name__ == "__main__":
main()[EDIT]Rafayel,2026-05-30 15:36:02[/EDIT]
Üye imzalarını sadece giriş yapan üyelerimiz görebilir
Gönderim Zamanı: 23 Aralık 2019 12:06
Gayet iyi gelişiyor çürüme görmüyorum. Zaten kolay bir tür hocam güneş ışığında bile sorunsuz gelişir.[:)]
Üye imzalarını sadece giriş yapan üyelerimiz görebilir



