Skip to content

Instantly share code, notes, and snippets.

@RobolinkAkademi
Last active October 28, 2019 07:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RobolinkAkademi/23b83387f6d32b6b489d2678c0bcb60c to your computer and use it in GitHub Desktop.
Save RobolinkAkademi/23b83387f6d32b6b489d2678c0bcb60c to your computer and use it in GitHub Desktop.
tum_yil_icin_arduino_mufredati_31.2
/*Tur zamanlarını kaydedebilen kronometre devresinin arduino programıdır.
* Mekanik bir buton yardımıyla kronometre başlatılır durdurulur ve resetlenir.*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
int butonPin=7;//Butonun bağlanacağı pin numarası
long tBaslangic=0;//Kronometre ilk başlatıldığında millis()
//sayacı bu değişkene kaydedilir.Program süresince
//bu değer referans alınarak süreler hesaplanır.
int durum=0;/*Kronometrenin başlangıç konumunda mı, ilerliyor mu yoksa durdurulmuş
mu olduğunu ifade eden durum numarası bu değişkende tutulur. Durum 0 ise
kronometre başlangıç için 00:00:00 konumdadır ve başlamaya hazırdır.
Durum 1 ise kronometre başlatılmış ve ilerliyordur, bu aşamada tur
zamanları kayıt edilebilir ve bir daha butona basıldığında kronometre duracaktır.
Durum 2'de ise butona basılmış süre durdurulmuştur, bu durumda
kaydedilen tur süreleri incelenebilir, kronometre butna basıldığı takdirde sıfırlanacaktır.*/
int secmebutonu=0;//Bounce etkisi giderildikte sonra butonun durumunun tutulduğu değişken
int secmebutondurumu=0;//Butona basıldığında bir önceki anda butonun hangi durumda olduğunu gösteren değişken
long anlikSure=0;//İstenilen andaki sürenin kaydedildiği değişken
int sonOlculenSure=0;//Tur zamanı kaydedilirken kullanılacak olan bir değişken
void setup() {
pinMode(butonPin,INPUT);
lcd.begin();
lcd.print("Butona Basiniz");
while(!digitalRead(butonPin));
lcd.clear();
}
void loop() {
//Bounce etkisinin giderildiği kısım
if(digitalRead(butonPin)==HIGH){
if(durum==0){ //durum 0 olduğu takdirde başlangıç süresi referans olarak tBaslangic'a kaydedilir.
tBaslangic=millis();}
delay(30);
if(digitalRead(butonPin)==HIGH){secmebutonu=1;}
}
else{secmebutonu=0;}
//"durum" değişkeninin içeriğine göre yapılacak işlemler switch/case yapısı ile belirlenir.
switch(durum){
//0 durumunda yapılacak işlemler buradadır.
case 0:
if(secmebutondurumu==0 && secmebutonu==1){//Daha önce basılmıyor iken şuanda butona basılmışsa yapılacak işlemler bu if fonksiyonun altındadır.
anlikSure=millis()-tBaslangic;//Anlık süre millis() program süre sayacının, başlangıç süresinden çıkarılması ile bulunur.
SureGoster(anlikSure,0,0);//Anlık süre süre gösterme fonksiyonuna kursör koordinatlarıyla birlikte girilir ve lcd'ye yazdırılır.
durum=1;//durum 1 yapılarak bir sonraki duruma geçilir.
secmebutondurumu=1;
}
if((secmebutondurumu==1 && secmebutonu==0)||(secmebutondurumu==0 && secmebutonu==0)){
//Bu koşullar altında kronometre başlangıç koşulunda saklanır.
secmebutondurumu=0;
break;
//1 durumunda yapılacak işlemler buradadır.
case 1:
if(secmebutondurumu==0 && secmebutonu==1){//Daha önce basılmıyor iken şuanda butona
//basılmışsa yapılacak işlemler bu if fonksiyonun altındadır.
anlikSure=millis()-tBaslangic;
SureGoster(anlikSure,0,0);//Basılan andaki süre son kez lcd'ye yazılır ve süre duruyor ilen bu hep kalır.
secmebutondurumu=1;
durum=2;//durum 2 yapılarak bir sonraki duruma geçilir.
}
if((secmebutondurumu==1 && secmebutonu==0)||(secmebutondurumu==0 && secmebutonu==0)){
secmebutondurumu=0;
anlikSure=millis()-tBaslangic;
SureGoster(anlikSure,0,0);}//Süre ilerliyor iken butona basılmadığı takdirde
//program sürekli buradan geçerek yeni süreyi gösterir
break;
//2 durumunda yapılacak işlemler buradadır.
case 2:
if(secmebutondurumu==0 && secmebutonu==1){//Süre durmuş iken butona bir daha basıldığında
//yapılacak işlemler bu if fonksiyonun altındadır.
lcd.clear();//LCD ekranı temizlenir.
lcd.setCursor(0,0);
lcd.print("Kronometre icin");
lcd.setCursor(0,1);
lcd.print("butona basiniz");
while(digitalRead(butonPin));
durum=0;//Durum 0'lanır
secmebutondurumu=1;
sonOlculenSure=0;
}
if((secmebutondurumu==1 && secmebutonu==0)||(secmebutondurumu==0 && secmebutonu==0)){
//Süre durmuş iken ve butona basılmıyor iken bu kısım gerçekleştirilir.
secmebutondurumu=0;
}
break;
}
lcd.clear();
}
}
/*Bu fonksiyon program boyunca milisaniye olarak kaydedilen değeri uygun bir şekilde kronometre
(Dk:Sn:Sl) formatına dönüştürür, girilen kursör satır ve sütun
bilgisine göre istenilen yere yazdırır.Süre ilk olarak 10'a bölünerek saliseye çevirilir.
Salise olarak kaydedilmiş toplam sürenin mod 100'ünü alırsak gereken
salise hanesini elde ederiz. Mod 6000'nini alıp 100'e bölersek sayının 0'dan sonraki kısmı
tabana yuvarlanacağı için saniye hanesini, aynı şekilde toplam
süreyi 6000'e bölersek de dakika hanesini bulmuş oluruz. Her haneyi 10'a böldüğümzde onlar
basamağını, her hanenin mod 10'unu alırsak da birler basamağını
buluruz. Bu şekilde her karakteri tek tek lcd'ye kolayca yazdırabiliriz.*/
void SureGoster(long sure,int kursorSutun,int kursorSatir){
sure=sure/10;
int salise=sure%100, saliseOnlar=salise/10, saliseBirler=salise%10;
int saniye=(sure%6000)/100, saniyeOnlar=saniye/10, saniyeBirler=saniye%10;
int dakika=sure/6000, dakikaOnlar=dakika/10, dakikaBirler=dakika%10;
lcd.setCursor(kursorSutun,kursorSatir);lcd.print(dakikaOnlar);
lcd.setCursor(kursorSutun+1,kursorSatir);lcd.print(dakikaBirler);
lcd.setCursor(kursorSutun+2,kursorSatir);lcd.print(":");
lcd.setCursor(kursorSutun+3,kursorSatir);lcd.print(saniyeOnlar);
lcd.setCursor(kursorSutun+4,kursorSatir);lcd.print(saniyeBirler);
lcd.setCursor(kursorSutun+5,kursorSatir);lcd.print(":");
lcd.setCursor(kursorSutun+6,kursorSatir);lcd.print(saliseOnlar);
lcd.setCursor(kursorSutun+7,kursorSatir);lcd.print(saliseBirler);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment