Arduino ile satranç saati denemesi

Katılım
28 Kasım 2020
Mesajlar
4.295
Makaleler
2
Çözümler
73
Daha fazla  
Cinsiyet
Erkek
Selamünaleyküm cümleten.

Son zamanlarda satranca sarmıştım, sağ olsun YouTube durur mu her yer satranç maçlarıyla doldu ama neyse ki bu durumdan şikayetçi değilim.

Turnuva maçlarında kullanılan saat dikkatimi çekti ve kendi kendime "acaba yapabilir miyim?" dedim ve işe koyuldum ortaya oldukça ilkel bir şey çıktı paylaşmak istedim.

Malzeme olarak:
  • Arduino Uno (klon)
  • 16x2 i2C LCD.
  • 2 adet buton.
  • 2 adet 10k direnç.
  • Jumper ve minik breadboard.
Kullandım.
Ayrıca az önce baktim satranç saatleri de öyle ucuz şeyler değilmiş.
Kodu aşağıda paylaşıyorum kod hakkında yorum yaparsanız işte "şu şu şekilde daha iyi olabilirdi.", "şunun yerine bunu kullansan daha kolay olurdu." vb. gibi yorumlar bana çok şey katar.

C++:
#include <LCD_I2C.h>
LCD_I2C lcd(0x27, 16, 2);

#define but1 2
#define but2 3

bool but1_state;

int min = 29;
int sec = 60;
int min2 = 29;
int sec2 = 60;

unsigned long new_time;
unsigned long old_time;

void timer1() {

 if (digitalRead(but1) == 1) {
 but1_state = !(but1_state);
 while (digitalRead(but1) == 1) {
 delay(100);
 if (digitalRead(but1) == 0)
 break;
 }
 }

 if (digitalRead(but2) == 1) {
 but1_state = !(but1_state);
 while (digitalRead(but2) == 1) {
 delay(100);
 if (digitalRead(but2) == 0)
 break;
 }
 }
 switch (but1_state) {

 case 0:
 lcd.setCursor(9, 0);
 lcd.print("min");
 lcd.setCursor(13, 0);
 lcd.print("sec");

 lcd.setCursor(0, 0);
 lcd.print("min");
 lcd.setCursor(4, 0);
 lcd.print("sec");

 new_time = (millis() / 1000);
 if (old_time < new_time) {
 sec2--;
 old_time = new_time;
 lcd.clear();
 }

 if (sec2 < 1) {
 min2--;
 sec2 = 60;
 }

 lcd.setCursor(9, 1);
 lcd.print(min2);
 lcd.setCursor(13, 1);
 lcd.print(sec2);

 lcd.setCursor(0, 1);
 lcd.print(min);
 lcd.setCursor(4, 1);
 lcd.print(sec);

 break;

 case 1:
 lcd.setCursor(0, 0);
 lcd.print("min");
 lcd.setCursor(4, 0);
 lcd.print("sec");

 lcd.setCursor(9, 0);
 lcd.print("min");
 lcd.setCursor(13, 0);
 lcd.print("sec");

 new_time = (millis() / 1000);
 if (old_time < new_time) {
 sec--;
 old_time = new_time;
 lcd.clear();
 }

 if (sec < 1) {
 min--;
 sec = 60;
 }

 lcd.setCursor(0, 1);
 lcd.print(min);
 lcd.setCursor(4, 1);
 lcd.print(sec);

 lcd.setCursor(9, 1);
 lcd.print(min2);
 lcd.setCursor(13, 1);
 lcd.print(sec2);

 break;
 }
}

void setup() {
 lcd.begin();
 lcd.backlight();
 pinMode(but1, INPUT);
 pinMode(but2, INPUT);

}

void loop() {
 timer1();

}

IMG_20240407_234028.jpg


Projenin son hali: Rehber: Arduino ile satranç saati nasıl yapılır?
 
Son düzenleyen: Moderatör:
Selamünaleyküm cümleten.

Son zamanlarda satranca sarmıştım, sağ olsun YouTube durur mu her yer satranç maçlarıyla doldu ama neyse ki bu durumdan şikayetçi değilim.

Turnuva maçlarında kullanılan saat dikkatimi çekti ve kendi kendime "acaba yapabilir miyim?" dedim ve işe koyuldum ortaya oldukça ilkel bir şey çıktı paylaşmak istedim.

Malzeme olarak:
  • Arduino Uno (klon)
  • 16x2 i2C LCD.
  • 2 adet buton.
  • 2 adet 10k direnç.
  • Jumper ve minik breadboard.
Kullandım.
Ayrıca az önce baktim satranç saatleri de öyle ucuz şeyler değilmiş.
Kodu aşağıda paylaşıyorum kod hakkında yorum yaparsanız işte "şu şu şekilde daha iyi olabilirdi.", "şunun yerine bunu kullansan daha kolay olurdu." vb. gibi yorumlar bana çok şey katar.

C++:
#include <LCD_I2C.h>
LCD_I2C lcd(0x27, 16, 2);

#define but1 2
#define but2 3

bool but1_state;

int min = 29;
int sec = 60;
int min2 = 29;
int sec2 = 60;

unsigned long new_time;
unsigned long old_time;

void timer1() {

 if (digitalRead(but1) == 1) {
 but1_state = !(but1_state);
 while (digitalRead(but1) == 1) {
 delay(100);
 if (digitalRead(but1) == 0)
 break;
 }
 }

 if (digitalRead(but2) == 1) {
 but1_state = !(but1_state);
 while (digitalRead(but2) == 1) {
 delay(100);
 if (digitalRead(but2) == 0)
 break;
 }
 }
 switch (but1_state) {

 case 0:
 lcd.setCursor(9, 0);
 lcd.print("min");
 lcd.setCursor(13, 0);
 lcd.print("sec");

 lcd.setCursor(0, 0);
 lcd.print("min");
 lcd.setCursor(4, 0);
 lcd.print("sec");

 new_time = (millis() / 1000);
 if (old_time < new_time) {
 sec2--;
 old_time = new_time;
 lcd.clear();
 }

 if (sec2 < 1) {
 min2--;
 sec2 = 60;
 }

 lcd.setCursor(9, 1);
 lcd.print(min2);
 lcd.setCursor(13, 1);
 lcd.print(sec2);

 lcd.setCursor(0, 1);
 lcd.print(min);
 lcd.setCursor(4, 1);
 lcd.print(sec);

 break;

 case 1:
 lcd.setCursor(0, 0);
 lcd.print("min");
 lcd.setCursor(4, 0);
 lcd.print("sec");

 lcd.setCursor(9, 0);
 lcd.print("min");
 lcd.setCursor(13, 0);
 lcd.print("sec");

 new_time = (millis() / 1000);
 if (old_time < new_time) {
 sec--;
 old_time = new_time;
 lcd.clear();
 }

 if (sec < 1) {
 min--;
 sec = 60;
 }

 lcd.setCursor(0, 1);
 lcd.print(min);
 lcd.setCursor(4, 1);
 lcd.print(sec);

 lcd.setCursor(9, 1);
 lcd.print(min2);
 lcd.setCursor(13, 1);
 lcd.print(sec2);

 break;
 }
}

void setup() {
 lcd.begin();
 lcd.backlight();
 pinMode(but1, INPUT);
 pinMode(but2, INPUT);

}

void loop() {
 timer1();

}

Eki Görüntüle 2162262

Projenin son hali: Rehber: Arduino ile satranç saati nasıl yapılır?
Sağolun hocam geçen haftalarda baktığımda çok pahalıydı ben de kendim yaparım demiştim çok iyi oldu.
 
Sağ olun hocam geçen haftalarda baktığımda çok pahalıydı ben de kendim yaparım demiştim çok iyi oldu.

Sevindim hocam, ben de öyle kendimi denemek için yapmıştım. Bu haliyle oldukça işlevsel sadece başta zamanı koddan ayarlamak lazım, koddan dolayı direkt saatin sağ tarafı işlemeye başlıyor o taraf beyaz olmalı. Kodum tamamen açık kaynaklı dilediğiniz gibi geliştirin sizin için de güzel bir temel olur herhalde.

Size birkaç geliştirme tavsiyesi de verebilirim. Mesela bir tarafın süresi bitince bir buzzer bunu söyleyebilir, şu anki haliyle süre bitince eksiye düşecek. Ayrıca direkt iki taraftan birinin başlamaması için while döngüsü ve bir anahtar kullanarak, anahtar açılınca beyaz tarafın süresi başlatılabilir.
 
Sevindim hocam, ben de öyle kendimi denemek için yapmıştım. Bu haliyle oldukça işlevsel sadece başta zamanı koddan ayarlamak lazım, koddan dolayı direkt saatin sağ tarafı işlemeye başlıyor o taraf beyaz olmalı. Kodum tamamen açık kaynaklı dilediğiniz gibi geliştirin sizin için de güzel bir temel olur herhalde.

Size birkaç geliştirme tavsiyesi de verebilirim. Mesela bir tarafın süresi bitince bir buzzer bunu söyleyebilir, şu anki haliyle süre bitince eksiye düşecek. Ayrıca direkt iki taraftan birinin başlamaması için while döngüsü ve bir anahtar kullanarak, anahtar açılınca beyaz tarafın süresi başlatılabilir.
Tamamdır hocam vakit bulursam denerim.
 

Düzenleme ve Eklemeler

  • Kod satırlarına açıklamalar eklendi
  • Sürenin bir anahtar yardımıyla başlatılıp durdurulması eklendi
C++:
#include <LCD_I2C.h>       // LCD için I2C kütüphanesini içe aktar
LCD_I2C lcd(0x27, 16, 2);  // LCD ye isim ver ve parametreleri gir (4 satırlı için 16,4 yazılmalı)

#define but1 2   // but1 adlı değişken oluştur ve 2 numaralı pine ata (ilk buton)
#define but2 3   // but2 adlı değişken oluştur ve 3 numaralı pine ata (ikinci buton)
#define swtch 4  // swtch adlı değişken oluştur ve 4numaralı pine ata (başlatma anahtarı)

bool but1_state;  // Rakipler arası geçiş için bool tipinde but1_state adında bir değişken ata


int min = 30;   // İlk rakibin dakikası
int sec;        // İlk rakibin saniyesi
int min2 = 30;  // İkinci rakibin dakikası
int sec2;       // İkinci rakibin saniyesi

unsigned long new_time;  // millis fonksiyonu ile çalışabilmek için büyük veri tutabilen unsigned long tipinde iki değişken atandı
unsigned long old_time;

void timer1() {  // timer1 adında özel bir fonksiyon tanımlandı

  while (digitalRead(swtch) == 1) {     // anahtara bağlı olan bir while döngüsü süreyi başlatır ve durdurur
    if (digitalRead(but1) == 1) {       // but1 den gelen veriyi oku eğer 1 e eşitse (butona basılmışsa)
      but1_state = !(but1_state);       // but1_state değerini tersine çevir (0 ise 1, 1 ise 0 yap)
      while (digitalRead(but1) == 1) {  // eğer butona basılmaya devam ediliyorsa döngüye al
        delay(100);                     // 100 ms bekle
        if (digitalRead(but1) == 0)     // eğer butona artık basılmıyorsa
          break;                        // döngüden çık
      }
    }

    if (digitalRead(but2) == 1) {       // but2 den gelen veriyi oku eğer 1 e eşitse (butona basılmışta)
      but1_state = !(but1_state);       // but1_state değerini tersine çevir
      while (digitalRead(but2) == 1) {  // eğer halen düğmeye basılıyorsa döngüye al
        delay(100);                     // 100 ms bekle
        if (digitalRead(but2) == 0)     // eğer artık butona basılmıyorsa
          break;                        // döngüden çık
      }
    }
    switch (but1_state) {  // but1_state değişkeni ile bir switch-case zinciri oluştur

      case 0:                 // but1_state değeri 0 ise
        lcd.setCursor(9, 0);  // lcd nin 0. yani il satırının 9. sütunundan başlayarak "min" yaz
        lcd.print("min");
        lcd.setCursor(13, 0);  // lcd nin 0. yani il satırının 13. sütunundan başlayarak "sec" yaz
        lcd.print("sec");

        lcd.setCursor(0, 0);  // lcd nin 0. yani il satırının 0. sütunundan başlayarak "min" yaz
        lcd.print("min");
        lcd.setCursor(4, 0);  // lcd nin 0. yani il satırının 4. sütunundan başlayarak "sec" yaz
        lcd.print("sec");

        new_time = (millis() / 1000);  // millis fonksiyonundan gelen ms değerini saniyeye çevirip new_time değişkenine ata
        if (old_time < new_time) {     // eğer old_time değişkeni new_time değişkeninden küçükse
          sec2--;                      // sec2 değişkenini 1  azalat
          old_time = new_time;         // ve old_time değişkenini new_time değişkenine eşitle (bu sayede old_time hep new_time dan küçük olacak)
          lcd.clear();                 // lcd ekrandaki yazıları temizle (olası görüntü hatalrını gidermek için)
        }

        if (sec2 < 1) {  // eğer sec2 değeri 1 den küçükse
          min2--;        // min değerini 1 azalt
          sec2 = 60;     // ve sec2 değerini 60 yap (dakika-saniye döngüsü)
        }

        lcd.setCursor(9, 1);  // lcd nin 1. yani ikinci satırının 9. sütunundan başlayarak "min2 değişkenini" yaz
        lcd.print(min2);
        lcd.setCursor(13, 1);  // lcd nin 1. yani ikinci satırının 13. sütunundan başlayarak "sec2 değişkenini" yaz
        lcd.print(sec2);

        lcd.setCursor(0, 1);  // lcd nin 1. yani ikinci satırının 0. sütunundan başlayarak "min değişkenini" yaz
        lcd.print(min);
        lcd.setCursor(4, 1);  // lcd nin 1. yani ikici satırının 4. sütunundan başlayarak "sec değişkenini" yaz
        lcd.print(sec);

        break;  // switch-case yapısında case0 işleminin bir alt işlem olan case1 e geçmesini önleyen break komutu (eğer konulmazsa case0 içinde case1 de çalışır)

      case 1:                 // but1_state değeri 1 ise
        lcd.setCursor(0, 0);  // lcd nin 0. yani il satırının 0. sütunundan başlayarak "min" yaz
        lcd.print("min");
        lcd.setCursor(4, 0);  // lcd nin 0. yani il satırının 4. sütunundan başlayarak "sec" yaz
        lcd.print("sec");

        lcd.setCursor(9, 0);  // lcd nin 0. yani il satırının 9. sütunundan başlayarak "min" yaz
        lcd.print("min");
        lcd.setCursor(13, 0);  // lcd nin 0. yani il satırının 13. sütunundan başlayarak "sec" yaz
        lcd.print("sec");

        new_time = (millis() / 1000);  // new_time değişkenine millisden gelen ms değerini saniye yapıp ata
        if (old_time < new_time) {     // eğer old_time küçükse new_time dan
          sec--;                       // sec değerini 1 azalt
          old_time = new_time;         // ve old_time değirini new_time değerine ata (bu sayde old newden hep küçük olur)
          lcd.clear();                 // alası görünüm sorunlarının önüne geçmek için lcd ekranı temizle
        }

        if (sec < 1) {  // eğer sec değeri 1 den küçükse
          min--;        // min değerini 1 azalt
          sec = 60;     // ve sec değerini 60 yaz (dakika-saniye döngsüsü)
        }

        lcd.setCursor(0, 1);  // lcd nin 1. yani ikinci satırının 0. sütunundan başlayarak "min değişkenini" yaz
        lcd.print(min);
        lcd.setCursor(4, 1);  // lcd nin 1. yani ikinci satırının 4. sütunundan başlayarak "sec değişkenini" yaz
        lcd.print(sec);

        lcd.setCursor(9, 1);  // lcd nin 1. yani ikinci satırının 9. sütunundan başlayarak "min2 değişkenini" yaz
        lcd.print(min2);
        lcd.setCursor(13, 1);  // lcd nin 1. yani ikinci satırının 13. sütunundan başlayarak "sec2 değişkenini" yaz
        lcd.print(sec2);


        break;
    }
  }
}


void setup() {
  lcd.begin();            // lcd ekranı başlat
  lcd.backlight();        // lcd ekranın arka ışığını yak
  pinMode(but1, INPUT);   // but1 değişkenini giriş olarak ata
  pinMode(but2, INPUT);   // but2 değişkenini giriş olarak ata
  pinMode(swtch, INPUT);  // swtch değişkenini giriş olarak ata
}

void loop() {
  timer1();  // timer1 fonksiyonunu başlat

  lcd.setCursor(9, 0);  // bunların ne işe yaradığını daha önce yazdım :D
  lcd.print("min");
  lcd.setCursor(13, 0);
  lcd.print("sec");

  lcd.setCursor(0, 0);
  lcd.print("min");
  lcd.setCursor(4, 0);
  lcd.print("sec");

  lcd.setCursor(0, 1);
  lcd.print(min);
  lcd.setCursor(4, 1);
  lcd.print(sec);

  lcd.setCursor(9, 1);
  lcd.print(min2);
  lcd.setCursor(13, 1);
  lcd.print(sec2);
}

Projenin son hali: Rehber: Arduino ile satranç saati nasıl yapılır?

IMG_20240409_014942.jpg
IMG_20240409_014956.jpg
 
Son düzenleyen: Moderatör:
Benim 2x16 LCD ekran var RS RW pinlerini a4A5'e bağladım sda scl omadığı için ekrana yazı düşmüyor nasıl halledebilirim?
 
C:\Users\erenc\Documents\Arduino\libraries\LCD_I2C\src/LCD_I2C.h:58:7: Note: Candidate expects 1 argument, 3 provided.
Exit status 1
No matching function for call to 'lcd_ı2C: Lcd_ı2C(int, int, int)'
Bu hatayı veriyor hangi kütüphaneyi eklemek lazım?
LCD_I2C kütüphanesini eklemelisiniz.
 
Benim 2x16 LCD ekran var RS RW pinlerini a4A5'e bağladım sda scl omadığı için ekrana yazı düşmüyor nasıl halledebilirim?

A4 ve A5 pinleri sda ve scl pinleridir tabii bu Uno kartında geçerli.

Benim 2x16 LCD ekran var RS RW pinlerini a4A5'e bağladım sda scl omadığı için ekrana yazı düşmüyor nasıl halledebilirim?

Ayrıca ekranınız için ı2C modülü var mı arkasında.
 

Geri
Yukarı