You are on page 1of 59

T.C.

SAKARYA ÜNİVERSİTESİ
BİLGİSAYAR VE BİLİŞİM BİLİMLERİ FAKÜLTESİ

BSM 498 BİTİRME ÇALIŞMASI

SES TANIMA İLE EŞYA BULMA SİSTEMİ

B161210352 – Melih ÇELENK

Bölüm : BİLGİSAYAR MÜHENDİSLİĞİ


Danışman : Doç. Dr. Cüneyt BAYILMIŞ

2019-2020 Güz Dönemi


T.C.
SAKARYA ÜNİVERSİTESİ
BİLGİSAYAR VE BİLİŞİM BİLİMLERİ FAKÜLTESİ

SES TANIMA İLE EŞYA BULMA SİSTEMİ

BSM 498 - BİTİRME ÇALIŞMASI

Melih ÇELENK

Fakülte Anabilim Dalı : BİLGİSAYAR MÜHENDİSLİĞİ

Bu tez .. / .. / … tarihinde aşağıdaki jüri tarafından oybirliği / oyçokluğu ile


kabul edilmiştir.

………………. ………………. ……………….


Jüri Başkanı Üye Üye
ÖNSÖZ

İnsan, yüzyıllardan beri başta yaşamını sürdürmek, daha sonra yaşam kalitesini
artırmak için birtakım aletlere ihtiyaç duymuş, gereksinimleri doğrultusunda icatlar
ortaya koymuştur. Zamanla, kullanılan eşyanın sayısı artmış; sonunda evlerde,
ofislerde kategorize edilmeye başlanmıştır. Bazı benzer özelliklere sahip olan araç
gereçler, kitaplar bir araya getirilmiş; ancak eşya çoğaldıkça sınıflandırma da bir
problem hâline gelmeye başlamıştır. Kullanım amacına göre sınıflandırma bir yana;
eski/yeni, büyük/küçük, sık kullanılan/az kullanılan gibi ortak üye barındırabilecek
sınıflar türetilmiştir. Bu kadar çok sınıflandırma çeşidi, özellikle belli ilgi alanları
sebebiyle evinde veya ofisinde çok fazla eşya barındıran insanların hafızasını
yormaya başlamış, bir eşyayı farklı yerlerde aramak gibi vakit kayıplarına yol
açmıştır. Bu vakit kaybını ortadan kaldırmak ve sadece yapılmak istenen işe
odaklanılmasını sağlamak amacıyla, arama motorlarında olduğu gibi günlük hayatta
da arama işinin dijital asistanlara devredilmesinde yarar vardır.
iv

İÇİNDEKİLER

ÖNSÖZ ....................................................................................................................... iii


ŞEKİLLER LİSTESİ .................................................................................................. vi
TABLOLAR LİSTESİ .............................................................................................. viii
ÖZET........................................................................................................................... ix
BÖLÜM 1. GİRİŞ...................................................................................... 1
1.1. Problemin Tanımı ................................................................... 1
1.2. Geliştirilen Çözüm ................................................................. 1
1.2.1. Sistemin Kurulumu................................................................. 1
1.2.2. Eşyaların Kaydedilmesi .......................................................... 2
1.2.3. Eşyanın Konumunun Tespit Edilmesi .................................... 2
1.3. Başarı Ölçütleri....................................................................... 2
BÖLÜM 2. KULLANILAN TEKNOLOJİLER ........................................ 3
2.1. NodeMCU ve Arduino IDE .................................................... 3
2.1.1. Kullanılan Paket ve Kütüphaneler .......................................... 4
2.1.1.1. Arduino IDE Üzerinde NodeMCU Desteği Sağlanması ........ 4
2.1.1.2. ESP8266WiFi Kütüphanesi .................................................... 4
2.1.1.3. WiFiManager Kütüphanesi .................................................... 5
2.1.1.4. ESP8266WebServer ............................................................... 6
2.1.1.5. EEPROM Kütüphanesi........................................................... 6
2.2. Android Studio ....................................................................... 6
2.2.1. Retrofit Kütüphanesi .............................................................. 6
2.2.2. RecognizerIntent Sınıfı........................................................... 7
2.2.3. SQLite Veri Tabanı ................................................................. 8
2.2.4. Android Network Tools Kütüphanesi ..................................... 8
BÖLÜM 3. TASARIM .............................................................................. 9
3.1. Sistem Mimarisi ..................................................................... 9
3.2. Modelleme ............................................................................ 10
3.3. Mobil Uygulama Ara Yüz Tasarımı ..................................... 14
3.4. Tasarımda Karşılaşılan Zorluklar ......................................... 22
v

3.4.1. Ses Tanıma İçin Cihaz Seçimi .............................................. 22


3.4.2. Ağdaki Cihazların Bulunması .............................................. 23
3.4.2.1. Alternatif Çözümler .............................................................. 24
3.4.2.2. Karar Kılınan Çözüm ........................................................... 25
3.5. Maliyet Analizi ..................................................................... 25
BÖLÜM 4. GERÇEKLEŞTİRİLEN UYGULAMA ............................... 27
4.1. Kullanım Senaryoları ........................................................... 27
4.2. Performans Ölçümleri .......................................................... 39
4.3. Karşılaşılan Zorluklar ve Getirilen Çözümler ...................... 40
4.3.1. NodeMCU ............................................................................ 40
4.3.1.1. EEPROM İle İlgili Durumlar ............................................... 40
4.3.1.2. C++ Dilinde Statik Sınıf ....................................................... 40
4.3.1.3. Web Server ve Parametre Aktarımı ...................................... 41
4.3.1.4. Sinyal Gönderirken Diğer İşlemlerin Beklemesi ................. 41
4.3.1.5. String İle İlgili Derleyici Problemi ....................................... 41
4.3.2. Android ................................................................................. 41
4.3.2.1. RecyclerView ....................................................................... 41
4.3.2.2. Tekil Verilerin Saklanması ................................................... 42
4.3.2.3. Retrofit İle İlgili Durumlar ................................................... 42
4.3.2.4. SQLite Veri Tabanı İle İlgili Durumlar................................. 42
4.3.2.5. Sözdizim Analizi .................................................................. 43
4.3.2.6. Ağ İşlemleri ve Hafıza Aşımı Hatası .................................... 43
4.3.2.7. Asenkron Çalışmada Problemler .......................................... 43
4.3.2.8. Eski Android Sürümleri ile İlgili Hatalar ............................. 44
BÖLÜM 5. SONUÇLAR VE ÖNERİLER ............................................. 45
KAYNAKLAR ........................................................................................................... 46
ÖZGEÇMİŞ ............................................................................................................... 49
vi

ŞEKİLLER LİSTESİ

Şekil 2.1 NodeMCU ..................................................................................................... 3


Şekil 2.2 WifiManager Tarafından Sağlanan Konfigürasyon Ara Yüzü ..................... 5
Şekil 2.3 RecognizerIntent Sınıfı İle Sağlanan Ara Yüz .............................................. 7
Şekil 3.1 Sistem Mimarisi ............................................................................................ 9
Şekil 3.2 Kullanıcı ve Satıcının Temel Use Case Diyagramı .................................... 10
Şekil 3.3 Sekans (Sequence) Diyagramı .................................................................... 11
Şekil 3.4 Mobil Uygulama Üzerinde Barındırılan Veri Tabanının Varlık İlişki
Diyagramı ................................................................................................................... 12
Şekil 3.5 Mobil Uygulama UML Sınıf Diyagramı .................................................... 13
Şekil 3.6 Mobil Uygulama Ana Aktivite ................................................................... 14
Şekil 3.7 Mobil Uygulama Ana Aktivite Basılı Tutma.............................................. 15
Şekil 3.8 Mobil Uygulama Sesle Komut Verme (Eşya Ekleme Komutu Durumunda)
.................................................................................................................................... 16
Şekil 3.9 Mobil Uygulama Eşya Ekleme Komutu Teyidi .......................................... 17
Şekil 3.10 Mobil Uygulama Eşya Kaydedildi Ekranı ................................................ 18
Şekil 3.11 . Mobil Uygulama Elle Yeni Eşya Ekleme Aktivitesi .............................. 19
Şekil 3.12 Mobil Uygulama Sesle Komut Verme (Eşya Bulma Komutu Durumunda)
.................................................................................................................................... 20
Şekil 3.13 Mobil Uygulama Ana Aktivite ................................................................. 21
Şekil 3.14 Arduino Ses Tanıma Modülü İle Kurulan İlk Model ................................ 23
Şekil 3.15 Android Üzerinde Ağ Tarama .................................................................. 24
Şekil 4.1 Kullanıcıya Verilecek En Temel Bileşenler ............................................... 27
Şekil 4.2 Ana Aktivite ................................................................................................ 28
Şekil 4.3 Kurulum Aktivitesine Giriş......................................................................... 28
Şekil 4.4 Kurulum Aktivitesinde Tarama İşlemi ....................................................... 29
Şekil 4.5 Kurulum Aktivitesinde Tarama İşlemi Sonucu .......................................... 29
Şekil 4.6 Bulunan Cihazların Konfigürasyonu .......................................................... 30
Şekil 4.7 Bulunan Cihazlara Etiket ve ID Atanması .................................................. 30
Şekil 4.8 Konfigürasyon Sonrası Ana Aktivite .......................................................... 31
vii

Şekil 4.9 Konfigüre Edilmiş Uygulamaya Girişte Ana Aktivite................................ 31


Şekil 4.10 Bağlantısı Kopmuş NodeMCU Cihazlara Ulaşılamama Durumu ............ 32
Şekil 4.11 Sesle Eşya Ekleme Komutu Verme .......................................................... 32
Şekil 4.12 Sesle Eşya Ekleme Aktivitesi ................................................................... 33
Şekil 4.13 ‘Anahtar Kelimeleri Söyle’ Butonu ile Ses Alma..................................... 33
Şekil 4.14 Anahtar Kelimelerin Sesle Alınması Sonucu ........................................... 34
Şekil 4.15 ‘Kaydet’ Butonu ile Eşyanın Eklenmesi ................................................... 34
Şekil 4.16 Sesle Eşya Arama Komutu Verme ........................................................... 35
Şekil 4.17 Eşya Arandığında Verilen Sinyal .............................................................. 36
Şekil 4.18 Başarılı Sinyalin Sonucu ........................................................................... 36
Şekil 4.19 Ortadaki Ekleme Butonu İle Eşya Ekleme ............................................... 37
Şekil 4.20 ‘Eşyaları Listele’ Butonu İle Bütün Eşyaları Görme ................................ 37
Şekil 4.21 Birden Fazla Örneği Bulunan Eşyanın Aranması ..................................... 38
Şekil 4.22 Birden Fazla Örneği Bulunan Eşyaların Bulunması ................................. 38
Şekil 4.23 Eşyanın Konumu Sesli Komut ile Arandığında Mobil Uygulamanın
Kaynak Kullanımı ...................................................................................................... 39
Şekil 4.24 Kurulum Ekranında Tarama İşlemi Yapıldığında Mobil Uygulamanın
Kaynak Kullanımı ...................................................................................................... 39
viii

TABLOLAR LİSTESİ

Tablo 3.1. Her Bir Bölgede Kullanılacak Donanım Maliyeti .................................... 25


ix

ÖZET

Anahtar kelimeler: Nesnelerin İnterneti, Mobil Uygulama, Android, Programlanabilir


Kart, NodeMCU, Eşya Bulma

Günlük hayatta eşyaların saklanacağı konum bazı sınıflandırmalar yapılarak


belirlenmektedir. Ancak eşya çeşidi arttıkça sınıflandırma karmaşık bir hâl
almaktadır. Bir eşya birden fazla sınıfta bulunabileceği için aranılan eşyanın
bulunması güçleşmektedir. Proje, daha ayrıntılı sınıflandırmaya gidilmeyi önlemek
amacıyla, verilen anahtar kelimeye göre aranan eşyanın konumunun kolayca tespit
edilmesini ve bu sayede insan beyninin yükünün hafifletilmesini amaçlar.

Kullanıcı, evini veya ofisini bölgelere ayırır. Etiketleyeceği eşyayla ilgili anahtar
kelimeleri, bölge etiketiyle birlikte söyleyerek mobil uygulama yardımıyla kaydeder.
Daha sonra eşyayı bulmak istediği zaman eşyayla ilgili anahtar kelimeleri söyler ve
eşyanın bulunduğu bölgeden sesli ve görüntülü sinyal gelir. Böylece kullanıcı eşyayı
bulmak için hangi bölgeye yönelmesi gerektiğini bilir.

Mobil uygulama geliştirmek için Android Studio, her bir bölgede sinyal üretmek için
NodeMCU kartlar kullanılmıştır.
BÖLÜM 1. GİRİŞ

İnsan uygarlığının gelişmesiyle birlikte zamandan tasarruf etmek amacıyla çok


sayıda araç gereç icat edilmiştir. Bu araç gereçler boşalan vaktin farklı şekilde
kullanılmasını sağladığı gibi yeni vakit kayıplarına da neden olmuştur. Kişisel
bilgisayarlar sayesinde birçok eşya tarihe gömülmüş; çekmecelerden mektuplar,
fotoğraf albümleri, çeşitli medya oynatıcılar gibi çeşitli eşyalar kalkmıştır. Ancak
bunların yerini taşınabilir diskler, kablosuz fareler, klavyeler, dönüştürücüler, çeşitli
kablolar, şarj aletleri, monitörler, sanal gerçeklik gözlükleri gibi yeni eşyalar almıştır.
Dolayısıyla eşya boyutu azalmış, ancak eşya çeşidi artmıştır. “Bilgisayar eşyaları,
telefon eşyaları, kamera eşyaları” gibi sınıflandırmalar her iki sınıfa da girebilen
eşyalar nedeniyle yetersiz kalmış, bu da birçok eşyanın arama esnasında vakit
kaybına yol açmasıyla sonuçlanmıştır.

1.1. Problemin Tanımı

Eşya çeşidinin artmasıyla birlikte eşyaların aranma süreci hafızayla ilgili sorunları
olan insanlarda ve görme engellilerde daha belirgin olmakla birlikte bir problem
hâline gelmiştir. Bu işlemin yükü insan beyninden alınıp dijital asistanlara
devredilmelidir.

1.2. Geliştirilen Çözüm

Kullanıcı tarafından eşyayı tanımlayıcı bilgi mobil uygulamaya sesli veya yazılı
olarak bildirilir ve eşyanın bulunduğu bölgeden sinyal alınır.

1.2.1. Sistemin Kurulumu

Evde veya ofiste eşyaların bulunduğu bölgeler gruplanarak bu bölgeler sistem


üzerinde etiketlenir. Kurulum yapılırken ayrılan bölge sayısınca alınacak cihazlar
2

tespit edilen bölgelere yerleştirilir. Bu bölgeler, kullanıcının tercihine göre oda veya
odanın bölümleri, hatta raflar olarak seçilebilir.

1.2.2. Eşyaların Kaydedilmesi

Kullanıcı, bölgenin ismiyle birlikte eşyanın ismini ve aynı isimde olabilecek başka
eşyalara karşılık eşyayı tanımlayacak anahtar kelimeleri mobil uygulamada sesli
komut vererek veya kaydetme ekranı üzerinden eşyayı kaydedebilir.

1.2.3. Eşyanın Konumunun Tespit Edilmesi

Ulaşılmak istenen eşya doğrudan sistemde kaydedilen ismi telaffuz edilerek yahut
eşyayı tanımlayacak yeterince anahtar kelime söylenerek mobil uygulama üzerinden
sesli bir şekilde aranır. Eğer eşyayı tanımlayacak yeterli veri alındıysa ve veri
tabanında eşsiz bir eşya bulunduysa, eşyanın kayıtlı olduğu bölgeden sesle (ve
opsiyonel olarak ışıkla) uyarı yapılır ve kişi o bölgeye yönlendirilir. Aynı şekilde bu
işlem doğrudan kullanıcı ara yüzü ile de yapılabilir.

1.3. Başarı Ölçütleri

Projenin minimum başarı kriteri, kullanıcının eşyalarını istediği bölgelere ses ile
kaydedebilmesi, daha sonra kaydettiği eşyaları bulmak istediğinde mobil uygulama
üzerinden yönelttiği bir komutla alınacak uyarıya göre eşyanın yerini tespit
edebilmesidir.
BÖLÜM 2. KULLANILAN TEKNOLOJİLER

Temelde bir ağ üzerinde birbirine bağlı NodeMCU kartları ve ses tanıma ve kartlara
yönlendirmeyi yapacak bir Android cihazı kullanılmıştır. Her bir NodeMCU kartına
bağlı sinyal üretecek olan LED’ler ve buzzer’lar eşya bölgelerine yerleştirilmek için
kullanılmıştır. NodeMCU kartları programlamak için Arduino IDE, Android cihazı
programlamak için Android Studio kullanılmıştır.

2.1. NodeMCU ve Arduino IDE

Her bir eşya bölgesine yerleştirilecek olan NodeMCU; Arduino gibi


programlanabilir, açık kaynaklı, düşük maliyetli bir karttır [1]. Projenin
taşınabilirliğini artırmak için üzerinde Wi-Fi modülü bulundurması sebebiyle
seçilmiştir. Bu sayede ağ üzerinde mobil uygulama üzerinden emir alacak ve sinyali
verecektir. Bu kart yerine alternatif olarak Wi-Fi haberleşmesini sağlayacak
ESP8266 modülü alınıp bu modül programlanarak bir Arduino kartına bağlanabilir.
Ancak bu hem programlamayı güçleştirecek hem de kablolamayı artıracağından
tercih edilmemiştir.

Şekil 2.1 NodeMCU


4

Arduino IDE (Integrated Development Environment) ya da Arduino Software bir


metin editörü, mesaj alanı, metin konsolu ve yaygın fonksiyonların bulunduğu bir
uygulama geliştirme ara yüzüdür [2]. Java’da geliştirilen açık kaynaklı bu yazılım ile
birçok kart programlanabilmektedir. Günümüzde bu yazılımın WEB’e taşınmış bir
versiyonu da bulunmaktadır. Bu yazılım, gerekli kütüphane yüklenerek
NodeMCU’nun programlanması amacıyla kullanılmıştır.

2.1.1. Kullanılan Paket ve Kütüphaneler

NodeMCU uygulamaları için gerekli paket ve kütüphaneler aşağıda açıklanmıştır.

2.1.1.1. Arduino IDE Üzerinde NodeMCU Desteği Sağlanması

Arduino IDE açılır, araç çubuğu üzerinde Dosya/Tercihler tıklanarak “Ek Devre
Kartları Yöneticisi URL’leri:” kısmına aşağıdaki URL girilir:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Araçlar/Kart/Kart Yöneticisi üzerinde “esp8266” araması yapılarak ESP8266


Community tarafından geliştirilen paket yüklenir [3]. Bu çalışmada 2.6.1 versiyonu
kullanılmıştır. Paket yüklendikten sonra Araçlar/Kart üzerinden bilgisayara bağlanan
NodeMCU versiyonu seçilir. Bu çalışmada 12E modüllü 1.0 versiyonu
kullanılmıştır.

2.1.1.2. ESP8266WiFi Kütüphanesi

Bu kütüphane ile belirlenen SSID ve parolaya sahip kablosuz ağa bağlantı


sağlanabilir, http isteklerinin gönderilmesini sağlayacak bir web server
oluşturulabilir. Başlık 2.1.1.1’deki adımlar yapıldığı takdirde kütüphaneyi Arduino
IDE üzerinde kullanmak için yeni proje açılıp ilk satıra aşağıdaki satırı eklemesi
yeterlidir:

#include <ESP8266WiFi.h>
5

2.1.1.3. WiFiManager Kütüphanesi

ESP8266WiFi kütüphanesi sadece kod üzerinde girilen SSID ve parolaya sahip


kablosuz ağa bağlantıyı sağlamaktadır. Oysa uygulamada kullanıcının bu bilgileri
kodlama veya elle girmesi beklenmez. Bu nedenle kullanıcıya istediği ağa
bağlanabileceği bir ara yüz sunulması gerekmektedir.

WiFiManager.h kütüphanesi bulunduğu ortamdaki Wi-Fi ağlarını tarayıp bir Şekil


2.2’deki gibi bir web ara yüzü oluşturarak kullanıcının kartı ağa bağlamasını
sağlamaktadır [4].

Şekil 2.2 WifiManager Tarafından Sağlanan Konfigürasyon Ara Yüzü

Kütüphane dosyasını eklemek için Taslak/library ekle/libraryleri düzenle ekranına


gidilmeli ve tzapu tarafından geliştirilen WiFiManager kütüphanesi yüklenmelidir.
Bu çalışmada 0.15.0-beta versiyonu, bir önceki versiyonda derleme hataları meydana
geldiği için tercih edilmiştir.
6

2.1.1.4. ESP8266WebServer

ESP8266WebServer, ESP8266 üzerinde kolayca web sunucusu oluşturmaya yarayan


bir kütüphanedir [5]. HTTP protokolü kullanarak GET metoduyla server.on()
fonksiyonuna path ve handler parametreleri verilerek istekler yönetilebilir. İstek
başarılıysa handler fonksiyonu içinde server.send(200, “text/plain”, mesaj) şeklinde
bir mesaj gönderilebilir [6].

2.1.1.5. EEPROM Kütüphanesi

Kullanılacak cihazlarda kalıcı bir bilgi depolama mekanizması gerekecektir.


NodeMCU kartlar üzerinde bu EEPROM’lar ile sağlanmıştır. EEPROM’la ilgili
işlemler için bir EEPROM.h kütüphanesi yazılmıştır [7]. Yazma işlemleri
EEPROM.write(adres, 1 byte veri) formatında byte düzeyinde yapılmaktadır. 1 byte
üzeri veriler için EEPROM.put(adres, veri) format kullanılmalıdır. Ancak bu işlemler
derhâl yazılmayı sağlamaz. Yazılmanın tamamlanması için EEPROM.commit()
fonksiyonu çağrılmalıdır [8].

2.2. Android Studio

Android Studio, Android uygulaması geliştirmek için kullanılan, IntelliJ IDEA


tabanlı resmi bir uygulama geliştirme ara yüzüdür [9]. Bu yazılım üzerinde Java ve
Kotlin programlama dilleri kullanılarak uygulama geliştirilebilir.

2.2.1. Retrofit Kütüphanesi

Retrofit, Java ve Android REST istemcisidir. JSON veya başka yapıdaki verileri
kolayca almaya ve yüklemeye yarar. Retrofit ile GET ve POST gibi HTTP metotları
kullanılabilir [10].
7

Kütüphaneyi projeye eklemek için build.gradle uygulama modülü içindeki


dependencies kısmının içine aşağıdaki satırlar eklenir.

implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

AndroidManifest.xml üzerinde ise İnternet, Ağ Durumu ve Wifi Durumu izinleri


verilir.

Kontrol için bir ara yüz (interface) tanımlanarak burada metotlar ve parametreler
belirlenir. Bu ara yüzden retrofit.create() metoduna ara yüzün sınıfı verilerek bir
nesne oluşturulur ve ara yüz içinde tanımlanan çağrılar bu nesne üzerinden kullanılır.

2.2.2. RecognizerIntent Sınıfı

Android.speech paketi içindeki RecognizerIntent sınıfı ile kullanıcıdan alınan ses,


metne dönüştürülebilir [11].

Yazılacak ses girişi alma metodu içerisinde bir intent tanımlanarak parametre olarak
RecognizeIntent.ACTION_RECOGNIZE_SPEECH verilir. Oluşturulan intent’e
putExtra metodu vasıtasıyla dil özellikleri gönderildikten sonra sistem dili veya
isteğe bağlı olarak başka bir dil seçilerek mesaj gönderilir. Sonuçlar String dizisi
olarak get metoduyla alınır ve istenilen şekilde ayrıştırılır.

Şekil 2.3 RecognizerIntent Sınıfı İle Sağlanan Ara Yüz


8

2.2.3. SQLite Veri Tabanı

SQLite, Android cihazlarda gömülü olarak gelen açık kaynak bir ilişkisel veri
tabanıdır [12]. SQL kodları yazılarak kullanılabildiği gibi sınıfa ait hazır metotlar
çağrılarak da kullanılabilir.

2.2.4. Android Network Tools Kütüphanesi

Port tarama, subnet cihazlarını bulma, ping gönderme, ağ üzerinde uyandırma gibi
özellikleri olan bir kütüphanedir [13]. Ağdaki cihazları taramak ve IP’lerini bulmak,
lokal ağda çalışan uygulamalar için yeterli değilse de olmazsa olmazdır. Bu
kütüphane ile ağda IP’leri tespit edilen cihazlar projede IP sabit olduğu müddetçe
kayıtlı tutulmuş ve sadece bağlantı sorunu olduğunda tekrar ağ taramaya
başvurulmuştur.
BÖLÜM 3. TASARIM

Sistem NodeMCU kartlar ve Android cihazı etrafında şekillenmiştir. Android cihazı


üzerinde ses alma ve komutların işlenmesi, NodeMCU cihazlarda da bağlanan
donanım vasıtasıyla sinyal verilmesi esas alınmıştır.

3.1. Sistem Mimarisi

Her bir bölgeye NodeMCU kartlar ve sinyal verilecek donanım (buzzer ve LED’ler)
yerleştirilmek ve bu kartlar ortadaki web server sağlayıcı görevindeki kartla
haberleşmek suretiyle sistem kurulur. Bölgeler mobil uygulama vasıtasıyla
etiketlenerek Şekil 3.1’deki çalışır vaziyete getirilir. Bu noktadan sonra eklenen
eşyalar kişinin mobil uygulama üzerinden sesli komut vermesiyle aranır.

Şekil 3.1 Sistem Mimarisi


10

3.2. Modelleme

Kullanıcı ihtiyaçları doğrultusunda evini ya da ofisini bölgelere ayırıp bu sayıyı


satıcıya bildirir. Satıcı cihaz sayısını belirleyerek sistemi kurar. Bu noktadan sonra
kullanıcının en temel iki komutu Eşya Kaydetme ve Eşya Arama, Şekil 3.2’de
gösterilmiştir. Diğer komutlar tahmin edileceği üzere benzer ilişkiler içermektedir.

Şekil 3.2 Kullanıcı ve Satıcının Temel Use Case Diyagramı


11

Şekil 3.3’te kullanıcının eşyalar ile ilgili yapabileceği işlemler sekans diyagramı
üzerinde gösterilmiş olup “S” yerleştirilen NodeMCU sistemlerini temsil etmektedir.
“A” etiketi mobil uygulamadaki kullanıcı ara yüzünü temsil eder.

Şekil 3.3 Sekans (Sequence) Diyagramı


12

Veri tabanı mobil uygulama üzerinde SQLite ile lokal olarak tutulacaktır. Veri
tabanına ilişkin Varlık İlişki Diyagramı (Entity Relationship Diagram) Şekil 3.4’te
gösterilmiştir.

Şekil 3.4 Mobil Uygulama Üzerinde Barındırılan Veri Tabanının Varlık İlişki Diyagramı
13

Şekil 3.5 üzerinde mobil uygulama için UML sınıf diyagramı gösterilmiştir. Mobil
uygulama üzerinde ana aktivite üzerinde Bolge sınıfından bir liste oluşturulacaktır.
Eşyalar bölge nesnelerinde saklanacak ve bir sonraki başlıkta verilen ara yüzde
görüldüğü üzere bölgeler seçildikçe listelenecektir.

SinyalControllerI isimli interface yine NodeMCUHaberlesme sınıfında sinyal


gönderme için Retrofit kütüphanesinden dolayı kullanılacaktır.

Şekil 3.5 Mobil Uygulama UML Sınıf Diyagramı


14

3.3. Mobil Uygulama Ara Yüz Tasarımı

Kurulum yapılıp eşyalar sisteme eklendikten sonra kullanıcı mobil uygulamada Şekil
3.6’daki gibi bir ara yüzle karşılaşır. Kolay ulaşılabilir bölgede bulunan mikrofon
simgesiyle doğrudan komut verebilir.

Şekil 3.6 Mobil Uygulama Ana Aktivite


15

Uygulama üzerinde bölgeler seçilebilir olarak yukarıdaki menüde listelenir. Her bir
bölgeye tıklandığında o bölgede kayıtlı eşyalar sıralanır. Eşyanın üzerine basılı
tutulduğunda Şekil 3.6’daki gibi bir menü açılır. Burada “Yerini Göster”e tıklanarak
doğrudan eşyanın olduğu bölgeden sinyal alınabilir. Eşya bilgileri düzenlenebilir,
eşya silinebilir.

Şekil 3.7 Mobil Uygulama Ana Aktivite Basılı Tutma


16

Ana aktivitenin sağ altındaki mikrofon butonu ile Şekil 3.8’deki gibi bir ara yüze
ulaşılır ve kullanıcıdan alınan komut ekrana yazdırılır. Metne dönüştürülen veri
ayrıştırılır ve gerekli işlemin yapıldığı ekrana yönlendirilir.

Şekil 3.8 Mobil Uygulama Sesle Komut Verme (Eşya Ekleme Komutu Durumunda)
17

Kullanıcının verdiği ekleme komutuna göre oluşturulan bilgi teyit amaçlı olarak
Şekil 3.9’daki gibi ekranda gösterilir ve eğer eklenecek eşya bilgileri doğruysa
kullanıcıdan eşyaya dair anahtar kelimelerin sesle söylenmesi istenir.

Şekil 3.9 Mobil Uygulama Eşya Ekleme Komutu Teyidi


18

Verilen bilgilerle eşya kaydedilir ve kullanıcıya Şekil 3.10’daki gibi tekrar


düzenleyebileceği veya eşyayı silebileceği bir ara yüz gösterilir.

Şekil 3.10 Mobil Uygulama Eşya Kaydedildi Ekranı


19

Kullanıcı eşyayı elle eklemek isterse ana aktivitedeki alt menünün ortasındaki eşya
ekleme butonuyla Şekil 3.11’deki eşya ekleme aktivitesine geçebilir. Kaydetme
işlemi yapıldığında Şekil 3.10’daki ara yüz gösterilecektir.

Şekil 3.11 . Mobil Uygulama Elle Yeni Eşya Ekleme Aktivitesi


20

Kullanıcı alt menünün sağdaki mikrofon simgeli komut verme butonuna dokunarak
Şekil 3.12’deki gibi eşya bulma komutu verebilir.

Şekil 3.12 Mobil Uygulama Sesle Komut Verme (Eşya Bulma Komutu Durumunda)
21

Eşya bulma komutu sonucunda bir eşya tanımlandıysa kullanıcıya Şekil 3.13’teki
gibi bir ekran gösterilir ve bu ekranda eşyanın bulunduğu bölgeye sinyal
gönderildiğine dair mesaj bulunur. Kullanıcı sinyali durdurabilir ya da komutu
yeniden deneyebilir.

Şekil 3.13 Mobil Uygulama Ana Aktivite


22

3.4. Tasarımda Karşılaşılan Zorluklar

3.4.1. Ses Tanıma İçin Cihaz Seçimi

Yapılan ilk tasarımda ses girişi almak için Arduino Ses Tanıma Modülü
kullanılmasına karar verilmişti. Bundan bir adet kullanılacak ve her bir eşya
bölgesine de mikrofonlar konularak ses, en yakın eşya bölgesinden alınacaktı. Bu da
en şiddetli sesi alan mikrofonun verisinin işlenmesi suretiyle karar olunacak, bu
sayede o bölgeye ait işlem yapılmış olacaktı. Oysa aktif olması beklenen bölgede bir
insan sesi ile komut verilirken başka bir bölgede insan sesinden daha şiddetli bir ses
bulunabilmektedir. Bu durumda komut işlenemeyecektir. Komut vermede hız önemli
olduğundan ve her yerden gelen seslerin bir tamponda bekletilmesi söz konusu
olamayacağından her bir bölgeye o bölgenin sesini işleyecek bir ses tanıma modülü
üzerinde düşünüldü. Ancak bu, maliyeti önemli ölçüde artıracaktı.

Arduino Ses Tanıma Modülü, kullanma kılavuzunda belirtildiği şekilde test


edildikten sonra yeterli ses yüksekliğinde konuşulduğunda 1 metre mesafeye kadar
kabul edilebilir ölçüde çalıştığı görüldü. Ancak algılama mesafesindeki kabul
edilebilirlik aşağıdaki durumlar söz konusu olduğunda görülmemektedir:

• Benzer komutlar yüklendiğinde ve bunlar söylendiğinde ses tanıma stabil


çalışmamaktadır.
• Komutlar farklı şekilde söylendiğinde ses algılanmamaktadır. Bu noktada
esneklik son derece düşüktür. Bu da bu şekilde kullanımıyla günlük hayatı
kolaylaştırmaktan çok zorlaştıracaktır.
• Komutlar sadece ses olarak algılandığı ve yazıya dönüştürülmediği için veri
tabanını oluşturmak ancak simgesel ifadelerle mümkün olacak ve veri
tabanında sadece anlamsız ifadeler bulunacaktır. Oysa her bilginin anlamlı
şekilde tabloda tutulması istenmektedir.

İlk iki sorun için çok daha iyi mikrofonlar kullanılarak belli ölçüde iyileştirme
sağlanabilir, ancak bulunan bu çözümde maliyet zaten gereğinden fazla artmış
olduğu için sistemin daha da maliyetli bir duruma evrimi başka çözüm arayışlarını
23

kaçınılmaz kılmıştır. Hızlı bir şekilde alternatifleri test etmek amacıyla MIT’nin
Android cihazlarda basit yazılımlar oluşturulabilmesi amacıyla geliştirdiği
AppInventor üzerinde SpeechRecognizer aracı kullanılmış ve bu şekilde kullanımın
işlevselliğinin Arduino Ses Tanıma Modülü ile kıyaslanamayacak kadar yüksek
olduğu görüldüğünden projenin ses tanıma kısmının Android uygulaması üzerinde
koşulmasında karar kılınmıştır. Elde edilen bu imkânla birlikte veri tabanı ve karar
verme için yazılacak metotların da Android’e taşınması uygun görülmüştür.

Şekil 3.14 Arduino Ses Tanıma Modülü İle Kurulan İlk Model

3.4.2. Ağdaki Cihazların Bulunması

NodeMCU’nun ağa bağlanması için başta SSID ve parola statik olarak giriliyordu.
Bunun otomatik olarak yapılması için ara yüz WifiManager kütüphanesi ile
sağlanmıştı. NodeMCU bir web sunucusu oluşturuyor, NodeMCU’nun seri port
ekranı üzerinden alınan IP adresi herhangi bir tarayıcıya girilmek suretiyle HTTP
GET metodu kullanılarak NodeMCU ile haberleşme sağlanıyordu. Buna mukabil bu
IP adresini bulmak son kullanıcının görevi olmadığı için bunun mobil uygulama
tarafından otomatik olarak bulunması gerekiyordu. Bu işlemi yapmak için öncelikle
ağ üzerindeki cihazların IP’lerini bulan bir uygulama yapıldı. Bu uygulamanın
yaptığı işlem ara yüzde çıktı olarak Şekil 3.15’te gösterilmiştir.
24

Şekil 3.15 Android Üzerinde Ağ Tarama

Bu uygulamada verilen IP’nin bulunduğu ağ tespit ediliyor ve bu ağdaki cihazlar


listeleniyordu. Ancak bu uzun sürüyor ve hızlandırılmaya çalışıldığı takdirde bazı
cihazlar bulunamıyordu. Ayrıca ağda birçok NodeMCU olacağından bunların tespiti
ve idare edilmesi zor olacaktı. Bu nedenle önerilmiş başka çözümlere bakıldı.

3.4.2.1. Alternatif Çözümler

• mDNS: NodeMCU üzerinde “ESP8266mDNS” kütüphanesi kullanılarak


yazılan uygulamada, üretilen IP “domain.local” şeklinde bir URL’ye
dönüştürüldü [14]. Bu sayede tarayıcıdan IP yerine bu URL yazılıyor ve GET
metotları başarılı bir şekilde çalışıyordu. Ancak mobil uygulamada IP yerine
bu URL yazıldığında sonuç başarısız oldu. Durumun nedeni araştırıldığında
birçok platformun desteklemesine karşın Android’in mDNS’i desteklemediği
görüldü.

• SSDP (Simple Service Discovery Protocol): Bir ev ağındaki UPnP


cihazlarını tespit etmeye yarayan bu protokol NodeMCU üzerinde kullanıldı
[15]. Android üzerinde de NodeMCU ile uygulamalar yapıldı, ancak sonuca
ulaşılamadı.

• NSD (Network Service Discovery): Ağdaki diğer cihazlardaki servislere


erişimi sağlar [16]. Bu çözümü kullanmak için IoT-Ignite-0.7 ve
HwNodeAppTemplate-1.0 kütüphaneleri denendi, ancak kütüphanelerin
kullanılmasında çok sayıda sorun yaşandı ve başarısız olundu.
25

• Statik IP: NodeMCU üzerinde statik IP verilerek Android’in bu IP üzerinden


HTTP isteği göndermesi üzerine kurulu bir çözümdür. Ancak IP çakışması,
üzerinde bulunulan ağda bir IP adresi verilmesi gibi hususlar sorun
olabilmektedir.

3.4.2.2. Karar Kılınan Çözüm

Araştırmalar sonucu Android Network Tools kütüphanesinin istenilen koşulları


sağladığı ve kabul edilebilir bir hızda çalıştığı görüldü.

3.5. Maliyet Analizi

Her bir bölgede Tablo 3.1’de belirtildiği gibi toplamda ortalama $9,36’lık bir
donanım maliyeti öngörülmüştür. Minimum bölge sayısı 2 olmak üzere eklenecek
bölge sayısı ile bu maliyet çarpılarak toplam kurulum maliyeti hesaplanır. 5 bölge
seçildiği takdirde maliyet $46,8 olacaktır.

Evin veya ofisin büyüklüğüne göre 12V’luk buzzer yerine 24V’luk buzzer
kullanabilir, bu durumda buzzer maliyeti $0,67’ye çıkacaktır.

Bir ev kullanıcısı için ideal olarak oda sayısının üç katı kadar bölge öngörülmüştür.
Bu durumda standart bir ev kullanıcısı için donanım maliyeti (Android cihazının
olduğu varsayılarak) 12 bölge ile $112,32 olarak hesaplanmıştır.

Tablo 3.1. Her Bir Bölgede Kullanılacak Donanım Maliyeti

Birim Adet Birim Maliyet ($) Toplam Maliyet ($)


NodeMCU 1 4,30 4,30

Buzzer (12V) 22mm 2 0,57 1,14

LED 10mm 2 0,26 0,52

5V 2A USB Mikro Adaptör 1 3,37 3,37

Jumper 2 0,014 0,028

Toplam Maliyet: 9,36


26
BÖLÜM 4. GERÇEKLEŞTİRİLEN UYGULAMA

Kullanıcının Android cihazına kurulacak uygulama ve istediği bölgelere


yerleştirilecek kartların nasıl kullanılacağı bu bölümde somut bir şekilde
gösterilecektir. Android cihazı olan kullanıcıya bir adaptör ve buna bağlı
(kullanıcının isteğine göre herhangi bir sinyal verme sistemi olan) bir elektronik kart
verilecektir.

Şekil 4.1 Kullanıcıya Verilecek En Temel Bileşenler

4.1. Kullanım Senaryoları

Kullanıcının kartları ağa bağladıktan sonra Android cihazındaki uygulamayı açarak


cihazların uygulamaya tanıtım işlemini gerçekleştirmesi beklenmektedir. Bunun için
sol altta yer alan çarklı butona tıklanması gerekmektedir.
28

Şekil 4.2 Ana Aktivite

Şekil 4.3 Kurulum Aktivitesine Giriş


29

Şekil 4.4 Kurulum Aktivitesinde Tarama İşlemi

Şekil 4.5 Kurulum Aktivitesinde Tarama İşlemi Sonucu


30

Kullanıcıya tarama işlemi bittiğinde projeye ait cihazların listesi gösterilecektir.


Bunlardan herhangi birine tıklandığında cihazlara bir etiket verilecek ve “Kaydet”
butonuna tıklandığında bir bölge ID’si atanacaktır. Şekil 4.5’teki ekranda kullanıcı
bir bölge etiketi yazıp ‘Kaydet’ butonuna bastığında bu bölgeye Şekil 4.6’daki gibi
bir ID atanmaktadır. Bu sırada bu ID daha sonra haberleşmede kullanılmak üzere
cihaza gönderilmektedir. Oluşturulan senaryoda bölgelere “Kitaplık”, “Salon” ve
“Mutfak” ve “Banyo” etiketleri atanmıştır.

Şekil 4.6 Bulunan Cihazların Konfigürasyonu

Şekil 4.7 Bulunan Cihazlara Etiket ve ID Atanması


31

Konfigürasyon sonrası herhangi bir problem yoksa kullanıcıya bütün cihazların


ulaşılabilir durumda olduğuna dair bir geri bildirim gösterilir. Uygulama
başlatıldığında eğer cihazlardan herhangi birinin bağlantısında bir sorun varsa ağ
yeniden taranır ve bağlantı kurulur.

Şekil 4.8 Konfigürasyon Sonrası Ana Aktivite

Şekil 4.9 Konfigüre Edilmiş Uygulamaya Girişte Ana Aktivite


32

Bağlantıda problem olduğunda ulaşılamayan cihazlar kullanıcıya gösterilir.

Şekil 4.10 Bağlantısı Kopmuş NodeMCU Cihazlara Ulaşılamama Durumu

Kullanıcı sağ alttaki mikrofon butonuna tıklayarak ses ile komut verebilir. Şekil
4.11’de bir eşya ekleme komutu örneği görülmektedir.

Şekil 4.11 Sesle Eşya Ekleme Komutu Verme


33

Sesli komut eğer geçerli bir bölgeye aitse kullanıcı bir aktiviteye yönlendirilir.
Burada zikredilen komut yazılı olarak düzenlenebilir, tekrar sesli komut denenebilir
yahut eşyanın birden fazla bulunması durumu için anahtar kelimelerin yine sesli
olarak eklenmesi gerçekleştirilebilir.

Şekil 4.12 Sesle Eşya Ekleme Aktivitesi

Şekil 4.13 ‘Anahtar Kelimeleri Söyle’ Butonu ile Ses Alma


34

Kullanıcı kaydedeceği eşya bilgilerini kontrol ederek ‘Kaydet’ butonuna bastığında


eşyanın kaydedildiğine dair Toast mesajı gösterilir, ardından eşyaların listesinin
bulunduğu, el ile sinyal gönderebileceği bir aktiviteye yönlendirilir.

Şekil 4.14 Anahtar Kelimelerin Sesle Alınması Sonucu

Şekil 4.15 ‘Kaydet’ Butonu ile Eşyanın Eklenmesi


35

Kullanıcı aynı şekilde diğer eşyalarını ekledikten sonra eşyanın konumunu bulmak
için yine konuşma butonunu kullanarak “Eşya ismi ‘nerede’” formatında bir sesli
komut verebilir. Şekil 4.16’da, bir önceki adımda eklenen “Nutuk” kitabı “Nutuk
nerede” sesli komutu verilerek aranmış ve kullanıcıya eşyanın bulunduğu bölgeye
sinyal gönderildiğini belirten bir Toast mesajı gösterilmiştir. Herhangi bir hata
durumunda kullanıcıya “Sinyal Gönderilemedi.” mesajı gösterilir ve akabinde
cihazların tabloda kayıtlı IP adresleri güncellenir. İstek, “Kitaplık” etiketinin
verildiği karta iletildikten ve bağlantının doğru olduğu kesinleştikten sonra sinyal
verilecektir. Kullanıcı, aradığı eşyanın “Kitaplık” bölgesinde olduğunu şayet sinyal
gönderme başarılıysa Şekil 4.17’deki gibi gelen sinyalle görecek ve bu bölgeye
yönelecektir. Şekil 4.18’de ise haberleşmenin başarılı olduğuna dair geri bildirim
gösterilmiştir.

Şekil 4.16 Sesle Eşya Arama Komutu Verme


36

Şekil 4.17 Eşya Arandığında Verilen Sinyal

Şekil 4.18 Başarılı Sinyalin Sonucu


37

Kullanıcı sesli komut vermek dışında klavye ile eşya eklemek isterse ortadaki butona
tıklamak suretiyle eşya ekleme aktivitesine yönlendirilir. Burada kullanıcı sesin
alınması ile ilgili olan ‘Tekrar Dene’ ve ‘Anahtar Kelimeleri Söyle’ butonlarını
görmemektedir. Kullanıcı ‘Eşyaları Listele’ butonu ile 4.20’deki gibi bütün eşyaları
görüp el ile sinyal verebilir.

Şekil 4.19 Ortadaki Ekleme Butonu İle Eşya Ekleme

Şekil 4.20 ‘Eşyaları Listele’ Butonu İle Bütün Eşyaları Görme


38

Kullanıcının aynı türde birden fazla eşyası olabilir. Anahtar kelimeler bu eşyaların
ayırt edilmesi için kullanılmaktadır. Şayet birden fazla kayıtlı bir eşya ismi
zikredilirse doğrudan sinyalin gönderilmesi yerine kullanıcıya Şekil 4.22’deki gibi
ilgili eşyalar tanımlayıcılarıyla birlikte gösterilir.

Şekil 4.21 Birden Fazla Örneği Bulunan Eşyanın Aranması

Şekil 4.22 Birden Fazla Örneği Bulunan Eşyaların Bulunması


39

4.2. Performans Ölçümleri

Tarama işleminin sadece uygulama açılışında veya çalışması sırasında gerekli


görüldüğü durumda yapılması, IP adreslerinin cihazda kayıtlı tutulması ve
gerektiğinde doğrudan sinyal gönderilmesi, cihaza ulaşmak için gereken zamanı 10-
15 saniyeden saliseler düzeyine indirmiştir.

Eşyanın nerede olduğu sesli komut verilerek sorulduğunda mobil uygulamanın


kaynak kullanımının Şekil 4.23’teki gibi olduğu test edilmiştir.

Şekil 4.23 Eşyanın Konumu Sesli Komut ile Arandığında Mobil Uygulamanın Kaynak Kullanımı

Kurulum ekranında tarama işlemi yapıldığında mobil uygulamanın kaynak


kullanımının Şekil 4.24’teki gibi olduğu test edilmiştir.

Şekil 4.24 Kurulum Ekranında Tarama İşlemi Yapıldığında Mobil Uygulamanın Kaynak Kullanımı
40

4.3. Karşılaşılan Zorluklar ve Getirilen Çözümler

4.3.1. NodeMCU

4.3.1.1. EEPROM İle İlgili Durumlar

Cihazlar konfigüre edilirken bu bilgilerin cihazlarda saklanması ihtiyacı doğmuştur.


Bunun bir yöntemi cihazlarda bulunan EEPROM’u kullanmak olmuştur [17].
EEPROM kütüphanesi kullanılırken byte ve diğer veri tipleri arasında dönüşümlerde
sıkıntı yaşanabilmektedir. Kod yazarken bununla ilgili bütün detayların akılda
tutulması zor olabilmekte ve kodun karmaşıklığı bu detaylarla artabilmektedir. Böyle
sorunlar bazı örnekler incelenerek çözülmüştür [18]. Gerekebilecek hafıza işlemleri
ayrı bir kütüphane yazılarak asıl koddan ayrılmıştır. Kütüphanede gerekli hafıza
alanları ayrılmış ve hafıza işlemleri yapılmış, ana uygulamada sadece nodeIdYaz gibi
basit fonksiyonlar çağrılmıştır.

ESP8266 üzerinde 4096 byte’lık EEPROM üzerinde yazma işlemi yaparken


ESP8266 için gerekecek WiFi bilgileri üzerine veri yazmama hassasiyeti doğmuştur.
Örneğin SSID 32 karakterlik yer tutabilmektedir [19]. WPA2 parolalar 63 karakter
uzunluğundadır [20]. Bütün byte’lar yazılarak denenmiş ve çalışmada bir aksaklık
görülmemiştir. Araştırma yapıldığında Github’da WifiManager’ın SSID ve parolayı
kullanıcı alanında depolanmadığına dair bir bilgiye rastlanmıştır [21]. Sonuç olarak
sağlanan bütün byte’lar eğer başka bir kütüphane EEPROM’un kullanıcıya açılmış
olan byte’larını kullanmıyorsa serbest şekilde kullanılabilir.

Yazılan yeni kütüphanede byte anahtar kelimesi kullanıldığında derleme aşamasında


hata meydana gelmiştir. Bunun sebebi Arduino.h kütüphanesinin dahil edilmemesi
olmuştur. Arduino için yazılan kütüphanelerde buna dikkat edilmelidir [22].

4.3.1.2. C++ Dilinde Statik Sınıf


41

Programlamada alışılageldiği gibi statik sınıf yazılmaya çalışılmış, bu anahtar


kelimenin C++ dilinde bulunmasına karşın diğer dillerdeki gibi kullanılmadığı
görülmüştür. C++ dili nesneye dayalı programlamanın henüz geliştiği yıllarda
yazıldığı için kullanımın bu şekilde değil, namespace anahtar kelimesiyle olduğu
görülmüştür [23].

4.3.1.3. Web Server ve Parametre Aktarımı

Araştırmalar yapılırken server oluşturma ve ilgili işlemler bazı karmaşıklıklara yol


açmıştır. Parametre alma gibi işlemlerin ESP8266WebServer.h kütüphanesinin
server.on() metoduyla daha müstakil kodlar üzerinde çalışılarak etkili bir şekilde
kullanılabildiği görülmüştür [24].

4.3.1.4. Sinyal Gönderirken Diğer İşlemlerin Beklemesi

NodeMCU programlanırken işlemlerin asenkron yapılabilmesi için delay() gibi


komutların kullanılmaması gerekir. Böyle bekleme gerektiren işlemlerde o andaki
zaman bir değişkende tutularak işlem yapılmalıdır [25]. Bu şekilde sinyal
gönderirken bekleme esnasında diğer işlemler etkilenmemiştir.

4.3.1.5. String İle İlgili Derleyici Problemi

Bir string birleştirme işleminde sorun yaşanmıştır. Arduino’nun resmî sitesindeki


dokümantasyonda “String s = a + sayi;” şeklinde bir kullanım gösterilmiştir [26].
Ancak burada gösterilen kullanımla Arduino IDE’nin 1.8.11 sürümlü Linux
derleyicisinin gösterdiği davranış uyuşmamıştır. Seri monitör üzerinde koddan
rastgele karakterler göstermeye varan sorunlar görülmüştür. Bahsi geçen kullanım
“String s = a + String(sayi);” formatında dönüştürülerek sorun çözülmüştür.

4.3.2. Android

4.3.2.1. RecyclerView
42

Android Studio üzerinde eşyaların listelendiği kayan bir yapı oluşturmak için
RecyclerView kullanılmıştır [27]. Örneklere bakıldığında cardCornerRadius ile ilgili
bir hata alınmıştır. Gerekli sürüm desteği eklenerek çözülmüştür [28].

4.3.2.2. Tekil Verilerin Saklanması

Uygulama üzerinde PIN kodu gibi tekil verilerin cihaz üzerinde saklanması için veri
tabanı yerine SharedPreferences kullanılmıştır [29].

4.3.2.3. Retrofit İle İlgili Durumlar

Retrofit’te cevap alırken onResponse üzerinde responseBody() NullPointer hatası


verebilmektedir. Bunun kontrolünün sağlanması için isSuccessful() metodunun
döndürdüğü değer kontrol edilmelidir [30].

Android’de Retrofit kütüphanesi kullanılırken parametre göndermeyle ilgili kodların


yazımı esnasında URL’de görünen & gibi özel karakterlerin yazılma formatıyla ilgili
bazı zorluklarla karşılaşılabilmektedir [31]. Ayrıca zaman zaman tip dönüşümlerde
problem olabilmektedir. Bu kısımla ilgili kodların yazılması esnasında edinilen
tecrübelere göre bütün tiplerin String olarak belirlenmesi ve dönüşümlerin iletimden
sonra yapılması tavsiye edilmektedir.

4.3.2.4. SQLite Veri Tabanı İle İlgili Durumlar

SQLite veri tabanının kullanılması esnasında Unique Constraint gerekli olmuştur


[32]. Ancak gerekli işlemler yapıldığı hâlde veri tabanı düzgün çalışmamıştır.
Sorunun nedeni araştırıldığında veri tabanının yinelenen veriden arındırılması yahut
en kolay yöntemiyle silinmesi gerektiği ortaya çıkmıştır [33].

Veri tabanının sınıfı yazılırken son değiştirilen değerin alınması gerekmiştir. Burada
bu işlem tablodaki son satırla karıştırılmamalıdır [34]. Burada yapılan bir hatanın
fark edilmesi uzun sürebilmektedir.
43

4.3.2.5. Sözdizim Analizi

Android’de alınan ses komutu çeşitli şekillerde ayrıştırılmaya çalışılmış, basit


ayrıştırmalar için Java’da String sınıfına ait split metodu uygun görülmüştür [35].

4.3.2.6. Ağ İşlemleri ve Hafıza Aşımı Hatası

Android üzerinde network işlemlerinin yapılması sürekli olarak hafıza aşımı hatasına
sebep olmuştur. Uzun süre aramalar genel olarak yapıldığı için sorunun kaynağı
bulunamamış, ancak bazı işlemler yapılırken keşfedilmiştir. Varılan sonuca göre
network işlemleri asenkron olarak arka planda yapılmalıdır [36].

4.3.2.7. Asenkron Çalışmada Problemler

Android tarafında yazılan asenkron sınıftaki onPostExecute metodu, henüz asenkron


sınıftaki başka bir asenkron işlem sonlanmadığı hâlde sonlanabilmektedir.
Stackoverflow’da önerilen çözümlerden birinden hareketle başka bir çözüm
bulunmuştur [37]. İçteki asenkron işlemi çağıran dıştaki işlem, bitişinden hemen
önce bir döngü ile Thread.sleep() metodu çağrılarak bekletilmiş, içteki işlem
sonlandığında bir değişkeni değiştirmesi sağlanmış ve dışarıdaki işlem de bu
değişkenin değişmesiyle döngüden çıkarak sonlanmıştır. Böylece dıştaki asenkron
işlemin içtekinin sonlanmasını beklemesi sağlanmıştır.

Asenkron fonksiyonun çalışması bittikten sonra çağrılan sınıfta işlem yapma ihtiyacı
doğmuştur. Bunun için Stackoverflow’da new RunInBackGround().execute().get()
fonksiyonunun çağrılması önerilmiş, ancak bu ara yüzün kilitlenmesine sebep verdiği
için tercih edilmemiştir [38]. Asenkron fonksiyona gönderilecek pointer mantığında
çalışan bir değişken yapısı aranmış, bu sırada daha kullanışlı bir yapı keşfedilmiştir.
MutableLiveData canlı olarak değişkenlerin durumunu dinleyen bir yapıdır [39].
Asenkron fonksiyona parametre olarak gönderilen bu değişken, onPostExecute
metodunda değiştirilmiş, böylece asenkron fonksiyonun çalışması bittiğinde ara
yüzde de değişim sağlanmıştır.
44

4.3.2.8. Eski Android Sürümleri ile İlgili Hatalar

Android Studio üzerinde en düşük desteklenen sürüm 6.0 olarak seçilmiş olmakla
birlikte buna rağmen yeni sürümlerde çalışan uygulama bu sürümde hata
verebilmektedir. Drawable klasörüne atılan görüntü dosyaları farklı sürümler için
tekrar eklendiğinde sorun çözülmektedir.

Aktivite açıldığında imlecin odak noktasının ayarıyla ilgili veya benzeri kodlar
yazıldığında programın çalışmasına karşılık ilgili kod çalışmayabilmektedir. Keza
eski sürümlerde çalışan bazı kodlar yeni sürümlerde çalışmayabilmektedir. Bu
nedenle farklı sürümler için senaryolar test edilmeli, konsola yazılmış bir hata
olmasa dahi her bir bileşenin çalışıp çalışmadığı kontrol edilmelidir.
45

BÖLÜM 5. SONUÇLAR VE ÖNERİLER

Günümüzde eşya türünün fazla olmasına bağlı olarak sınıflandırmanın yetersiz


kalması sebebiyle eşyaların bulunması zorlaşabilmektedir. Geliştirilen bu tasarımla
bölgelere ayrılan eşyalar sesli komut yardımıyla kolayca bulunabilir.

Teze konu olan uygulama, yerel ağda çalıştığı için en önemli problem ağdaki diğer
cihazların bulunması ve bu işlemin maliyetli olması olmuştur. Bu nedenle IP’ler bir
kez bulunduktan sonra veri tabanında saklanmış, değişmediği sürece sinyal
göndermek gerektiğinde buradan alınarak kullanılmıştır. Böylece defalarca tarama
maliyetinden kaçınılmıştır. Burada dikkat edilmesi gereken nokta cihazların
birbirinin IP’lerini alabileceğidir. Bu nedenle sinyal gönderilirken sadece IP’ye
sinyal gönderme yapılmamalı, cihazın kimliği de kontrol edilmelidir.

Ağ sorunu ve sinyalle göndermeyle ilgili sorunlar çözüldükten sonra sesli komutun


işlenmesi sorunu gündeme gelmektedir. Ayrıntılı bir analiz için derleyici tasarımında
kullanılan metotlara göz atılması önerilir. Eşya ekleme, çıkarma, arama gibi
komutlarla aslında bir dil yapısı oluşturulmaktadır. Sesli komut işleme; yapay
zekayla ve arama motoru algoritmalarıyla birleştirilip daha kapsamlı bir proje ortaya
çıkarılabilir. Kişisel asistanlarla birleştirildiğinde çok daha etkili ve günlük hayatı
hayli kolaylaştıran bir proje ortaya çıkabilir.
46

KAYNAKLAR

[1] https://www.learnrobotics.org/blog/which-controller-should-i-use-wemos-d1-mini-
or-nodemcu. [Erişildi: Aralık 2019].
[2] https://www.arduino.cc/en/guide/environment. [Erişildi: Aralık 2019].
[3] https://create.arduino.cc/projecthub/auggujarat/getting-started-with-
nodemcuesp8266-on-arduino-ide-b7e18e. [Erişildi: Aralık 2019].
[4] C. BAYILMIŞ, BSM313 Nesnelerin İnterneti ve Uygulamaları Dersi Uygulama
Föyü, Sakarya: Sakarya Üniversitesi, Bilgisayar ve Bilişim Bilimleri Fakültesi,
Bilgisayar Mühendisliği Bölümü, 2019.
[5] https://www.esp8266.com/viewtopic.php?t=2153. [Erişildi: Nisan 2020].
[6] https://stackoverflow.com/questions/40062146/send-data-to-esp8266. [Erişildi:
Şubat 2020].
[7] https://github.com/esp8266/Arduino/tree/master/libraries/EEPROM. [Erişildi: Ocak
2020].
[8] https://arduino-esp8266.readthedocs.io/en/latest/libraries.html#eeprom. [Erişildi:
Ocak 2020].
[9] https://developer.android.com/studio/intro. [Erişildi: Aralık 2019].
[10] https://www.vogella.com/tutorials/Retrofit/article.html. [Erişildi: Aralık 2019].
[11] https://developer.android.com/reference/android/speech/RecognizerIntent. [Erişildi:
Aralık 2019].
[12] https://www.javatpoint.com/android-sqlite-tutorial. [Erişildi: Şubat 2020].
[13] https://github.com/stealthcopter/AndroidNetworkTools. [Erişildi: Şubat 2020].
[14] https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266mDNS. [Erişildi:
Kasım 2019].
[15] https://github.com/berndverst/androidssdp/blob/master/app/src/main/java/ly/readon/a
ndroid_ssdp/UPnPDiscovery.java. [Erişildi: Kasım 2019].
[16] https://developer.android.com/training/connect-devices-wirelessly/nsd. [Erişildi:
47

Kasım 2019].
[17] https://forum.arduino.cc/index.php?topic=42080.0. [Erişildi: Ocak 2020].
[18] https://github.com/esp8266/Arduino/blob/74819a763bfb6e9890a57411dcea4aba221
a778d/libraries/DNSServer/examples/CaptivePortalAdvanced/credentials.ino.
[Erişildi: Ocak 2020].
[19] https://support.garmin.com/en-ZA/?faq=aC6mOWyuda1ClsYQ22lgyA. [Erişildi:
Ocak 2020].
[20] https://www.routersecurity.org/wepwpawpa2.php. [Erişildi: Ocak 2020].
[21] https://github.com/tzapu/WiFiManager/issues/165. [Erişildi: Ocak 2020].
[22] https://forum.arduino.cc/index.php?topic=343015.0. [Erişildi: Ocak 2020].
[23] https://stackoverflow.com/questions/9321/how-do-you-create-a-static-class-in-c.
[Erişildi: Ocak 2020].
[24] https://tttapa.github.io/ESP8266/Chap10%20-%20Simple%20Web%20Server.html.
[Erişildi: Şubat 2020].
[25] https://www.arduino.cc/en/tutorial/BlinkWithoutDelay. [Erişildi: Mart 2020].
[26] https://www.arduino.cc/en/Tutorial/StringAdditionOperator. [Erişildi: Mart 2020].
[27] https://youtu.be/Nw9JF55LDzE. [Erişildi: Ocak 2020].
[28] https://stackoverflow.com/questions/31982890/cardcornerradius-shows-error.
[Erişildi: Ocak 2020].
[29] https://www.androidauthority.com/how-to-store-data-locally-in-android-app-
717190/. [Erişildi: Ocak 2020].
[30] https://github.com/square/retrofit/issues/2004. [Erişildi: Ocak 2020].
[31] https://stackoverflow.com/questions/36730086/retrofit-2-url-query-parameter.
[Erişildi: Şubat 2020].
[32] https://www.sqlitetutorial.net/sqlite-unique-constraint/. [Erişildi: Şubat 2020].
[33] https://stackoverflow.com/questions/11024533/sqlite-in-android-unique-constraint-
not-working. [Erişildi: Şubat 2020].
[34] https://stackoverflow.com/questions/11302276/select-last-insert-rowid-returns-
always-0. [Erişildi: Şubat 2020].
[35] http://pages.cs.wisc.edu/~hasti/cs302/examples/Parsing/parseString.html. [Erişildi:
48

Mart 2020].
[36] https://stackoverflow.com/questions/37751907/using-async-for-a-network-activity.
[Erişildi: Mart 2020].
[37] https://stackoverflow.com/questions/39289601/waiting-for-other-asynctasks-finish-
in-asynctask-before-processing-onpostexecut. [Erişildi: Mart 2020].
[38] https://stackoverflow.com/questions/14827532/waiting-till-the-async-task-finish-its-
work/14827618. [Erişildi: Nisan 2020].
[39] https://stackoverflow.com/questions/14457711/android-listening-for-variable-
changes. [Erişildi: Nisan 2020].
49

ÖZGEÇMİŞ

Melih Çelenk, 23.06.1995’te Elazığ’da doğdu. İlköğretimde kendi ihtiyaçları


doğrultusunda Visual Basic ile temel düzeyde programlar yazmaya başladı. Liseyi
Antalya’da Adem Tolunay Anadolu Lisesi’nde okuyarak buradan mezun oldu. 2014
yılında İstanbul Aydın Üniversitesi’nde Yazılım Mühendisliği bölümünde lisans
eğitimine başladıktan sonra 2016 yılında Sakarya Üniversitesi’nin Bilgisayar
Mühendisliği bölümüne yatay geçiş yaptı. Yazılım stajını 2018 yılında Vodafone’un
İTÜ’deki ofisinde Kafein Technology Solution firması ile yaptı. 2019 yılında
Akademia Górniczo-Hutnicza w Krakowie’de Erasmus değişim programı ile bir
dönem eğitim gördü. 2019 yılı itibariyle Sakarya Üniversitesi’ndeki öğrenimine
devam etmektedir.
50

BSM 498 BİTİRME ÇALIŞMASI


DEĞERLENDİRME VE SÖZLÜ SINAV TUTANAĞI

KONU : SES TANIMA İLE EŞYA BULMA SİSTEMİ


ÖĞRENCİLER (Öğrenci No/AD/SOYAD): B161210352/MELİH/ÇELENK

Değerlendirme Konusu İstenenler Not Not


Aralığı
Yazılı Çalışma
Çalışma klavuza uygun olarak hazırlanmış mı? x 0-5
Teknik Yönden
Problemin tanımı yapılmış mı? x 0-5
Geliştirilecek yazılımın/donanımın mimarisini içeren blok şeması
(yazılımlar için veri akış şeması (dfd) da olabilir) çizilerek açıklanmış mı?
Blok şemadaki birimler arasındaki bilgi akışına ait model/gösterim var mı?
Yazılımın gereksinim listesi oluşturulmuş mu?
Kullanılan/kullanılması düşünülen araçlar/teknolojiler anlatılmış mı?
Donanımların programlanması/konfigürasyonu için yazılım gereksinimleri
belirtilmiş mi?
UML ile modelleme yapılmış mı?
Veritabanları kullanılmış ise kavramsal model çıkarılmış mı? (Varlık ilişki
modeli, noSQL kavramsal modelleri v.b.)
Projeye yönelik iş-zaman çizelgesi çıkarılarak maliyet analizi yapılmış mı?
Donanım bileşenlerinin maliyet analizi (prototip-adetli seri üretim vb.)
çıkarılmış mı?
Donanım için gerekli enerji analizi (minimum-uyku-aktif-maksimum)
yapılmış mı?
Grup çalışmalarında grup üyelerinin görev tanımları verilmiş mi (iş-zaman
çizelgesinde belirtilebilir)?
Sürüm denetim sistemi (Version Control System; Git, Subversion v.s.)
kullanılmış mı?
Sistemin genel testi için uygulanan metotlar ve iyileştirme süreçlerinin
dökümü verilmiş mi?
Yazılımın sızma testi yapılmış mı?
Performans testi yapılmış mı?
Tasarımın uygulamasında ortaya çıkan uyumsuzluklar ve aksaklıklar
belirtilerek çözüm yöntemleri tartışılmış mı?
Yapılan işlerin zorluk derecesi? x 0-25
Sözlü Sınav
Yapılan sunum başarılı mı? x 0-5
Soruları yanıtlama yetkinliği? x 0-20
Devam Durumu
Öğrenci dönem içerisindeki raporlarını düzenli olarak hazırladı mı? x 0-5
Diğer Maddeler

Toplam

DANIŞMAN : DOÇ. DR. CÜNEYT BAYILMIŞ


DANIŞMAN İMZASI:

You might also like