Eğitim Şart

Taşı delen suyun şiddeti değil sürekliliğidir!…

Arduino ve 74HC595 ile Mutfak Saati

Arduino ve 74HC595 İle Mutfak Saati...

Bu projemizde bir mutfak saati tasarladık. Bunun için bir Arduino, iki binary counter olan 74HC595 (shift register)ve bu sayaçlara bağlı iki adet 7-segment display ile, bir LED, bir buzzer, bir buton ve bolca jumper kablo.

Önce devre şemamız:

Devre Semasi

74HC595 entegre devresinin görseli aşağıdaki gibi.

595 bacak bağlantı

16 bacaklı entegrenin 8 numaralı bacağı gnd’ye, 16 numaralı bacağı da +5 Volta bağlanıyor. Q0-Q7 çıkış bacakları. Q7’ bacağı seri çıkış için kullanılıyor. 10 numaralı bacak MR (Master Reclear) reset işlemi için kullanılıyor. Çalışması için LOW = 0 olmalı. Devre dışı bırakmak için +5 Volta bağlanıyor. 11 numaralı bacak SH_CP (Shift register clock) 595 in clock sinyali aldığı bacak. (555 entegresini anlatırken dijital elektronikte bir saat girişine ihtiyacımız olduğu anlatılmıştı). 12 numaralı bacak ST_CP (Storage register clock pin (latch pin: mandallama bacağı da deniyor). 13 numaralı bacak (Output enable) çıkışın aktif edilmesini sağlayan bacak. Bu bacak da LOW=0 iken aktif durumda. Ama biz sürekli çıkış almak için 13 numaralı bacağı gnd’ye bağlıyoruz.  14 numara 595 in seri data girişinin yapıldığı bacak. Bizim projemizde de iki tane 595 kullandığımız için ikinci 595 in data girişi (14 numaralı pin), birinci 595 in seri data çıkışı (9 numaralı pin) oluyor. Daha fazla 595 kullansaydık bunların her birinin data girişi, bir öncekinin seri data çıkışına bağlanacaktı. Arduino ile 595 kontrol edilirken sadece 11, 12 ve 14 numaralı bacaklar Arduino’ya bağlanıyor.

Arduino ve 74HC595 örneklerine baktığımızda genelde çıkış bacaklarına LED’ler bağlayarak “kara şimşek” gibi LED’leri belirli düzende çalıştıran devrelerden bulmamız çok kolay. Bu projede de benzer şekilde sayıların ikili (binary) sistemdeki karşılıklarını bularak 595’e bunları saydıracağız. Bu şekilde bir 7-segment driver’a da ihtiyaç duyulmayacak.

595 ikili sisteme göre bir sayaç. Yani tüm dijital sistemlerde olduğu gibi sadece 1  (HIGH) ve 0 (LOW) sayıları var. Öncelikle biz de sayılarımızı ikilik sisteme çevirmeliyiz. Normalde kullandığımız sayı sistemi ondalık (yani 0-9 arasındaki sayılar). Ondalık sistemde basamaklarla sayı değeri arasındaki ilişki 10’un kuvvetleri şeklinde. Örneğin 386 sayısının karşılığını:

3*102+ 8*101+ 6*100

= 3*100+ 8* 10+ 6*1

= 300+ 80+ 6

= 386

olarak  buluyoruz. O yüzden 6; birler basamağındaki sayı, 8; onlar basamağındaki sayı, 3; yüzler basamağındaki sayı adını alıyor. İkili sistemde de 10 üzeri yerine 2 üzeri, çarpan olarak geliyor. Örnek olarak ikili sistemdeki 1011 sayısının karşılığı:

1*23+ 0*22+ 1*21+ 1*20

=1*8+ 0*4+ 1*2+ 1*1

= 8+ 0+ 2+ 1

= 11

Oluyor. Burada en sağdaki 1; birler (20)basamağındaki sayı, solundaki 1; ikiler (21)basamağındaki sayı, onun solundaki 0; dörtler(22) basamağındaki sayı, en soldaki 1 ise sekizler (23) basamağındaki sayı oluyor. Basamak sayısı daha fazla olsaydı onaltılar, otuzikiler, altmışdörtler,… şeklinde  devam ederdi.

Neden bu kadar ayrıntıya girdik? Çünkü, 7-segment displeyde yazdırmak istediğimiz rakamın ikilik sistemindeki karşılığını bilmek zorundayız. Bu display adı üzerinde 7 tane LED’den oluşuyor. Her biri ayrı birer basamak olduğuna göre biz 7 basamak kullanacağız ve bunlar 595’in Q0-Q6 çıkışları.

Adsız

Örneğin displeyde “1” yazdırmak istiyorsak; sadece b ve c segmentleri (LED’leri) yanmalı.

Bu projede ortak katotlu display kullandık. Dolayısıyla 595 sadece bu basamakların pinlerine (b ve c) 1, diğer tüm pinlere 0 yollamalı. O nedenle “1” yazdırabilmek için:

a: 0*20 = 0

b: 1*21 = 2

c: 1*22 = 4

d: 0*23 = 0

e: 0*24 = 0

f: 0*25 = 0

g: 0*26 = 0

Ve toplam = 6. Yani displeyde (ortak katotlu) 1 sayısının ondalık karşılığı 6 dır. Eğer ortak katot kullansaydık sadece b ve c’nin yanması için buralara 0=LOW gelmeli, diğer tüm pinler 1=HIGH olmalıydı. Onun ondalık karşılığını da siz hesaplayabilirsiniz. Tüm sayılar için ondalık karşılıklar aşağıdaki tabloda verilmiştir. Sanırım yeterince açık oldu. 🙂

binary-decimal

7-segment kullanırken LED yaktığımızı unutmayalım. Her bir segment bir LED olduğu için 330R direnç kullandık. Bu direnç LED’leri korumak için akımı sınırlandırıyor. Hepsi için tek LED kullanılamaz mıydı? LED’leri korumak için evet. Ama düşünsenize DP de tek LED yanıyor, 1 sayısı için 2 LED (b ve c). Ama 8 yazdırabilmek için 7 LED birden yanmalı. Tüm bu durumlar için tek direnç kullanılırsa sayılar değiştiğinde parlaklıklar da değişecekti. Bunu istemeyiz.

seven segment bacak dirençli

Sayaçların başlangıç değerleri için potansiyometreler(pot) kullanıldı. Bu potansiyometrelerin orta uçları Arduino’nun iki analog girişine bağlanırken, diğer uçları gnd ve +5 Volta bağlandı. Kodda fark edileceği üzere burada okunan değer “map” komutuyla 0-9 arasına dönüştürüldü. Böylelikle iki potun yardımıyla iki basamaklı sayımızı ayarlayabildik.  Bu işlemden sonra bir buton yardımıyla geri sayımı başlattık. Aslında geri sayım yapmadık, ileri sayım yaptık. Ama hazırladığımız dizi ile Arduino’yu kandırdık. (Sayıları 0-9 arası yerine 9-0 arası yerleştirdik diziye). Bir döngü ile sayıları iki basamaklı olarak saydırdık. Aradaki “delay” komutu ile sayma zamanı belirlenmeli. Burada ilerlemeyi görebilmek için toplam 500 milisaniyede bir sayıyor. Bu mutfaktaki kullanıcı için anlamsız! 60 saniyede bir saymalı ki displeyde gördüğümüz sayılar dakikaları ifade etsin. Saat/dakika ayrımı yapmadığım için iki basamak kullanıcıya 99 dakikaya kadar uzatılabilen bir süre veriyor. Sanırım yapılacak yemek/börek için yeterli bir süre. Yetmeyeceğini düşünüyorsanız bir basamak daha eklemek mümkün. O zaman bir basamak saate ayrılıp, diğer iki basamak dakika olarak da düşünülebilir.

Sayaç sıfırladığında koda göre 5 kez uzun aralıklı, 5 kez de kısa aralıklı olarak buzzer sinyali var. Bu da sadece prototip. Ben bu projeyi tamamladığımda 10 ya da 20 kez uzun aralıklı, sistem kapatılana kadar da kısa aralıklı uyarı sinyali yapacağım.

Gelelim koda:

/*https://www.arduino.cc/en/Tutorial/ShiftOut

74HC595 Baglantilari:
_______
Q1     |1  * 16| Vcc PINS 1-7, 15 Q0 – Q7 Cikis pinleri
Q2    |2     15| Q0 PIN 8 GND
Q3    |3     14| DS PIN 9 Q7″ Seri Cikis
Q4    |4    13| OE PIN 10 MR Ana reset
Q5    |5    12| ST_CP PIN 11 SH_CP Saat pini
Q6    |6    11| SH_CP PIN 12 ST_CP Depo kayit saat pini (latch pin)
Q7    |7    10| MR PIN 13 OE Cikis Aktif
GND|8___9| Q7″ PIN 14 DS Seri Giris
PIN 16 Vcc +5V
_______
LED Q1-|1  * 16|-5V
LED Q2-|2     15|-LED Q0
LED Q3-|3     14|-PIN 11
LED Q4-|4     13|-GND
LED Q5-|5     12|-PIN 8
LED Q6-|6    11|-PIN 12
DOT Q7-|7    10|-5V
GND-     |8__9|-(ikinci 595 için:BOS. Birinci 595 in 9 nolu bacağı(seri çıkış) ikinci 595 in 14 numaralı bacağına (seri giriş) bağlanacak

*/
int latchPin = 8; // 74HC595 in ST_CP sinin Arduinoya baglantisi
int clockPin = 12; //74HC595 in SH_CP sinin Arduinoya baglantisi
int dataPin = 11; //74HC595 DS inin Arduinoya baglantisi
int sayac = 5; // saniyede bir kez yanan “DP” ler
int buzzer = 6;
int i; int j;
int k[10] = {111, 127, 7, 125, 109, 102, 79, 91, 6, 63}; // dizi icerisine sayıları tersten yazdık 9-0
byte SegDisplay0;
byte SegDisplay1;
int sensorPin0= A0; // potlardan gelen okuma pini
int sensorPin1= A1; // potlardan gelen okuma pini
byte ZERO = 63 ; // Displaydeki her bir sayinin ondalik karsiliginin set edilmesi.
byte ONE = 6;
byte TWO = 91;
byte THREE = 79;
byte FOUR = 102;
byte FIVE = 109;
byte SIX = 125;
byte SEVEN = 7;
byte EIGHT = 127;
byte NINE =111;
int startPin = 7 ;
void setup() {

pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(startPin, INPUT);
}

void loop() {

int analogueValue0 = analogRead(sensorPin0); //pottan bilgi okundu (0)
analogueValue0 = map(analogueValue0, 0, 1023, 0, 10); // okunan değer 0-9 aralığına dönüştü
int analogueValue1 = analogRead(sensorPin1); //pottan bilgi okundu(1)
analogueValue1 = map(analogueValue1, 0, 1023, 0, 10); // okunan değer 0-9 aralığına dönüştü
if (analogueValue0==0) {SegDisplay0=ZERO; i=9; } // display – 1 için okunan değer binary olarak tanımlandı.
if (analogueValue0==1) {SegDisplay0=ONE; i=8; }
if (analogueValue0==2) {SegDisplay0=TWO; i=7; }
if (analogueValue0==3) {SegDisplay0=THREE; i=6; }
if (analogueValue0==4) {SegDisplay0=FOUR; i=5; }
if (analogueValue0==5) {SegDisplay0=FIVE; i=4; }
if (analogueValue0==6) {SegDisplay0=SIX; i=3; }
if (analogueValue0==7) {SegDisplay0=SEVEN; i=2; }
if (analogueValue0==8) {SegDisplay0=EIGHT; i=1; }
if (analogueValue0==9) {SegDisplay0=NINE; i=0; }

if (analogueValue1==0) {SegDisplay1=ZERO; j=9; } // display – 2 için okunan değer binary olarak tanımlandı.
if (analogueValue1==1) {SegDisplay1=ONE; j=8; }
if (analogueValue1==2) {SegDisplay1=TWO; j=7; }
if (analogueValue1==3) {SegDisplay1=THREE; j=6; }
if (analogueValue1==4) {SegDisplay1=FOUR; j=5; }
if (analogueValue1==5) {SegDisplay1=FIVE; j=4; }
if (analogueValue1==6) {SegDisplay1=SIX; j=3; }
if (analogueValue1==7) {SegDisplay1=SEVEN; j=2; }
if (analogueValue1==8) {SegDisplay1=EIGHT; j=1; }
if (analogueValue1==9) {SegDisplay1=NINE; j=0; }

digitalWrite(latchPin, LOW); //yazdırma işlemleri (1) ve (2) nolu displeyler
shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay1);
shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay0);
digitalWrite(latchPin, HIGH);
delay(100); // hassasiyet için
int cek = digitalRead(startPin); //sayma tuşunun başlaması
if (cek == HIGH)
{
digitalWrite(buzzer, HIGH); delay (50); digitalWrite(buzzer, LOW);
for ( i ; i < 10; i++)
{
for ( j ; j < 10; j++)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, k[j]); //display 2 de sayma islemi
shiftOut(dataPin, clockPin, MSBFIRST, k[i]); //display 1 de sayma islemi
digitalWrite(latchPin, HIGH);
for (int m=1; m<60; m++) //60 kere yarım saniye yanıp, yarım saniye sönecek
{digitalWrite(sayac, HIGH); delay (500); digitalWrite(sayac, LOW);delay (500);} //DP pini yanip sonsun
}
j = 0;
}

for (int l = 0; l < 20; l++)
{digitalWrite(buzzer, HIGH); delay (500); digitalWrite(buzzer, LOW); delay (500); }
for (int l = 0; l < 300; l++)
{digitalWrite(buzzer, HIGH); delay (100); digitalWrite(buzzer, LOW); delay (100); }
}
else
{
delay(1000);
}
}

Kodların da temeli Arduino’nun resmi sitesinden alındı, eklemeler/çıkartmalar yapıldı. Aşağıdaki adresten ulaşabilirsiniz. Sitede displeylerin görüntüsünde titremeler olursa arduino’nun 12.pini ile gnd arasına 0.1µF kondansatör ekleyebilirsiniz diyordu. Ben ihtiyaç duymadım. Ama startPin’e bağlı 7 numaralı uca 10K’lık bir pull down direnci eklemek gerekti.(7numaralı pin ile gnd arasına)

Ayrıca fritzing üzerinde baskılı devre çalışmam devam ediyor. Bittiğinde o da yayınlanacak.

Çok daha yaratıcı projelere esin olabildiysem ne mutlu bana. Eksik, fazla tüm yorumlarınızı bekliyorum.

Sağlıcakla kalın.

Kaynak: https://www.arduino.cc/en/Tutorial/ShiftOut

Bu yayından tam bir ay sonra;

Projemiz hayata geçti. İki Pro mini yedim ama sonunda mutfağımıza monte etmeyi başardık.  Proje için kullandığım kutu bir kalem kutusu. Dolayısıyla dar ve uzun olduğu için biraz sıkıntı yarattı.

Önce iki parça yapıp kablolarla ekleme yaptım.

IMG_20181017_132856

Ama potansiyometreler, anahtar ve buton kablolarla birlikte fazla yer kapladığı için kutuya sığmadı, zorlayınca da kısa devre ve Arduino çöpe…

Daha sonra uzun plakete baskı devre uygulaması ile sorun çözüldü. Bu arada Arduino nano da pro mini ile değişti.

prolu baskı devre

İhtiyaç olursa baskı devreyi de ekledim.Devre elemanlarını eklemek de size kalsın.. Sonunda bitti ve gaz sensörünün üzerinde mutfaktaki yerini aldı.

son hali.jpg

%d blogcu bunu beğendi: