Device = 18F252 //Kullanacağımız mikrodenetleyici seçildi
Clock =20 //Mikrodenetleyici çalışma frekansı
#option LCD_DATA = PORTC.4 //LCD data hattı 4 bit kullanılacak
#option LCD_RS = PORTB.1 //LCD RS pini tanımlanıyor
#option LCD_EN = PORTB.0 //LCD Enable pini tanımlanıyor
#option LCD_INIT_DELAY = 100 //LCD açılış bekleme süresi
Dim KIRMIZI_LED As PORTA.5 //Kırmızı LED kontrol pini
Dim YESIL_LED As PORTB.3 //Yeşil LED kontrol pini
Dim MAVI_LED As PORTA.3 //Mavi LED kontrol pini
Dim SARI_LED As PORTA.2 //Sarı LED kontrol pini
Dim BEYAZ_LED As PORTA.1 //Beyaz LED kontrol pini
Dim ASAGI As PORTC.3 //Aşağı buton kontrol pini
Dim ALGILA As PORTC.0 //ALGILA buton kontrol pini
Dim YUKARI As PORTC.2 //Yukarı buton kontrol pini
Dim ENTER As PORTC.1 //Enter buton kontrol pini
Dim LDR As PORTA.0 //LDR PORTA.0 analog pine bağlı
Dim menu_id As Byte //Menü seçim okunun konumu saklamak için kullanılır
Dim menu_flag As Boolean //Menü ekranının durumunu belirten değişken True->Menü ekranı açık
// False->Menü ekranı kapalı
Dim alt_menu_flag As Boolean //Alt menü ekran durumunu belirten değişken True->Alt menü ekranı açık
// False->Alt menü ekranı kapalı
Dim sayac As Byte //Renk tanımlama ve ayırt etmede kullanılan döngü değişkeni
Const renkler(10) As String=("BLUE ","GREEN ","YELLOW ","ORANGE ","RED ","PURPLE ","PINK ","BROWN ","BLACK ","WHITE ")//,"TANIMSIZ ")
Dim renk_degerleri(16) As Word //Sensörden okunan değerlerin her renk için saklandığı değişken
Dim ldr_degerleri(16) As Byte //LED lerin yanma sırasına göre okunan LDR değerinin saklandığı değişken
Dim kalan(16) As Byte //LED lerin yanma sırasına göre okunan LDR değerinin saklandığı değişken
Dim tanima As Boolean //True-> Tanıma başarılı False-> Tanıma başarız
Dim EE_Adres As Byte //EEPROM adresleri
Dim hassasiyet As Byte //Okunan değer için +/- hassasiyet
Dim sonuc As Word //Okunan LDR değerlerinin matematiksel işlem sonucu saklandığı değişken
Dim son_8 As Word //LDR den okunan ilk 8 LED durumuna göre değişkenler
Dim i As Byte
Dim kaydir As Byte
Dim EEbuffer As Byte
Include "LCD.bas" //LCD kütüphanesi ekleniyor
Include "ADC.bas" //ADC kütüphanesi ekleniyor
Include "convert.bas" //Değişken tipi dönüşümleri için gerekli kütüphane
Include "EEPROM.bas" //EEPROM kütüphanesi ekleniyor
/////////////////////////////////////////////////////////////////////
// ADCInput() fonksiyonu AN_0 kanalına bağlı sensör devresinden //
// analog bilginin okunmasını ve dijitale çevrilerek //
// program içerisinde değerlendrilmesini sağlar. //
/////////////////////////////////////////////////////////////////////
Function ADCInput() As Word
result = (ADC.Read(0) + 1)
End Function
/////////////////////////////////////////////////////////////////////
// RenkOku() fonksiyonu sensör devresinde ki LED'leri çeşitli //
// kombinasyonlarda yakarak rengi algılanacak yüzeyden //
// yansıyan ışık şiddetini LDR yardımıyla ölçülmesini sağlar. //
/////////////////////////////////////////////////////////////////////
Sub RenkOku()
kaydir=1
LCD.WriteAt(1, 1, "COLOUR DETECTING")
LCD.WriteAt(2, kaydir, ". ")
High(KIRMIZI_LED)
DelayMS(150)
ldr_degerleri(0)= ADCInput
Low(KIRMIZI_LED)
DelayMS(150)
kaydir=kaydir+1
LCD.WriteAt(2, kaydir, ".")
High(YESIL_LED)
DelayMS(150)
ldr_degerleri(1)= ADCInput
Low(YESIL_LED)
DelayMS(150)
kaydir=kaydir+1
LCD.WriteAt(2, kaydir, ".")
High(MAVI_LED)
DelayMS(150)
ldr_degerleri(2)= ADCInput
Low(MAVI_LED)
DelayMS(150)
kaydir=kaydir+1
LCD.WriteAt(2, kaydir, ".")
High(SARI_LED)
DelayMS(150)
ldr_degerleri(3)= ADCInput
Low(SARI_LED)
DelayMS(150)
kaydir=kaydir+1
LCD.WriteAt(2, kaydir, ".")
High(BEYAZ_LED)
DelayMS(150)
ldr_degerleri(4)= ADCInput
Low(BEYAZ_LED)
DelayMS(150)
kaydir=kaydir+1
LCD.WriteAt(2, kaydir, ".")
High(KIRMIZI_LED)
High(YESIL_LED)
DelayMS(150)
ldr_degerleri(5)= ADCInput
Low(KIRMIZI_LED)
Low(YESIL_LED)
DelayMS(150)
kaydir=kaydir+1
LCD.WriteAt(2, kaydir, ".")
High(YESIL_LED)
High(MAVI_LED)
DelayMS(150)
ldr_degerleri(6)= ADCInput
Low(YESIL_LED)
Low(MAVI_LED)
DelayMS(150)
kaydir=kaydir+1
LCD.WriteAt(2, kaydir, ".")
High(MAVI_LED)
High(SARI_LED)
DelayMS(150)
ldr_degerleri(7)= ADCInput
Low(MAVI_LED)
Low(SARI_LED)
DelayMS(150)
kaydir=kaydir+1
LCD.WriteAt(2, kaydir, ".")
High(SARI_LED)
High(BEYAZ_LED)
DelayMS(150)
ldr_degerleri(8)= ADCInput
Low(SARI_LED)
Low(BEYAZ_LED)
DelayMS(150)
kaydir=kaydir+1
LCD.WriteAt(2, kaydir, ".")
High(BEYAZ_LED)
High(KIRMIZI_LED)
DelayMS(150)
ldr_degerleri(9)= ADCInput
Low(BEYAZ_LED)
Low(KIRMIZI_LED)
DelayMS(150)
kaydir=kaydir+1
LCD.WriteAt(2, kaydir, ".")
High(KIRMIZI_LED)
High(MAVI_LED)
DelayMS(150)
ldr_degerleri(10)= ADCInput
Low(KIRMIZI_LED)
Low(MAVI_LED)
DelayMS(150)
kaydir=kaydir+1
LCD.WriteAt(2, kaydir, ".")
High(YESIL_LED)
High(SARI_LED)
DelayMS(150)
ldr_degerleri(11)= ADCInput
Low(YESIL_LED)
Low(SARI_LED)
DelayMS(150)
kaydir=kaydir+1
LCD.WriteAt(2, kaydir, ".")
High(MAVI_LED)
High(BEYAZ_LED)
DelayMS(150)
ldr_degerleri(12)= ADCInput
Low(MAVI_LED)
Low(BEYAZ_LED)
DelayMS(150)
kaydir=kaydir+1
LCD.WriteAt(2, kaydir, ".")
High(SARI_LED)
High(KIRMIZI_LED)
DelayMS(150)
ldr_degerleri(13)= ADCInput
Low(SARI_LED)
Low(KIRMIZI_LED)
DelayMS(150)
kaydir=kaydir+1
LCD.WriteAt(2, kaydir, ".")
High(BEYAZ_LED)
High(YESIL_LED)
DelayMS(150)
ldr_degerleri(14)= ADCInput
Low(BEYAZ_LED)
Low(YESIL_LED)
DelayMS(150)
kaydir=kaydir+1
LCD.WriteAt(2, kaydir, ".")
High(KIRMIZI_LED)
High(YESIL_LED)
High(MAVI_LED)
High(SARI_LED)
High(BEYAZ_LED)
DelayMS(150)
ldr_degerleri(15)= ADCInput
Low(KIRMIZI_LED)
Low(YESIL_LED)
Low(MAVI_LED)
Low(SARI_LED)
Low(BEYAZ_LED)
DelayMS(150)
kaydir=kaydir+1
LCD.WriteAt(2, kaydir, ".")
sonuc=0 //Sonuc değişkeni sıfırlanıyor
son_8=0 //son_8 değişkeni sıfırlanıyor
For i=0 To 15 //LDR değerleri toplanıyor
sonuc=sonuc+ldr_degerleri(i)
If i>7 Then //son 8 değer ayrı olarak toplanıyor
son_8=son_8+ldr_degerleri(i)
EndIf
Next
sonuc=sonuc+son_8*15 //Tüm LDR değerleri ve son 8 değerinin 15 katı ile toplanıyor sonuc değişkenine aktarılıyor
//son 8 değer sonuca daha çok etki ettiğinden bu şekilde 15 ile çarpılarak kullanıldı
End Sub
/////////////////////////////////////////////////////////////////////
// //
// ANA PROGRAM //
// //
/////////////////////////////////////////////////////////////////////
TRISA = %00000001 //PORTA giriş/çıkış durumu 1-> Giriş 0-> Çıkış
TRISB = %00010100 //PORTB giriş/çıkış durumu 1-> Giriş 0-> Çıkış
TRISC = %00001111 //PORTC giriş/çıkış durumu 1-> Giriş 0-> Çıkış
ADCON1 = $0E //Analog girişler dijital olarak ayarlandı,sadece PORTA.0 sensör girişi analog giriş olarak ayarlandı
ADCON1.7 = 1 //ADC çıkışı sonucu sağa dayalı olarak döndürülecek
Low(KIRMIZI_LED) //Kırmızı LED pasif
Low(YESIL_LED) //Yeşil LED pasif
Low(MAVI_LED) //Mavi LED pasif
Low(SARI_LED) //Sarı LED pasif
Low(BEYAZ_LED) //Beyaz LED pasif
Input(ENTER) //ENTER butonu giriş olarak tanımlandı
Input(ASAGI) //ASAGI butonu giriş olarak tanımlandı
Input(YUKARI) //YUKARI butonu giriş olarak tanımlandı
Input(ALGILA) //ALGILA butonu giriş olarak tanımlandı
LCD.Cls //LCD ekranı temizle
menu_id=1 //Menü okunun konumunu belirtir
sayac=0 //Döngü değişkeni sıfırlanıyor
EEbuffer=0
LCD.WriteAt(1, 1, " Talha C. ") //LCD birinci satıra "Talha C. " metni yazılıyor
LCD.WriteAt(2, 1, " ") //LCD ikinci satıra "2012528130042 " metni yazılıyor
DelayMS(2500) //2500ms bekle
LCD.WriteAt(1, 1, " COLOUR ") //LCD birinci satıra " SESLi RENK " metni yazılıyor
LCD.WriteAt(2, 1, "DETECTION SYSTEM") //LCD ikinci satıra "ALGILAMA SiSTEMi" metni yazılıyor
DelayMS(2500) //2500ms bekle
For EE_Adres=1 To 10 //Renk değerleri EEPROM dan okunuyor
EE.Read(EE_Adres,EEbuffer)
DelayMS(10)
EE.Read(EE_Adres+30,kalan(sayac))
renk_degerleri(sayac)=(EEbuffer*255)+kalan(sayac)
sayac=sayac+1
DelayMS(10)
Next
EE.Read(100,hassasiyet) //Hassasiyet değeri EEPROM dan okunuyor
sayac=0
While true
LCD.WriteAt(1, 1, "TO DETECT COLOUR") //LCD birinci satıra "RENK OKUMAK iCiN" metni yazılıyor
LCD.WriteAt(2, 1, "PRESS THE BUTTON") //LCD ikinci satıra "BUTONA BASIN... " metni yazılıyor
DelayMS(100) //100ms bekle
tanima=false //Renk tanınamadı
If ALGILA=0 Then //ALGILA butonuna basıldı mı?
DelayMS(200) //200ms bekle
If ALGILA=0 Then //ALGILA butonu hala basılı mı?
RenkOku //RenkOku fonksiyonuna git
LCD.WriteAt(1, 1, "DETECTED COLOUR ") //LCD birinci satıra "ALGILANAN RENK " metni yazılıyor
For sayac=0 To 9 //Okunan değerle tanımlanmış renk değerleri karşılaştırılacak
If sonuc>renk_degerleri(sayac)-hassasiyet And sonuc<renk_degerleri(sayac)+hassasiyet Then //Okunan LDR değerini tanımlanmış renk değerlerine ait +/- 5 olarak karşılaştır
LCD.WriteAt(2, 1, ">",renkler(sayac)," ") //LCD ikinci satıra algılanan renk değeri yazılıyor
tanima=true //Tanıma işlemi başarılı
While ALGILA=1 //ALGILA butonuna basılıncaya kadar döngüye gir
Wend //Döngüde kal
Break //Döngüden çık
EndIf
Next
If tanima=false Then //Renk tanımlama başarız
LCD.WriteAt(2, 1, ">UNKNOWN ",DecToStr(sonuc,5)) //LCD birinci satıra ">TANIMSIZ " metni yazılıyor
While ALGILA=1 //ALGILA butonuna basılıncaya kadar döngüye gir
Wend //Döngüde kal
EndIf
EndIf
EndIf
If ENTER=0 Then //ENTER butonuna basılmışsa menü ekranını aç
menu_id=1 //menu_id değeri 1 e eşitlendi
menu_flag=true //Menü ekranı açık
While menu_flag=true //menu_flag değeri True ise döngüye gir
Select menu_id //Memü seçimi için ok işaretinin konumunu belirten kod bloğu
Case 1 //menu_id=1 ok işareti KALiBRASYON seçeneği yanında
LCD.WriteAt(1,1, "-> CALIBRATION ")
LCD.WriteAt(2,1, " DEFINE COLOUR ")
Case 2 //menu_id=2 ok işareti RENK TANIMLA seçeneği yanında
LCD.WriteAt(1,1, " CALIBRATION ")
LCD.WriteAt(2,1, "-> DEFINE COLOUR ")
Case 3 //menu_id=3 ok işareti HASSASiYET seçeneği yanında
LCD.WriteAt(1,1, "-> SENSITIVITY ")
LCD.WriteAt(2,1, " EXIT ")
Case 4 //menu_id=4 ok işareti MENÜDEN ÇIK seçeneği yanında
LCD.WriteAt(1,1, " SENSITIVITY ")
LCD.WriteAt(2,1, "-> EXIT ")
End Select
If ASAGI=0 Then //ASAGI butonuna basılmışsa menu_id değerini 1 artır ok işareti bir alt satıra geçer
If menu_id<4 Then //menu_id değeri 4 dan küçükse
menu_id=menu_id+1 //1 artır
Else
menu_id=0 //menu_id değeri 4 dan büyükse sıfırla
EndIf
EndIf
If YUKARI=0 Then //YUKARI butonuna basılmışsa menu_id değerini 1 eksilt ok işsareti bir üst satıra geçer
If menu_id>0 Then //menu_id değeri 0 dan büyükse
menu_id=menu_id-1 //1 eksilt
Else
menu_id=4 //menu_id değeri 0 dan küçükse 4 değeri ata
EndIf
EndIf
sayac=0
DelayMS(150) //100ms bekle
If ENTER=0 Then //Menü ekranı açıkken menu butonuna basılırsa seçeneğe ait alt menü ekranı açılır
alt_menu_flag=TRUE //Alt menü ekranı açık
sayac=0
sonuc=0
son_8=0
While alt_menu_flag=true //alt_menu_flag değeri True ise döngüye gir
Select menu_id //menu_id kullanılarak hangi alt menüye girileceği belirleniyor
Case 1 //KALİBRASYON ekranı açık
LCD.WriteAt(1,1, "<-CALIBRATION ->")
sonuc = ADCInput
LCD.WriteAt(2,1,">", DecToStr(sonuc,3)," ")
DelayMS(50)
If ENTER=0 Then //Alt menü içerisindeyken ENTER basılırsa
DelayMS(100) //100ms bekle
If ENTER=0 Then //ENTER hala basılı mı?
alt_menu_flag=false //Alt menüden çık
EndIf
EndIf
Case 2 //RENK TANIMLAMA ekranı açık
If ASAGI=0 Then //ASAGI butonuna basılmışsa sayac değerini 1 artır
If sayac<9 Then //sayac değeri 15 dan küçükse
sayac=sayac+1 //1 artır
Else
sayac=0 //sayac değeri 15 den büyükse sıfırla
EndIf
EndIf
If YUKARI=0 Then //YUKARI butonuna basılmışsa sayac değerini 1 eksilt
If sayac>0 Then //sayac değeri 0 dan büyükse
sayac=sayac-1 //1 eksilt
Else
sayac=9 //sayac değeri 0 dan küçükse 15 değeri ata
EndIf
EndIf
LCD.WriteAt(1,1,"<-DEFINE COLOR->") //LCD birinci satıra yaz
LCD.WriteAt(2,1,">",renkler(sayac),DecToStr(renk_degerleri(sayac),5)) //LCD ikinci satırına seçilen rengi yaz
DelayMS(150) //150 ms bekle
If ALGILA=0 Then //ALGILA butonuna basıldı mı?
DelayMS(100) //100 ms bekle
If ALGILA=0 Then //ALGILA butonuna hala basılı mı?
RenkOku //RenkOku fonksiyonuna git
renk_degerleri(sayac) = sonuc //Seçilen renge okunan değer atandı
EndIf
EndIf
//Renk değerleri EEPROM'a kaydedilmesi
//EEPROM 8 bitlik hücrelerden oluşmaktadır, renk_değerleri değişkenimiz 16 bit olduğu için
//EEPROM'a kayıt için değişkenin 8 bitlik iki değişkene dönüştürülmesi gerekir
//Yüksek değerli ilk byte = renk_degerleri/255
//Düşük değerli son byte = renk_dergerleri mod 255
//Yukardaki şekilde 16 bitlik değişken 8 bitlik iki değişkene dönüştürülmüş olur
//Program açılışında bu işlemler tersinden yapılarak 2 8 bitlik sayıdan 16 bitlik tek bir sayı
//hesaplanır ve renk_degerleri değişkenine aktarılır
If ENTER=0 Then //Alt menü içerisindeyken ENTER butonuna basılırsa
DelayMS(50) //50ms bekle
If ENTER=0 Then //ENTER hala basılı mı?
For sayac=0 To 9 //Tüm renkler için okunan değerlerin EEPROM'a kaydedilmesi
EEbuffer=renk_degerleri(sayac)/255 //Elde edilen değer 16bit olduğu için 255'e bölerek 8 bitlik değere dönüştürüldü
EE.Write(sayac+1,EEbuffer) //8bitlik renk değeri EEPROM'a kaydediliyor
DelayMS(10) //10ms bekle
kalan(sayac)=renk_degerleri(sayac)Mod 255 //Elde edilen değerin 255e bölümünden kalan hesaplanıyor
EE.Write(sayac+31,kalan(sayac)) //kalan değeri EEPROM'a kaydediliyor
DelayMS(10) //10ms bekle
Next
alt_menu_flag=false //Alt menüden çık
EndIf
EndIf
Case 3
If ASAGI=0 Then //ASAGI butonuna basılmışsa hassasiyet değerini 1 artır
If hassasiyet<50 Then //hassasiyet değeri 50 den küçükse
hassasiyet=hassasiyet+1 //1 artır
Else
hassasiyet=0 //hassasiyet değeri 50 den büyükse sıfırla
EndIf
EndIf
If YUKARI=0 Then //YUKARI butonuna basılmışsa hassasiyet değerini 1 eksilt
If hassasiyet>0 Then //hassasiyet değeri 0 dan büyükse
hassasiyet=hassasiyet-1 //1 eksilt
Else
hassasiyet=50 //hassasiyet değeri 0 dan küçükse 50 değeri ata
EndIf
EndIf
LCD.WriteAt(1,1,"<-SENSITIVITY ->") //LCD birinci satıra yaz
LCD.WriteAt(2,1,">",DecToStr(hassasiyet,3)," ") //LCD ikinci satırına seçilen rengi yaz
DelayMS(150) //150 ms bekle
If ENTER=0 Then //Alt menü içerisindeyken ENTER butonuna basılırsa
DelayMS(50) //50ms bekle
If ENTER=0 Then //ENTER hala basılı mı
EE.Write(100,hassasiyet) //Hassasiyet değeri EEPROM'a kaydediliyor
DelayMS(10) //10 ms bekle
alt_menu_flag=false //Alt menüden çık
EndIf
EndIf
Case 4 //MENÜDEN ÇIK seçeneği aktif
DelayMS(50)
If ENTER=0 Then //Alt menü içerisindeyken menu_button'una basılırsa
DelayMS(50) //50ms bekle
If ENTER=0 Then //ENTER hala basılı mı
alt_menu_flag=false //Alt menüden çık
menu_flag=false //Menüden çık
EndIf
EndIf
End Select
DelayMS(100)
Wend
EndIf
Wend
EndIf
Wend