#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();
}
Sağolun hocam geçen haftalarda baktığımda çok pahalıydı ben de kendim yaparım demiştim çok iyi oldu.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:
Kullandım.
- Arduino Uno (klon)
- 16x2 i2C LCD.
- 2 adet buton.
- 2 adet 10k direnç.
- Jumper ve minik breadboard.
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.
Tamamdır hocam vakit bulursam denerim.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.
#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);
}
LCD_I2C kütüphanesini eklemelisiniz.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?
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?
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?
ı2c modülü yok ldcye o yüzden yazı gelmiyor galiba linki varsa atabilir misinizA4 ve A5 pinleri sda ve scl pinleridir tabii bu Uno kartında geçerli.
Ayrıca ekranınız için ı2C modülü var mı arkasında.