13 Ağustos 2016 Cumartesi

POV 3D GÖRÜNTÜLEME



LEDLER İLE 3 BOYUTLU (3D) GÖRÜNTÜ ELDE ETME

Yıllar öncesine ait ancak gerçekleştirilme şansı bulamamış bir proje elime geçti ve hemen sizlerle paylaşmak istedim. Bugüne kadar yapmak nasip olmadı ancak benzer çalışmalar daha sonraları internette çokça boy göstermeye başlamıştır. Kısaca sistem nedir? Nasıl çalışır? Ne işe yarar? Bunlardan bahsedeyim;

Daha önceleri dönen tek sıra ledlerin kısa zaman aralıklarında hangilerinin yanacağı ve hangilerinin yanmayacağı belirlenerek görüntü elde edilen birçok proje vardı. Bu tür sistemler POV Led Sistemler olarak tanımlanmaktadır. POV:  Persistence Of Vision
İnternette  POV Led olarak aratıldığında birçok kaynak bulunabilmektedir. 

Bu tür bir sistemde elde edilen görüntü yalnızca yüzeyseldir yani 2 boyutludur. Sistem basitçe 
bir motor tarafından döndürülen tek sıra led ve bunları süren kontrol devresinden oluşur.




Yukarıda bu tür bir sistemden elde edilen görüntü görülmektedir. Günümüzde benzer yapıları
USB den çalışan fanların üzerine yerleştirilen LED ler ya da dönen bir sistem olan Bisiklet 
tekerleklerinde de görebilirsiniz.



Ama en meşhur olanı Mesleki Eğitim veren Liselerde Öğrenci Projesi olarak yaptırılan Saat 
diyebilirim. Bu sistemi ilk olarak bende bu şekilde tanımıştım.





Yukarıda görüldüğü üzere ok yönünde dönen motor üzerinde ki ledler de aynı şekilde dönmektedir. Led lerin dönüşü esnasında taradıkları alan bir yüzey oluşturmaktadır. Bu yüzey 2 boyutlu olup görüntü uzayımızı da oluşturmaktadır. Burada motor üzerine dizilen ledler yukarıdan bakılacak şekilde yatay zemine paraleldirler ancak aynı Ledler dikey konumlandığında Silindir Şeklinde bir alan elde edilecektir. Silindir yüzeyine de aynı şekilde istenildiği şekilde görüntü basılabilecektir.



Bu durum yukarıdaki şekilde açıkça gösterilmektedir. Görüldüğü üzere burada önemli olan ledlerin taradığı alan ve hangi ledlerin ne zaman yanacağı yani zaman-mekan hesabının yapılması. Buradaki silindir açıldığında kayan yazı tabelalarından farklı olmadığı görülecektir. Bu konuda yeterince kaynak internette mevcut olduğu için ayrıca bir tane de benim hazırlamama çok gerek yok sanırım.





Yukarıda yer alan çizim yıllar önce bu konu üzerine yapmış olduğum bir çalışmadan alıntıdır. POV sistemlerin geliştirilmesi ile 3D görüntü uzayı oluşturmaya yönelik. Mantık basit yukarıda bahsi geçen 2 boyutlu görüntü elde etme olayından farksız diyebilirim hatta. Birden fazla bir boyut 2 boyutu, birden fazla 2 boyut da 3.boyutu meydana getiriyor. Çizimden görüldüğü üzere iç içe geçmiş silindir yüzeyleri oluşturuluyor, adeta bir ağacın gövdesi gibi birçok iç içe halka oluşuyor. Bu halkalar görüntünün oluşturulacağı alanı da oluşturmuş oluyor.

Bu tür bir sistem ile 3D görüntü elde edilebilmektedir. Burada elde edilen görüntü şeffaf bir tüp içerisine kurulacak sistem sayesinde etrafında dolaşılabilir bir görüntü olacaktır.


İç ve dış sıradaki Ledler dıştan bakan birisi için farklı açılarda dizili olduğundan görülebilir konumda olmalıdır. Işık çok hızlı hareket ettiğinden görüntülerin birbirini bastırma yok etme durumu da olmayacaktır. Bu çalışma teorik olarak ele alınmış ancak daha önce hiçbir şekilde oluşturulmamıştır. Denemek isteyenler bu durumu unutmamalıdır. Sadece fikir vermesi açısından paylaşılmıştır. Ancak buna benzer çalışmalar zaman içerisinde yapılmıştır. Popüler olan birkaçının Video olarak Linkleri aşağıda paylaşılmıştır.




AYARLI GÜÇ KAYNAĞI

AYARLI GÜÇ KAYNAĞI DEVRESİ

  GÜÇ KAYNAĞI TASARIMI

Bütün elektronik devreler sağlıklı çalışma için güç kaynaklarına ihtiyaç duyarlar. Taşınabilir elektronik cihazlarda gerilim kaynağı olarak pil ve akümülatörler tercih edilir. Ancak pil değişimi ve akümülatör şarjı, zor ve pahalı olduğundan taşınabilirliğin gerekli olmadığı durumlarda AC yi DC ye çeviren güç kaynakları daha çok kullanılır.

Bu güç kaynaklarının kullanılacağı devre, gerilim değişmelerinden etkilenmiyorsa, ekonomikliği ve yapım kolaylığı bakımından “adaptör” olarak bilinen regülesiz güç kaynakları tercih edilir. Gerilim değişmelerinin önemli olduğu yerlerde yük veya kaynak gerilimi değişmelerine rağmen, belirlenen çıkış gerilimini aynı veya çok küçük değişikliklerle kararlı tutan regüleli devreler tercih edilir.

Regüle devresi, geri besleme yoluyla çıkış gerilimini izler ve belirlenen değerde değişik yükler için otomatik olarak düzenler. Regüle için zener diyotlu transistorlü devreler veya regüle entegreleri kullanılır. Devremizde bu amaçla LM338 entegre devresi kullanılmıştır.

GÜÇ KAYNAĞI DEVRESİNİN İNCELENMESİ
        
         Devremiz maksimum 12 Volt 5Amper çıkış verebilecek şekilde tasarlanmıştır. Devrede kullanılan elemanlar çıkış değerleri gözetilerek belirlenmiştir. Her türlü güvenlik ve koruma önlemi ayrıca gözetilmiştir. Aşağıda gerçekleştirmiş olduğumuz devrenin açık devre şeması yer almaktadır.





Şekil 1.  12V-5A Regüleli güç kaynağı devresi



 DEVRE ELEMANLARININ İNCELENMESİ

Devrede kullanılan elemanların listesi aşağıda verilmiştir.

KULLANILAN MALZEME
ADETİ
DEĞERİ / ÖZELLİKLERİ
Güç kablosu
1
-
Işıklı on/off anahtar
1
250V/6A
Sigorta
1
5A
Sigorta yuvası
1
-
Transformatör
1
2x12V
Klemens
1
İkili
Plaket
1
6x10cm2
Soğutucu
1
Petekli
Port
2
1Kırmızı-1Siyah
Potansiyometre kafası
1
-
Kutu
1
Devreyi koymak için
Köprü diyot
1
5A
Entegre
1
LM338-Regülatör
Diyot
2
1N4007
Potansiyometre
1
2K5 ***
Direnç
1
270-300 Ohm arasında bir değer ***
Kondansatör
1
4700u-C1 Elektrolitik
1
100n-C2
2
10u-C4 Tantal-C3 Elektrolitik
1
100u-C5
***Yukarıda tabloda (***) ile gösterilen değerler daha sonra belirtilecek olan formüle göre hesaplanarak bulunan değerlerdir.

Tablo 1. Projede kullanılan malzemelerin listesi


Transformatör

         Alternatif akımı veya gerilimi, güç sabit kalacak şekilde istenilen değere dönüştüren cihazdır. Nüve üzerine sarılmış iki sargısı vardır. Bunlar, gerilimin uygulandığı primer ve istenilen gerilimin alındığı sekonder sargılardır. Güç kaynaklarında kullanılan transformatörler, gerilimi 3, 6, 12, 24 vb. değere düşürür. Transformatörlerde 220 voltun bağlandığı primer sargısı, ince telden çok sarımlı, düşürülmüş gerilimin alındığı sekonder sargısı ise daha kalın telden ve az sarımlıdır.
Aradaki bu ilişki  N1/Vin=N2/Vout şeklindedir.Burada;
N1=Primer sargısı
N2=Sekonder sargısı
Vin=Giriş gerilimi ve Vout=Çıkış gerilimidir.

Projede kullandığımız transformatör piyasada bulunan 2x12 Volt çıkış verebilen tarzdadır. Trafonun gücü ise; PGÜÇ=IxV den P=5Ax12V=60W şeklinde hesaplanmış ve bu hesaba dayanarak 60W çıkış gücünde seçilmiştir.
Buradaki;
                   I=Çıkıştan çekilmek istenen maksimum akım
                               V=Maksimum çıkış gerilimi
şeklindedir.


Köprü Diyot

          Alternatif akımı, bir yönde geçirerek, dalgalı doru akıma çeviren diyotlara “doğrultmaç” denir. Diyot yapımında daha çok silisyum kullanılır. Diyotlar, geniş gerilim ve akım kapasitelerinde değişik paket şekillerinde yapılırlar. Üzerlerinde katot ucunu belirtecek bir işaret bulunur. Burada kullanılan diyot köprü olarak adlandırılır. İçerisinde köprü bağlantı olarak tabir edilen şekilde bağlanmış dört diyot bulundurur. Köprü diyot seçerken dikkat edilmesi gereken nokta taşıyabileceği akım değerinin devreden çekmek istediğimiz maksimum akım değerinden küçük olmamasıdır.




Şekil 2. Köprü diyot’un yapısı ve çıkış sinyali



Filtre

        Doğrultmaç çıkışındaki doğru akımın dalgalanmasını en aza indirmek için kullanılan kondansatör, bobin veya her ikisinden meydana gelen devredir. Doğrultma devresinin çıkışındaki gerilim, maksimum değere ulaşıncaya kadar yükü beslerken, enerjinin bir kısmı filtre elemanında depolanır. Bu enerji, iki alternans arasında yükü besleyerek, uçlarında filtreli gerilim olmasını sağlar.
Filtrelemede hafif, ucuz ve az yer kapladığı için kondansatör tercih edilir. Kullanılacak kondansatör kapasitesi, devreden çekilen akıma göre belirlenir.
        Ripple voltajı genelde Vo DC çıkış voltajının bir yüzdesi olarak gösterilir ve aşağıdaki formüller yardımıyla hesaplanır.


% vr (rms) = vr (rms) / Vo x 100

CFiltre= 2.4 Iyük / vr (rms) 




Regülâtör entegresi

        Yük veya kaynak gerilimi değişmelerine rağmen, belirlenen çıkış gerilimini aynı veya çok küçük değişikliklerle kararlı tutan devrelerdir. Regüle devresi, geri besleme yoluyla çıkış gerilimini izler ve belirlenen değerde değişik yükler için otomatik olarak düzenler.
Ayarlı gerilim regülatörü, çıkış geriliminin istenilen değerde regüleli olarak elde edilmesini sağlar.
        Entegre gerilim regülatörü, kullanım ve yapım kolaylığı, çıkış geriliminin kararlı oluşu, içerisinde kısa devre koruma ünitesi bulundurması vb. üstünlüklerinden dolayı güç kaynaklarında çok kullanılmaktadır.
Entegre gerilim regülatörleri pozitif ve negatif gerilim verebilecek şekilde sabit ve ayarlanabilir olarak yapılırlar. Akım değerleri 100mA’den 5 ampere kadar yapılır. Bu regülatörün kullanıldığı devrede, giriş gerilimi, çıkış geriliminden en az 2-3V büyük olmalıdır. Bu fark çok büyürse entegrenin soğutucu ile kullanılması gerekir.





Şekil 3. LM338 in devrede kullanım şekli
      


        Devrede kullanılan regülatör entegresi LM338 dir. Yüksek çıkış kararlılığı, çıkış kısa devre koruması, aşırı sıcaklık koruması gibi birçok özelliğe sahip olduğundan tercih edilmiştir. Çıkış gerilimi 5Amper için 0Volt ile 32Volt arasında ayarlanabilmektedir. Adjustable yani ayarlanabilir özelliktedir. Çıkış gerilimi entegrenin ADJ ucu ve Vout ucu arasına bağlanan dirençlerin(R1 ve R2) değerleri hesaplanarak belirlenebilir.(Bkz.Şekil3.)
Devrenin çıkış gerilimine uygun direnç değerleri aşağıdaki formüle göre yada internet üzerinde bulunan hazır hesaplama programları kullanılarak bulunabilir.

Vout=1.25x(1+(R1/R2)) + IADJR2

         Formülden de anlaşılacağı üzere bu entegre devresi kullanılarak yapılan güç kaynağının çıkışında görülen minimum çıkış voltajı 1.25Volt civarındadır.
Devrede kullanılan diyotlar regülatör entegresinin korunması içindir. Bu diyotların devrede kullanım şekli aşağıda verilmiştir.(Bkz.Şekil4.)





Şekil 4. Koruma diyotlarının kullanımı


DEVRENİN ÇALIŞMASI VE GÜVENLİK ÖNLEMLERİ

           Yukarıda verilen bilgiler ışığında devrenin çalışmasını incelersek devreye gelen 220VAC şehir şebeke gerilimi trafo kullanılarak 12VAC değerine düşürülür. Bu gerilim değeri 5A sigorta üzerinden köprü diyota uygulanır. Köprü diyot çıkışında bu değer DC ye dönüştürülür. Ripple olarak adlandırılan dalgalanmalar girişteki 4700u değerindeki kondansatör yardımıyla yok edilmektedir yani filtrelenmektedir. Böylece doğru akımı elde etmiş bulunmaktayız. Elde edilen sinyal daha sonra regülatör entegresine uygulanarak çıkıştan istenen akım ve gerilim değerlerinin yüksek kararlılıkla elde edilmesi sağlanmaktadır. Devrede kullanılan dirençler çıkış gerilimini istediğimiz aralıkta ayarlamamızı sağlamaktadır. Çıkış 100u lık kondansatör üzerinden düzgün şekilde alınabilmektedir. Devrede kullanılan diğer kondansatör ve diyotlar regülâtörün korunması amacıyla eklenmiştir.
           Devrede kullanılan LM338 kısa devre korumalı olduğundan haricen kısa devre korumasına ihtiyaç duyulmamıştır.
LM338 aşırı sıcaklık korumasına sahiptir. Bunun yanında ek olarak entegre devreye ve köprü diyota petekli alüminyum soğutucu bağlanmıştır.Böylece ısı daha geniş yüzeye dağıtılarak uzun süreli kullanımlarda çıkıştan istenilen gerilim ve akım değerlerinin sorunsuzca alınması hedeflenmiştir.Soğutucunun metal kutuyla teması engellenerek kaçak durumlarının önüne geçilmiştir.
           Devre girişine yerleştirilen 5A değerindeki sigorta da bir diğer koruma önlemi olarak yer almaktır. Çekilmek istenen aşırı akıma ya da ani dalgalanmalara karşı devreyi koruması amaçlanmıştır.Devreye uygulanan şehir şebeke gerilimi girişte kullanılan ışıklı on/off anahtar sayesinde istenildiği şekilde kontrol edilebilmektedir.
           Montaj esnasında dikkat edilen bir diğer husus açıkta kablo yada tehlikeli olabilecek bağlantının kalmaması,bu nedenle izolasyon ön planda tutulmuştur.


 GÜÇ KAYNAĞI DEVRESİNİN BASKI DEVRE ŞEMASI






12 Ağustos 2016 Cuma

C++ İLE MENU VE DOSYA İŞLEMLERİ

C++ İLE MENÜ YAPIMI VE DOSYAYA KAYIT İŞLEMLERİ


Merhaba Sevgili dostlar, bildiğiniz üzere C++ Sistem Programcılığı açısından yeri dolmaz bir dildir. Ancak masaüstü uygulamalar söz konusu olduğunda günümüzde pek fazla tercih edilmemektedir. Bunun sebebi olarak arayüz geliştirmenin zorluğu gösterilebilir. Günümüzde C++ tabanlı bir çok kütüphane bu işin eksikliğini kapatmaya yardımcı olmaktadır. 

Ancak bugün burada bir miktar nostalji yapacağız.Yukarıda verilene benzer bir arayüz nasıl geliştirilir ve basit veri giriş çıkış işlemleri konusu bu yazımızda ele alınacaktır. 
NOT: Temel C++ Programlama bilgisine sahip okurlara yöneliktir.

Windows Mesaj Pencereleri imleç konumunun tespiti konsol renginin değiştirilmesi gibi konuların geliştireceğimiz programa dahil edilebilmesi için önceliklle #include "windows.h" dosyasını programımıza eklememiz gerekmektedir.

Türkçe karakter kullanımının sağlanabilmesi içinde yine benzer şekilde farklı bir C++ kütüphanesini, #include <locale.h>  ,programımıza ekliyoruz. 

time.h #include <ctime> ise zaman , tarih-saat, fonksiyonlarını barındırır.


Aşağıda farklı bir konsol rengi örneği verilmiştir. system("color 4"); şeklinde vereceğiniz bir komut ile konsol rengini değiştirmeniz mümkündür. Buradaki olay CMD ile çalıştırdığınız komut satırına komut verme işlemi ile aynıdır. color 1 ya da color 0 olarak komut satırına yazılan komutlar burada system komutu ile birlikte kullanılmaktadır.



Renk Kodları;

Renk kodları CMD ile komut satırından bulunabilir help color yazmanız yeterlidir.



Güzel görünümlü bir menü yapabilmek için sıkça kullanacağımız gotoxy komutunun çalışabilmesi için aşağıda belirtilen tanımlamanın programda yapılması gerekmektedir..

void gotoxy(short x,short y) 


COORD pos={x,y}; 
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); 

}

gotoxy kullanımına örnek olarak;

gotoxy(15,4);

komutu verilebilir burada ilk rakam X ekseninde ikinicisi ise Y ekseninde imlecin gideceği nokta tanımlanmaktadır. Burada rakamlar kullanıcıdan alınabilir Renk seçiminde de aynı şekilde kullanıcılardan alınan rakamlar değişkenler aracılığı ile ilgili fonksiyonlarda kullanılabilmektedir. Böylece durağan bir yapıdan ziyade programa hareketlilik kazandırılmış olacaktır.





Bildiğiniz üzere C/C++ dillerinde ekrana yazdırılan mesajlarda Türkçe karakterler gösterilememektedir. Ancak Local tanımlamalarının yapılması halinde Yerel dilin kullanımına yönelik dil desteği sağlanabilmektedir. Ç,Ş,İ,Ü,Ö gibi karakterleri kullanabilmemiz için aşağıda belirtilen tanımlamanın main() fonksiyonu içerisinde yapılması gerekmektedir.

setlocale(LC_ALL,"Turkish");

Bu yazıda örnek uygulamada kullanılan Tüm C++  komutlarına değinilmeyecektir. Ancak standart kullanımın dışında kalanlar veya çok önemli görülenler kısmen açıklanmıştır. Temel giriş çıkış ve dosya işlemlerine yönelik komutların bir kısmı da aşağıda özet olarak verilmiştir.

cout<<"Yapmak istediğiniz işlemi seçiniz:[ ]";

cout komutu ekrana yazı yazdırmak için kullanılmaktadır. Burada neden printf kullanmadığımızı soranlar olabilir. cout kullandığımızda tür biçim tanımlamaları otomatik ve daha genel olarak yapılmaktadır.Nesne yönelimli bir yapıya dayandığından printf'e kıyasla kullanımı daha kolaydır.

cout<<"\nÖMÜR BİLGİSİ:"; 
cin>>zaman;

yukarıda kullanıcıdan istenen ömür bilgisi cin komutu ile zaman adlı değişkene aktarılmıştır. Görüldüğü üzere komutun amacı kullanıcıdan alınan verileri değişkenlere aktarmak. Ancak burada verinin türü biçimi muallaktır, scanf komutunu kullanmış olsaydık mutlaka bunları belirtmemiz gerekecekti.

Örnek olarak verilen çalışmada amacımız kullanıcıdan aldığımız verileri metin tabanlı bir dosyada saklamak ve gerektiğinde yeniden görüntüleme, kayıtları güncelleme ya da silme gibi işlemlerini hazırladığımız menüden yani kullanıcı arayüzünden kolayca yapabilmek. Burada bir veri tabanı uygulaması yapmasak da yine de metin tabanlı bir dosya üzerinden güzel bir uygulama yapmış olacağız. Örnek verilen program Depo Kayıt Programı olacaktır. Depoya malzeme kaydetme , depodan malzeme görüntüleme, güncelleme ve silme işlemlerini içermektedir.

Yukarıda örnek olarak verilen ekran görüntülerinden de anlaşılacağı üzere 6 seçenekli bir menümüz var.Bunlardan biri sistemden çıkış, bir diğeri sistem ayarları ve geriye kalanları ise kayıt ekleme,silme,güncelleme,vs...

system("CLS");

Bu komut ekran görüntüsünün temizlenmesi için kullanılmaktadır.






Kayıtların dosyaya yazılabilmesi için bir dizi komuta ihtiyaç vardır. Bu komutların kullanılabilmesi için C++ için dosya işlemleri kütüphanesinin yazılıma eklenmesi gerekmektedir.

#include <fstream> kodu yazarken en başa eklenmesi gereken kütüphanedir.

ofstream dosyayayaz("envanter.txt",ios::app); envanter.txt isimli dosyayı yoksa oluşturur,varsa da yazmaya hazır şekilde açar.


if (!dosyayayaz)
{
system("CLS");
cerr<<"Dosya açılamadı.Ana menüye dönmek için bir tuşa basınız.";
getch();
return;
}
else
{...

Bu kısımda dosyanın açılması sırasında oluşabilecek bir hata karşısında yapılması gerekenler tanımlanmaktadır. Bir programda oluşabilecek hatalar için mutlaka bir prosedür oluşturmak gerekir. Aksi durumda donmalar, takılmalar öylece kalakalmalar kaçınılmazdır. 

ifstream dosyaoku("envanter.txt",ios::in); 

Dosyadan okuma yapmak için kullanılır.Dosyadan okunan veriler ekranda aşağıda yer aldığı şekilde gösterilebilir.

while(!dosyaoku.eof())
{
dosyaoku>>id>>isim>>miktar>>fiyat>>zaman;
if(!dosyaoku)break;
cout<<"ID:"<<id<<"\t"<<"MALZEME:"<<isim<<"\t"<<"MİKTARI:"<<miktar<<"\t"<<"FİYATI:"<<fiyat<<"\t"<<"ÖMRÜ:"<<zaman<<endl;
}

Yazıyı daha fazla uzatmamak adına konunun tamamını içeren örnek bir uygulama aşağıdakine benzer şekilde verilebilir. Açıklamalar kodun içerisinde yapılmıştır. Yukarıda anlatım göz önüne alındığında kolaylıkla anlaşılabilecektir. Temel C++ fonksiyonları ve C++ programlama dilinin yapısı başka bir yazının konusu olduğundan bunların bilindiği varsayılmıştır.



Kodun Tamamı:


#include <iostream>
#include <iomanip>
#include <conio.h>
#include <locale.h>
#include <ctime>
#include "windows.h"
#include <string>
#include <fstream>
#include <ctype.h>
using namespace std;
string Renk="Geçerli";

void AnaTema(void);
void AnaMenu(void);
void Menu1(void);
void Menu2(void);
void Menu3(void);
void Menu5(void);
void verigir(void);
void oku_hepsini(void);
void oku_id(void);
void oku_rastgele(void);

//<<<<<<<<<<<<<<< gotoxy için koordinat api tanımlaması >>>>>>>>>>>>>>>>>>>>>>>>

void gotoxy(short x,short y)
{
COORD pos={x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}

//################################# Ana Fonksiyon ##############################

int main()
{
char selection;
setlocale(LC_ALL,"Turkish");

AnaMenu();
           
while(1)
            {          
selection=getch();
            switch(selection)
            {
            case '1':
            Menu1();
break;
            case '2':
            Menu2();
break;
            case '3':
            Menu3();
break;
            case '4':
AnaTema();
gotoxy(18,6);
cout<<"Bu Menü Aktif değildir."<<endl;
gotoxy(18,8);
cout<<"Ana Menüye dönmek için bir tuşa basınız.";
getch();
AnaMenu();
break;
            case '5':
            Menu5();
break;
            case 'X':
                        /*system("EXIT");*/
            exit(1);
break;
                       
            }          
            }
            return 0;
}

//<<<<<<<<<<<<<<<<<< C++ EKRAN TEMASI >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

void AnaTema()
{
system("CLS");
/*cout<<system("echo %date%")<<endl;*/
time_t now=time(0);
cout<<ctime(&now)<<endl;
gotoxy(57,0);
cout<<"Console Colour:"+Renk;
gotoxy(30,3);
cout<<"DEPO KAYIT PROGRAMI"<<endl;
gotoxy(15,4);
cout.width(50);
cout.fill('=');
cout<<" ";


for (int y=3;y<20;y++)
{
gotoxy(15,y);
cout<<"|";
gotoxy(64,y);
cout<<"|";
}
for(int x=15;x<65;x++)
{
gotoxy(x,20);
cout<<"+";
}
for(int x=16;x<64;x++)
{
gotoxy(x,18);
cout<<"=";
}
}

//<<<<<<<<<<<<<<<<<<<<<<<<<<< Ana Menu >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

void AnaMenu()
{
AnaTema();
string MenuItem[6];
MenuItem[0]="[1] Yeni Kayıt Ekleme";
MenuItem[1]="[2] Kayıt Görüntüleme";
MenuItem[2]="[3] Kayıt Güncelleme";
MenuItem[3]="[4] Kayıt Silme";
MenuItem[4]="[5] Sistem Ayarları";
MenuItem[5]="[X] Programı Kapat";

for (int menu=0;menu<=5;menu++)
{
gotoxy(20,6+(menu*2));
cout<<MenuItem[menu];
}
gotoxy(15,22);
cout<<"Yapmak istediğiniz işlemi seçiniz:[ ]";
gotoxy(50,22);
}

// <<<<<<<<<<<<<<<<<<< Menu1 / Yeni Kayıt Oluşturma >>>>>>>>>>>>>>>>>>>>>>

void Menu1()
{
char islem;
AnaTema();
string MenuItem[7];
MenuItem[0]="1-] Malzeme ID no:";
MenuItem[1]="2-] Malzeme İsim:";
MenuItem[2]="3-] Malzeme Miktarı:";
MenuItem[3]="4-] Satış Fiyatı:";
MenuItem[4]="5-] Saklama Süresi:";
MenuItem[5]="Sonlandır [S] / Eklemeye devam et [E]:[ ]";
gotoxy(17,19);
cout<<"[Y] Yeni  [M] Ana Menü  [X] Kapat";
for (int menu=0;menu<=5;menu++)
{
gotoxy(20,6+(menu*2));
cout<<MenuItem[menu];
}
gotoxy(15,22);
cout<<"Yapmak istediğiniz işlemi seçiniz:[ ]";
gotoxy(50,22);
islem=getch();
switch(islem)
{
case 'Y':          
verigir();
AnaMenu();
break;
case 'M':
AnaMenu();
            return;
            break;
case 'X':
            exit(1);
            break;
default:
AnaMenu();
            return;
break;
}
}

// <<<<<<<<<<<<<<< Menu2 / Dosyadan verileri okuma >>>>>>>>>>>>>>>>>>>>>>>

void Menu2()
{
char menusec;
AnaTema();
string MenuItem[3];
MenuItem[0]="1-] Tüm Kayıtları göster";
MenuItem[1]="2-] ID Numarası verilen kaydı göster.";
MenuItem[2]="3-] Rastgele erişim.";
gotoxy(17,19);
cout<<"[M] Ana Menü  [X] Kapat";
for (int menu=0;menu<=2;menu++)
{
gotoxy(20,6+(menu*2));
cout<<MenuItem[menu];
}
gotoxy(15,22);
cout<<"Yapmak istediğiniz işlemi seçiniz:[ ]";
gotoxy(50,22);
menusec=getch();
switch(menusec)
{
case '1':
oku_hepsini();
break;
case '2':
oku_id();
break;
case '3':
oku_rastgele();
break;
case 'M':
            AnaMenu();
            return;
break;
case 'X':
            exit(1);
break;
                       
}
AnaMenu();
}

//<<<<<<<<<<<<<<<<<<<< Menu3 / Kayıt güncelleme >>>>>>>>>>>>>>>>>>>>>>>>>>

void Menu3()
{
string U_id;
system("CLS");
cout<<"Güncelenecek kaydın ID'sini giriniz:";
cin>>U_id;
fstream dosyaoku("envanter.txt",ios::in|ios::out);
if(!dosyaoku)
{
system("CLS");
cerr<<"Dosya açma hatası.Geri dönmek için bir tuşa basınız.";
AnaMenu();
return;  
}
else
{
string id,isim,miktar,fiyat,zaman;
string n_id,n_isim,n_miktar,n_fiyat,n_zaman;
ofstream dosya("gecici.txt",ios::app);
system("CLS");
while(!dosyaoku.eof())
{
dosyaoku>>id>>isim>>miktar>>fiyat>>zaman;
if(!dosyaoku)break;

if(id==U_id)
{
cout<<"ID:"<<id<<"\t"<<"MALZEME:"<<isim<<"\t"<<"MİKTARI:"<<miktar<<"\t"<<"FİYATI:"<<fiyat<<"\t"<<"ÖMRÜ:"<<zaman<<endl;
cout<<"\n\nGüncel Satır verilerini giriniz."<<endl;
cout<<"\nID:";
cin>>n_id;
cout<<"\nMALZEME:";
cin>>n_isim;
cout<<"\nMİKTARI:";
cin>>n_miktar;
cout<<"\nFİYATI:";
cin>>n_fiyat;
cout<<"\nÖMRÜ:";
cin>>n_zaman;
id=n_id;
isim=n_isim;
miktar=n_miktar;
fiyat=n_fiyat;
zaman=n_zaman;

}
dosya<<id<<"\t"<<isim<<"\t"<<miktar<<"\t"<<fiyat<<"\t"<<zaman<<endl;
}

cout<<"\nAna Menüye dönmek için herhangi bir tuşa basınız...";
dosyaoku.close();
dosya.close();
system("del envanter.txt");

rename("gecici.txt","envanter.txt");
getch();
}

AnaMenu();
return;
}

//<<<<<<<<<<<<<<<<<<<< Konsol Yazı Rengi Ayarları >>>>>>>>>>>>>>>>>>>>>>>>>>

void Menu5()
{
char colorcode;
AnaTema();
string MenuItem[5];
MenuItem[0]="Lütfen Renk Seçimizi yapınız.";
MenuItem[1]="1-] Kırmızı";
MenuItem[2]="2-] Mavi";
MenuItem[3]="3-] Yeşil";
MenuItem[4]="4-] Beyaz";
for (int menu=0;menu<=4;menu++)
{
gotoxy(20,6+(menu*2));
cout<<MenuItem[menu];
}
gotoxy(15,22);
cout<<"Yapmak istediğiniz işlemi seçiniz:[ ]";
gotoxy(50,22);
colorcode=getch();
switch(colorcode)
{
case '1': system("color 4");
Renk="Kırmızı";
break;
case '2': system("color 1");
Renk="Mavi";
break;
case '3': system("color 2");
Renk="Yeşil";
break;  
case '4': system("color 7");
Renk="Beyaz";
break;             
}
AnaMenu();
}

//<<<<<<<<<<<<<<<<<<<< Veri giriş alt fonksiyonu >>>>>>>>>>>>>>>>>>>>>>>>

void verigir()
{

struct malzeme
{
string id,isim,miktar,fiyat,sure;
}yeniM;
char x='E';
try
{
ofstream dosyayayaz("envanter.txt",ios::app);
if (!dosyayayaz)
{
system("CLS");
cerr<<"Dosya açılamadı.Ana menüye dönmek için bir tuşa basınız.";
getch();
return;
}
else
{
while(x=='E')
{
gotoxy(38,6);
cin>>yeniM.id;
gotoxy(37,8);
cin>>yeniM.isim;
gotoxy(40,10);
cin>>yeniM.miktar;
gotoxy(37,12);
cin>>yeniM.fiyat;
gotoxy(39,14);
cin>>yeniM.sure;
gotoxy(59,16);
cin>>x;
dosyayayaz<<yeniM.id<<"\t"<<yeniM.isim<<"\t"<<yeniM.miktar<<"\t"<<yeniM.fiyat<<"\t"<<yeniM.sure<<endl;
}
dosyayayaz.close();
}
}
catch(exception& e)
{
system("CLS");
cout<<"Bilinmeyen bir hata oluştu.Ana menüye dönmek için bir tuşa basınız.";
getch();
return;
}
return;
}

//<<<<<<<<<<<<<<<<<<<<< Hepsini okuma >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

void oku_hepsini()
            {
ifstream dosyaoku("envanter.txt",ios::in);
if(!dosyaoku)
{
system("CLS");
cerr<<"Dosya açma hatası.Geri dönmek için bir tuşa basınız.";
AnaMenu();
return;
}
else
{
string id,isim,miktar,fiyat,zaman;
system("CLS");
while(!dosyaoku.eof())
{
dosyaoku>>id>>isim>>miktar>>fiyat>>zaman;
if(!dosyaoku)break;
cout<<"ID:"<<id<<"\t"<<"MALZEME:"<<isim<<"\t"<<"MİKTARI:"<<miktar<<"\t"<<"FİYATI:"<<fiyat<<"\t"<<"ÖMRÜ:"<<zaman<<endl;
}

}
cout<<"\nAna Menüye dönmek için herhangi bir tuşa basınız...";
getch();
dosyaoku.close();
return;
}

//<<<<<<<<<<<<<<<<<<<< ID ye göre okuma >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

void oku_id()
{
string M_id;
system("CLS");
cout<<"Malzeme ID numarasını giriniz:";
gotoxy(30,0);
cin>>M_id;
ifstream dosyaoku("envanter.txt",ios::in);
if(!dosyaoku)
{
system("CLS");
cerr<<"Dosya açma hatası.Geri dönmek için bir tuşa basınız.";
AnaMenu();
return;  
}
else
{
string id,isim,miktar,fiyat,zaman;
system("CLS");
while(!dosyaoku.eof())
{
dosyaoku>>id>>isim>>miktar>>fiyat>>zaman;
if(!dosyaoku)break;
if(id==M_id)
{
cout<<"ID:"<<id<<"\t"<<"MALZEME:"<<isim<<"\t"<<"MİKTARI:"<<miktar<<"\t"<<"FİYATI:"<<fiyat<<"\t"<<"ÖMRÜ:"<<zaman<<endl;
}
}
cout<<"\nAna Menüye dönmek için herhangi bir tuşa basınız...";
getch();
}
dosyaoku.close();
return;
}

//<<<<<<<<<<<<<<<<<<<<<<< Rastgele okuma >>>>>>>>>>>>>>>>>>>>>>>>>>>>

void oku_rastgele()
{
int pozisyon;
int okunacak;
system("CLS");
cout<<"Okumaya başlanılacak pozisyon bilgisini giriniz:";
cin>>pozisyon;
cout<<endl;
cout<<"Okunacak karakter sayısını giriniz:";
cin>>okunacak;
cout<<"\n"<<endl;
fstream dosyaoku("envanter.txt",ios::in);
if(!dosyaoku)
{
system("CLS");
cerr<<"Dosya açma hatası.Geri dönmek için bir tuşa basınız.";
AnaMenu();
return;  
}
else
{

char okunan[okunacak];


dosyaoku.seekp(pozisyon,ios::beg);
dosyaoku.read(okunan,okunacak);
cout<<okunan<<endl;
cout<<"\n\nAna Menüye dönmek için bir tuşa basınız.";
getch();
}
}