Arduino ile Saat Uygulaması
|Merhabalar..
Bu konuda Arduino da 4′ lü 7 segment yardımı ile saat yapımına değineceğiz.
Saatimiz 00:00 dan başlayıp sayma işlemi gerçekleştirecek. Aynı zamanda bilgisayar saatine erişmek bir C# ile yazılmış bir uygulama ile mümkün olacak.
Uygulamamızda daha önceden bahsettiğimiz çoklu segment kullanım mantığı olacak. Bundan kastımız 4 adet 7 segmentin aktif etmek için kullandığımız pinleri milisaniyeler içinde yakıp söndürme işlemi. Bu işlem gözün algılayabileceği hızdan daha fazla olduğu için fark edilmeyecek. Veriyi bilgisayardan alırken C# da veriyi datetime formatından string’ lere çevirip, seri port üzerinden arduino ya aktarma ve burada gerekli parçalara ayırma işlemi gerçekleştirilecek. Bu parçalara ayırma işleminde substring fonksiyonu kullanılacak. Ayrıca kullandığımız ufak bir buton ile uygulamadaki saniye değerini segmentler üzerine yazdırabileceğiz.
Ancak burada dikkat etmemiz gereken bir nokta var. O da 7 segmentimizin ortak anot mu yoksa ortak katot mu olduğu. Benim yazdığım kodlar ve vereceğim bağlantı şeması için ortak anot için. Siz kendi segmentinizin türünü öğrenmeden bağlantı gerçekleştirmeyiniz. Aksi taktirde beklenmedik sonuçlar ile karşılaşabilirsiniz …
Tekli 7 segment kullanımına buradan ulaşabilirsiniz
Öncelikle bağlantı şemamızı verelim:
Arduino’ nun fritzing de mega adk olmasına takılmayın. Normal Mega da kullanabilirsiniz..
Üstte belirttiğimiz gibi buradaki bağlantılar ortak anot içindir. Herhangi bir segmentin yanması için yazılımda Arduino’ da ilgili pin i LOW a çekeceğiz. Bu ortak katot segmentler de tam tersidir.
Şimdi de Arduino Kodumuz:
#include<String.h> //string fonksiyonlarını içieren kütüphane const int katotPin[7] = {2,3,4,5,6,7,8}; //segment pinlerimiz //HIGH e çekilecek display aktif etme pinlerimiz const int dkBirler = 13; const int dkOnlar = 12; const int saatBirler = 11; const int saatOnlar = 10; //aradaki iki nokta const int nokta = 22; //high e çekiecek //buton pini const int butonPin = 41; int butonDurumu = 0; int dakika,saat,saniye; String gelenDeger = ""; char deger[10]; int sayac = 0; bool durum = true; //ortak anot için rakamlar //a,b,c,d,e,f,g int rakamlar[10][7] = {{0,0,0,0,0,0,1}, {1,0,0,1,1,1,1}, {0,0,1,0,0,1,0}, {0,0,0,0,1,1,0}, {1,0,0,1,1,0,0}, {0,1,0,0,1,0,0}, {0,1,0,0,0,0,0}, {0,0,0,1,1,1,1}, {0,0,0,0,0,0,0}, {0,0,0,0,1,0,0} }; void setup() { Serial.begin(9600); for(int i = 0; i < 7; i++){ pinMode(katotPin[i], OUTPUT); } pinMode(dkBirler, OUTPUT); pinMode(dkOnlar, OUTPUT); pinMode(nokta, OUTPUT); pinMode(saatBirler, OUTPUT); pinMode(saatOnlar, OUTPUT); pinMode(butonPin, INPUT); } void loop() { //buton durumunu oku butonDurumu = digitalRead(butonPin); //seri portta veri mi varmı? if(Serial.available() > 0){ delay(15); //hassas okuma için ufak bir gecikme //seri porttaki değerleri bir string e yazdık for(int i = 0; i < Serial.available(); i++){ deger[i] = Serial.read(); gelenDeger = gelenDeger + deger[i]; } //string deki değer null değilken substring işlemlerini gerçekleştirdik if(gelenDeger != ""){ saat = gelenDeger.substring(0,2).toInt(); dakika = gelenDeger.substring(3,5).toInt(); saniye = gelenDeger.substring(5,gelenDeger.indexOf('|')).toInt(); } }else{ gelenDeger = ""; //eğer seri port kapalı ise string i boşalttık } //butona basılı değilken saati göstersin if(butonDurumu == 0){ //displeye rakam yazma işleminde ilgili displayi aktif edip çıkışlara o displayde //gözükecek sayinin bitlerini gönderdik //bu işlem 5 er ms lik gözün algılayamacağı gecikme ile gerçekleştirildi rakam(dakika % 10); digitalWrite(dkBirler, HIGH); digitalWrite(dkOnlar, LOW); digitalWrite(saatBirler, LOW); digitalWrite(saatOnlar, LOW); delay(5); rakam(dakika / 10); digitalWrite(dkBirler, LOW); digitalWrite(dkOnlar, HIGH); digitalWrite(saatBirler, LOW); digitalWrite(saatOnlar, LOW); delay(5); rakam(saat % 10); digitalWrite(dkBirler, LOW); digitalWrite(dkOnlar, LOW); digitalWrite(saatBirler, HIGH); digitalWrite(saatOnlar, LOW); delay(5); rakam(saat / 10); digitalWrite(dkBirler, LOW); digitalWrite(dkOnlar, LOW); digitalWrite(saatBirler, LOW); digitalWrite(saatOnlar, HIGH); delay(5); }else{ //butona basılıyorsa pinlere saniye değerini gönderildi rakam(saniye % 10); digitalWrite(dkBirler, HIGH); digitalWrite(dkOnlar, LOW); digitalWrite(saatBirler, LOW); digitalWrite(saatOnlar, LOW); delay(10); rakam(saniye / 10); digitalWrite(dkBirler, LOW); digitalWrite(dkOnlar, HIGH); digitalWrite(saatBirler, LOW); digitalWrite(saatOnlar, LOW); delay(10); } //programın kararlılığını engelleyen kısım //her sorgu programa mikrosaniyeler boyutunda da olsa gecikme verir //belli bir süre sonra yazılım geri kalamya başlıyacaktır sayac++; if(sayac == 20){ digitalWrite(nokta, HIGH); }else if(sayac == 40){ digitalWrite(nokta,LOW ); } if(sayac == 50){ sayac = 0; saniye++; if(saniye == 60){ saniye = 0; dakika++; } if(dakika == 60){ dakika = 0; saat++; } if(saat == 24){ saat = 0; } } } void rakam(byte sayi){ for(int i = 0; i < 7 ; i++){ digitalWrite(katotPin[i], rakamlar[sayi][i]); } } //Prepared by Oğuzhan Başer
Yazılımın içerisinde de belirttiğimiz gibi ufak bir gecikme sorunu yaşanmaktadır. Bunu en yakında daha iyi bir algoritmanın bulunduğu fonksiyonlar ile değiştereceğim.. :)
Arayüzümüzün görüntüsü ve exe dosyası:
Arayüz kaynak kodlarına buradan ulaşabilirsiniz..
Siteniz ve çalışmalarınız çok güzel olmuş tebrikler.
Saatteki gecikmeyi sayac++ yerine millis() fonksiyonundan yararlanıp yaparsanız çok daha net sonuçlar alırsınız. Başarılar dilerim.
Ben timer kullanma taraftarıydım. Alternatif olarak düşünülebilir. Tavsiye için teşekkürler..
hocam kolay gelsin ben projeyi biraz değiştirdim buzzer ekledim ve zamanı dakika ve saniye olarak ayarladım sistemde sıkıntı yok çalışıyor ama ben buna bir buton ekleyip basmadığım halde 00:00 da beklemesi basınca başlamasını istiyorum yardımcı olursanız sevinirim teşekkürler.
Merhaba..
Bunu basit bir sorgu ile sağlayabilirsiniz. Buton durumunu okuyup eğer basıldı ise bool bir değişkenin değerini true yapıp saymaya başlayabilirsiniz. Sonra tekrar basınca bu değişkenin değerini false yapar saymayı durdurabilirsiniz.
İyi Çalışmalar.
Hocam dediğiniz komutlarda denediğimde sayaç sayma işleminde sapıtıyor. Butona basıldığında normale giriyor yani saymayı devreye ilk elektrik verdiğimde 00:00 da beklemeye alınmıyor. butona basıldığında başlayıp 30:00 dakikada bitirip tekrar başa döndüğünde aynı işlemi tekrarlamasını istiyorum. İlginiz ve alakanız için teşekkürler.
Tam olarak sorununuzu anlamadığım için yardımcı olamayacağım. Ancak yazdığınız yazılımı sorununuz ile birlikte baser61061@gmail.com adresine gönderirseniz daha detaylı yardımcı olmaya çalışırım.
İyi çalışmalar.
hocam email adresinize açıklamalı bir şekilde yazarak gönderdim ilginiz için teşekkürler.
ellerinize sağlık
programın indirme bağlantısı çalışmıyor. yardımm
Merhaba, uyardığınız için teşekkür ederim. Linki güncelledim. İyi çalışmalar dilerim…