7 SEGMENT DISPLAY ILE KRONOMETRE

At, avrat, silah ve ENTEGRE emanet verilmez!
 
C++:
#define a 2
#define b 3
#define c 4
#define d 5
#define e 6
#define f 7
#define g 8
#define dot 9

void setup() {
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(dot, OUTPUT);

  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(dot, HIGH);

}

void loop() {
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(dot, LOW);

  delay(1000);
  clear();

  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(e, LOW);
  digitalWrite(d, LOW);


  delay(1000);
  clear();

  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(g, LOW);
  digitalWrite(d, LOW);
  digitalWrite(dot, LOW);

  delay(1000);
  clear();

  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);


  delay(1000);
  clear();

  digitalWrite(a, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(dot, LOW);

  delay(1000);
  clear();

  digitalWrite(a, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);

  delay(1000);
  clear();

  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(dot, LOW);

  delay(1000);
  clear();

  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);

  delay(1000);
  clear();

  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(dot, LOW);

  delay(1000);
  clear();

}


void clear() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(dot, HIGH);
}

Böyle bir test programı yazdım
 
C++:
#define a 2
#define b 3
#define c 4
#define d 5
#define e 6
#define f 7
#define g 8
#define dot 9

int n = 0;


void segs(int dg) {
  if (dg == 1) {
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
  }

  if (dg == 2) {
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(g, LOW);
    digitalWrite(e, LOW);
    digitalWrite(d, LOW);
  }

  if (dg == 3) {
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(g, LOW);
    digitalWrite(d, LOW);
  }

  if (dg == 4) {
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
  }



  if (dg == 5) {
    digitalWrite(a, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);

  }

  if (dg == 6) {
    digitalWrite(a, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);

  }

  if (dg == 7) {
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);

  }


  if (dg == 8) {

    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);

  }


  if (dg == 9) {
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);

  }
}

void setup() {

  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(dot, OUTPUT);

  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(dot, HIGH);
}

void loop() {
  n++;
  segs(n);
  delay(1000);
  clear();

  if (n > 9) {
    n = 0;
  }
}


void clear() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(dot, HIGH);
}

Bu test programımı biraz daha özelleştirip değişken yazabilir hale geldim.
Şimdi 2 basamağı nasıl ekleyeceğim onu düşünüyorum.

edit:Bu dg voidinin içeriğini "99999999" (<-- 8 tane 9 var) yazmak gibi bir düşünce oluştu ama bu saatlerimi alır daha pratik bir yol düşüneyim
 
Son düzenleme:
Ben string olmayan bir değişkenin uzunluğunu nasıl ölçebilirim.

length veya substring int değişkenin'de işe yaramıyor ya sürekli string'e çevirmem gerekiyor yada başka bir yolu var.

değişken uzunluğunu ölçebilirsem 2. dijite yazabilirim.
 
2. dijite uğraşırken aklımı kaybettim.

Şimdi saniyeyi yazdıracağım diyelim.
Display'e yazdırmak için saniye 9 olana kadar 1 display 0 olarak kalacak saniye 10 olduğunda benim 1 kaydırıp 1-0 yazdırmam lazım.

Bunun iiçin 2 yöntem var aklımda
1- Substring gibi bir komut ile sayıyı diijtlerine bölüp yazdırmak.
2-İlk başta yapmaya çalıştığım gibi Sayı/10 yaparak birler basamağını oluşturmak.
Bu şekilde yapınca sayının kendisi 10'lar basamağı olacak yani 2. dijit sayının / 10 halide birler basamağını oluşturacak.
 
Displayde göstereceğin sayıyı saat formatında düzenleyip en son göstergede görülecek 4 basamaklı değeri displaye göndermek daha kolay olur gibi geliyor bana. Yani saniye ve dakikaları takip eden programı yazdıktan sonra displayde gösterilecek değeri örneğin "int display" değişkenine
"display = saniye + 100*dakika " şeklinde aktarıp bu değişkenin basamak değerlerini belirleyip ekrana göndermek... Genel geçer bir 7 segment display'de sayı gösteren bir program yazdığında ister sayı, ister saat gösterebilirsin. Sayı her güncellendiğinde basamaklara tekrar ayırıp gösterilecek değeri güncellersin.
 
Displayde göstereceğin sayıyı saat formatında düzenleyip en son göstergede görülecek 4 basamaklı değeri displaye göndermek daha kolay olur gibi geliyor bana. Yani saniye ve dakikaları takip eden programı yazdıktan sonra displayde gösterilecek değeri örneğin "int display" değişkenine
"display = saniye + 100*dakika " şeklinde aktarıp bu değişkenin basamak değerlerini belirleyip ekrana göndermek... Genel geçer bir 7 segment display'de sayı gösteren bir program yazdığında ister sayı, ister saat gösterebilirsin. Sayı her güncellendiğinde basamaklara tekrar ayırıp gösterilecek değeri güncellersin.

Abi düzenim hazır aslında nasıl yazdırcağımın mantığını'da kavradım

Toplam 8 tane 7segment'imiz var.
2 Tanesi Saat
2 Tanesi Dakika
2 Tanesi Saniye
2 Tanesi Milisaniye

Bunları transistörler ile seçip veri yazıp tekrarlayacağım bu döngüyü. Fakat.

Sayıyı nasıl ayırıp 2 dijite yazacağım bunu anlayamıyorum /10 yapıp birler basamağını mı alıcam yoksa değişkeni hanelerine mi ayıracağım bunu anlayamıyorum bunu anlayabilirsem projenin büyük kısmını bitirmiş olacağım(ekran tarama ve referans kaynak oluşturma)
 
Birinci mesajdaki arduino kodlarını bir incele.
Ben zaman ayarlı röle devresi yapmıştım.

 
Abi düzenim hazır aslında nasıl yazdırcağımın mantığını'da kavradım

Toplam 8 tane 7segment'imiz var.
2 Tanesi Saat
2 Tanesi Dakika
2 Tanesi Saniye
2 Tanesi Milisaniye

Bunları transistörler ile seçip veri yazıp tekrarlayacağım bu döngüyü. Fakat.

Sayıyı nasıl ayırıp 2 dijite yazacağım bunu anlayamıyorum /10 yapıp birler basamağını mı alıcam yoksa değişkeni hanelerine mi ayıracağım bunu anlayamıyorum bunu anlayabilirsem projenin büyük kısmını bitirmiş olacağım(ekran tarama ve referans kaynak oluşturma)
Sayıyı basamaklarına ayrdırmakta bir problemin olmadığını anlıyorum bu yazdığından, bir taraftan da 8 basamaklı birer artan sayının 8. basamağını zırt pırt tekrar hesaplamak mantıklı değil, bu nedenle benim önerim taca çıkmış oluyor. Bunun yerine:

Displayde göstereceğin sayının basamak değerlerini sakladığın bir array değişken olsun. dispSegment[8], display süren kodun sadece bu değerleri sürmekle uğraşırken. saat formatını düzenleyen kodun her kademeyi(dakika-saat vb.) ayrı ayrı sadece gerektiğinde basamak değerlerine ayırıyor diyelim (milisaniyeyi iki digitte salise olarak takip ediyorsun heralde) dispSegment[] array değişkenine atabilirsin.

milisaniyeUp
basamakları hesapla
dispSegment[0]=milisaniyebasamak0
dispSegment[1]=milisaniyebasamak1

saniyeUp
basamakları hesapla
dispSegment[2]=saniyebasamak0
dispSegment[3]=saniyebasamak1
 
Sayıyı basamaklarına ayrdırmakta bir problemin olmadığını anlıyorum bu yazdığından, bir taraftan da 8 basamaklı birer artan sayının 8. basamağını zırt pırt tekrar hesaplamak mantıklı değil, bu nedenle benim önerim taca çıkmış oluyor. Bunun yerine:

Displayde göstereceğin sayının basamak değerlerini sakladığın bir array değişken olsun. dispSegment[8], display süren kodun sadece bu değerleri sürmekle uğraşırken. saat formatını düzenleyen kodun her kademeyi(dakika-saat vb.) ayrı ayrı sadece gerektiğinde basamak değerlerine ayırıyor diyelim (milisaniyeyi iki digitte salise olarak takip ediyorsun heralde) dispSegment[] array değişkenine atabilirsin.

milisaniyeUp
basamakları hesapla
dispSegment[0]=milisaniyebasamak0
dispSegment[1]=milisaniyebasamak1

saniyeUp
basamakları hesapla
dispSegment[2]=saniyebasamak0
dispSegment[3]=saniyebasamak1
"Pişmiş aşa su katma" Ahmet.
Bana öneride bulunmayı bırak. Kendi kodlarına odaklan. Ben belki sana fikir verir diye paylaştım konuyu.
Yoksa bitmiş gitmiş konu, kurcalama. :katil2:
 
iki basamaklı bir sayının basamaklarını nasıl elde edeceğini mi soruyorsun? Soru buysa bununla iligli bir kod paylaşmıştım:


Ama her zaman iki basamak olacaksa iş daha kolay. Onlar basamağını 10 a bölümüdür, birler basamağını da 10'a bölümden kalandır.

C++:
int sayi = 73;

int onlar = sayi / 10;
int birler = sayi % 10;
 
iki basamaklı bir sayının basamaklarını nasıl elde edeceğini mi soruyorsun? Soru buysa bununla iligli bir kod paylaşmıştım:


Ama her zaman iki basamak olacaksa iş daha kolay. Onlar basamağını 10 a bölümüdür, birler basamağını da 10'a bölümden kalandır.

C++:
int sayi = 73;

int onlar = sayi / 10;
int birler = sayi % 10;
Aklıma gelen yolda buydu daha doğrusu varmı diye çırpınıyorum.

Aklıma gelen daha doğrusu substring gibi birşey ile parçalamak değişkeni.
 
Konuyu toparlama vakti geldi konu çok dağıldı.
Bu bir toparlama mesajıdır.

Öncelikle projemiz 8 dijitten oluşan bir kronometre ,frekans sayacı ve saat projesi yani 3 in 1 diyebiliriz.

Projenin temelini işlemci içinde bulunan timerların birinden ürettiğimiz 10mS'de bir kez oluşacak bir kesme.
Bu kesme içinde yaptırdığımız hesaplar ile ortaya saniye, dakika ve saat çıkarıyoruz.

Bu çıkardığımız saniye, dakika ve saat'i 8 adet 7 segment displaye anlamlı düzenli insan gözünü rahatsız etmeyecek bir şekilde yazdırmayı planlıyoruz.

Ayrıca kronometreyi başlatmak durdurmak ve sıfırlamak için 3 adet butonumuz'da bulunuyor.

Şuana kadar kat ettiğim gelişmeler şu şekilde.

Refererans oluşturma

7 Segment display 0-9 sayıcı

İnt tipindeki değişkeni 7 Segment display'e yazdırma

Devam ediyor...
 
Sayıyı basamaklarına ayrdırmakta bir problemin olmadığını anlıyorum bu yazdığından, bir taraftan da 8 basamaklı birer artan sayının 8. basamağını zırt pırt tekrar hesaplamak mantıklı değil, bu nedenle benim önerim taca çıkmış oluyor. Bunun yerine:

Displayde göstereceğin sayının basamak değerlerini sakladığın bir array değişken olsun. dispSegment[8], display süren kodun sadece bu değerleri sürmekle uğraşırken. saat formatını düzenleyen kodun her kademeyi(dakika-saat vb.) ayrı ayrı sadece gerektiğinde basamak değerlerine ayırıyor diyelim (milisaniyeyi iki digitte salise olarak takip ediyorsun heralde) dispSegment[] array değişkenine atabilirsin.

milisaniyeUp
basamakları hesapla
dispSegment[0]=milisaniyebasamak0
dispSegment[1]=milisaniyebasamak1

saniyeUp
basamakları hesapla
dispSegment[2]=saniyebasamak0
dispSegment[3]=saniyebasamak1
Şimdilik olacağını düşündüğüm yol ile devam ediyorum o zaman / 10 yaparak birler basamağını oalcağım onlar basamağı'da sayının kendisi olacak zaten yüzler basamağım yok her paramatere için 2 tane 7 segment ekranım var
 
Şimdilik olacağını düşündüğüm yol ile devam ediyorum o zaman / 10 yaparak birler basamağını oalcağım onlar basamağı'da sayının kendisi olacak zaten yüzler basamağım yok her paramatere için 2 tane 7 segment ekranım var

Hesabı doğru anlamamışsın. Birler basamağı zaman / 10 değil yukarıdaki mesajı tekrar incele.
 
C++:
#define a 2
#define b 3
#define c 4
#define d 5
#define e 6
#define f 7
#define g 8
#define dot 9

#define seg0 10 //seg0
#define seg1 11 //seg1

int n = 0;

bool flg = 0;


void segs(int dg) {

  if (dg == 0) {
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
  }

  if (dg == 1) {
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
  }

  if (dg == 2) {
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(g, LOW);
    digitalWrite(e, LOW);
    digitalWrite(d, LOW);
  }

  if (dg == 3) {
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(g, LOW);
    digitalWrite(d, LOW);
  }

  if (dg == 4) {
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
  }



  if (dg == 5) {
    digitalWrite(a, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);

  }

  if (dg == 6) {
    digitalWrite(a, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);

  }

  if (dg == 7) {
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);

  }


  if (dg == 8) {

    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);

  }

  if (dg == 9) {
    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);

  }
}

void setup() {

  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(dot, OUTPUT);


  pinMode(seg0, INPUT_PULLUP);
  pinMode(seg1, INPUT_PULLUP);
  pinMode(seg0, OUTPUT);
  pinMode(seg1, OUTPUT);

  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(dot, HIGH);

  digitalWrite(seg0, HIGH);
  digitalWrite(seg1, HIGH);
}

void loop() {

  if (flg == 0) {
    digitalWrite(seg0, LOW);
    digitalWrite(seg1, HIGH);
    segs(n);
    delay(350);
    n++;
    delay(100);
    clear();
    digitalWrite(seg0, HIGH);
    if (n > 9) {
      n = 0;
      flg = 1;
    }
  }




  if (flg == 1) {
    digitalWrite(seg0, HIGH);
    digitalWrite(seg1, LOW);
    segs(n);
    delay(350);
    n++;
    delay(100);
    clear();
    digitalWrite(seg1, HIGH);
    if (n > 9) {
      n = 0;
      flg = 0;
    }
  }

}


void clear() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(dot, HIGH);
}

Aynı sayıcıyı paralel 7 segmanlara'da yazdırmayı başardın BC557 ile seçim yapıyorum.
 
IMG_20220624_165341.jpg

Hızlı seçim yaparak paralel segmanlarw farklı sayılar çıkarttım.

C++:
digitalWrite(seg0, HIGH);
  digitalWrite(seg1, LOW);

  segs(3);
  clear();
 
  digitalWrite(seg0, LOW);
  digitalWrite(seg1, HIGH);

  segs(5);
  clear();
 

Ben neden böyle dünya kadar atamalar yaptım ki?
Array ile kolaymış bu.

Kod:
int disp[] = {2,3,4,5,6,7,8,9};

void setup() {
  for(int d = 0; , d < 9 ; d++){
  pinMode(disp[d], OUTPUT);
  }

    for(int s = 0; , s < 9 ; s++){
    digitalWrite(disp[d], HIGH);
  }

}

Böyle şeyler yaptım sitede verdiği örneklerden yola çıkarak böyle daha kısa oluyor diğer türlü her taraf digitalWrite pinMode dolu kafam karışıyor o kadar tekrarı görünce
 
Son düzenleme:

Çevrimiçi personel

Forum istatistikleri

Konular
6,986
Mesajlar
119,329
Üyeler
2,835
Son üye
alpermete

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top