Merhaba arkadaşlar, bu yazımızda STM32F geliştirme kartını kullanarak, mors alfabesi şeklinde yani uzun ve kısalarla yazarak ona karşılık gelen harfi ve sayıyı 7-segment display’de ve buzzerda göstereceğiz. Konuya geçmeden önce mors alfabesinden kısaca bahsedelim.
Mors Alfabesi
Mors Alfabesi ,1835 yılında telgraf ile de ilgilenen Samuel Morse tarafından oluşturulmuştur. Mors Alfabesi , kısa ve uzun işaretler,yani nokta ve çizgeler(dot and dash) (./ -) ile bunlara karşılık gelen ışık ve sesleri kullanarak bilgi aktarılmasını sağlayan bir yöntemdir.
Peki biz uzun ve kısayı STM32F’de nasıl yapabiliriz?. Uzun ve kısayı düğmenin basılma süresini ölçerek ayarlacağız ve 2. bir düğme kullanarak 2. düğmeye basılana kadar istediğimiz sayıda uzun ve kısa işaretlerden alacağız.
Kullanılan Malzemeler
- NUCLEO-L053R8 – STM32 Nucleo-64
- 2 Adet Button
- 1 Adet Common Katot 7-Segment Display
- 4 Adet 1kΩ Direnç
- 2 Adet LED
- 1 Adet Buzzer
- 1 Adet Breadboard
Devre Nasıl Çalışıyor?
Devrede 2 adet düğmemiz var. Dot veya Dash düğmesi uzun veya kısa süreli basılmasına göre 7-segment display’de nokta veya uzun çizgi gösteriyor. Düğmeye basıldığı sırada buzzer’dan ses çıkıyor ve kırmızı ışık yanıyor.
Eğer STOP düğmesine basılırsa dot veya dash’ların sayısına ve anlamına göre 7-Segmentte o harf veya rakam çıkıyor. Tekrar Dot veya Dash düğmesine basılana kadar Sarı ışık yanmaya devam ediyor.
Eğer girilen Dot veya Dash’lar birşey ifade etmiyorsa 7-segment’de E (error) harfi gösteriliyor.
7-Segment Display ve BusOut
Kodun nasıl çalıştığına gelmeden önce, 7-Segment üzerinde birazcık bilgimiz olması gerekiyor. 7-Segment display’de 8 Adet Bit var ve her bir bitin 1 veya 0 olmasına göre belirli kısımlar yanıyor veya sönüyor. Bu yüzden display’den çıkan 8 adet kablo, STM Nucleo’nun 8 pinine gidiyor. Biz kodda her seferinde 1001 gibi belirtmek yerine bu 8 pini BusOut olarak ayarlıyoruz böylece 0x2F gibi Hexadecimal sayı kullanarak 8 pine birden bir değer gönderebiliyoruz.
BusOut display(a,b,c,d,e,f,g,dp);
BusOut display(D14,D6,D7,D8,D10,D11,D12,D13);
BusOut’u yukardakı gibi tanımlayabiliriz. 7 Segment Display’in Pin Out‘u ise aşağıdaki gibidir. Pinleri aşağıdaki harflere göre sıralayabilirsiniz. Veya direk olarak yukarıda bulunan Fritzing dosyasını kullanabilirsiniz.
Kod Nasıl Çalışır?
STM32F ‘e kod yazmak için online compiler olan Mbed Compiler‘i kullanıyoruz. Eğer Mbed hakkında bilginiz yoksa hakkında yazdığım yazıya şuradan ulaşabilirsiniz.
Kodun ana mantığında her iki düğmenin son durumları ile düğmelerin o andaki durumlarını kontrol etmek var. Eğer ilk düğme basılmış ve basılmaya devam ediyorsa signal_lenght‘i arttırıyor. Düğmeden elimizi çektiğimiz anda signal_lenght‘i hesaplıyor.
Signal_length belli bir sayının altındaysa bu dot (.) oluyor. Bu zamanları deneyerek en uygun düzeyde ayarladım ve yaklaşık olarak 0.50sn. Morse string‘ine dot ise (.) dash ise (-) ekliyor.
Eğer STOP düğmesine basılırsa segment function’ına gidiyor ve elimizdeki dot ve dashlardan oluşan diziyi hali hazırdakilerle karşılaştırıyor. Eşit olanı BusOut mantığı ile 7-segment’e gönderiyor.
//Morse Code //Yusuf Savaş #include "mbed.h" #include<string> DigitalIn Button1(D2); //Dot veya Dash Butonu DigitalIn Button2(D4); //Stop Butonu kodun bittiğini ifade ediyor. DigitalOut LedControl(D3); //Dot veya Dash, Durum Ledi DigitalOut LedFinish(D5); //Stop Ledi PwmOut Buzzer(PC_7); // Buzzer'ın takılı olduğu pin BusOut display(D14,D6,D7,D8,D10,D11,D12,D13); // 7-Segment için kullanılan pinler. int main() { int buttonState = 0; // Buton1 (dot veya dash) için durum kontrolu. int lastButtonState = 0; //Buton1 için son durum long signal_length = 0; //Buton1 in basılı olduğu süre. string dash = "-"; string dot = "*"; string morse = ""; int Button2Check = 0; void segment(string morsecode); //Segment icin function tanımı while(1) { Buzzer.write(0); //Eğer hicbir sey basılmadıysa Buzzer sessiz. Button2Check = Button2; //Button2'nin durumu Button2Check'e atanıyor. buttonState = Button1; //Button1'nin durumu ButtonState'e atanıyor if (buttonState && lastButtonState) // Eğer button1 basılı tutuluyorsa ikiside 1 olacağından buraya girer. { signal_length = signal_length + 1; LedControl = 1; //Durum Ledi açık. Buzzer.period_us(500); //PWM Sinyalin periyotu. Buzzer.write(0.3); //PWM Sinyalin Duty Cycle'ı. } else if(!buttonState && lastButtonState) //Eğer button basılı konumundan çekilirse !0 && 1 = 1 olacağından buraya girer. { if (signal_length>5 && signal_length<25 ) //Eğer düğme 0.50sn'den daha az basıldıysa dot(.) { morse = morse + dot; display=0x80; //7- Segmentte dot göster. } else if (signal_length>25) //Eğer 0.50sn'den fazlaysa dash(-) { morse = morse + dash; display=0x40; //7- Segmentte dash göster. } signal_length=0; LedControl = 0; } lastButtonState=buttonState; //Buton durumu son durum ile eşitlendi. if (Button2Check == 1) { //Eğer STOP düğmesi basılırsa segment(morse); //Segment fonksiyonuna git. wait(0.1); //Debounce beklemesi LedFinish = 0; //Reset Led2,morse code,signal lenght and display. morse = ""; signal_length = 0; display = 0x00; } } //while(1)'in bitişi } //int main bitişi void segment(string morse) { wait(0.1); //debounce while (Button1 == 0) { //eğer button1 basılırsa bu döngüyü bitir ve diğer kod'a başla. LedFinish = 1; if (morse=="*----") { printf("1"); display=0x06; } //Bunlar 7-Segment için kullanılıyor. else if (morse=="**---") { //Printf debug için kullanıldı printf("2"); display=0x5B; } else if (morse=="***--") { printf("3"); display=0x4F; } else if (morse=="****-") { printf("4"); display=0x66; } else if (morse=="*****") { printf("5");display=0x6D; } else if (morse=="-****") { printf("6"); display=0x7D;} else if (morse=="--***") { printf("7"); display=0x07; } else if (morse=="---**") { printf("8"); display=0x7F;} else if (morse=="----*") { printf("9"); display=0x6F;} else if (morse=="-----") { printf("0"); display=0x3F; } else if (morse=="*-") { printf("A"); display=0x77; } else if (morse=="-***") { printf("b"); display=0x7C; } else if (morse=="-*-*") { printf("C"); display=0x39; } else if (morse=="-**") { printf("d"); display=0x5E; } else if (morse=="**-*") { printf("F"); display=0x71; } else if (morse != "") { //Eğer morse kodu boş değil ve yukardakilerle uymuyorsa Error (E) harfini göster. printf("Error"); display =0x79; } wait(0.1); } return; }
Aşağıdan direkt olarak kodun kendisini ve Fritzing dosyasını, şemasını indirebilirsiniz.
Projenin sonuna gelmiş bulunuyoruz eğer herhangi bir sorunuz varsa Hakkımda bölümünden veya aşağıya cevap yazarak bana ulaşabilirsiniz. Bir sonraki projede görüşmek üzere.