STM32 Nucleo ile Mors Alfabesi Yapmak

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.

Mors Alfabesi Tablosu
Mors Alfabesi

Kullanılan Malzemeler

STM32 Nucleo ile Mors Alfabesi Fritzing Devresi
STM32 Nucleo ile Mors Alfabesi Fritzing Devresi

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.

7 Segment Display Şematiği

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; 
        } 
 STM32 Nucleo ile Mors Alfabesi Yapmak
STM32 Nucleo ile Mors Alfabesi Yapmak


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.

Etiket(ler): , , .Yer işareti koy Kalıcı Bağlantı.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir