Bu konu daha önce benim uzun süre takıldığım bir konuydu. Bu yüzden bu konuda takılanlara yardımı olması sebebi ile böyle bir yazı yazmaya karar verdim.
Bazen bu tür modülleri farklı bir mikrodenetleyici ile kullanmak gerekebiliyor. Bu modüller genelde Arduino Shield‘ları olarak tasarlanır. Benim üzerinde çalıştığım modül bir Türk firmasının geliştirdiği aşağıdaki resimdeki modüldür.
Bu modüller şeklinden de anlaşılabileceği gibi Arduino Uno üzerine takılabilecek şekilde tasarlanmıştır. Bu shield’ın üzerinde SIMCOM SIM900 GSM modülü bulunmaktadır. SIM900 için daha detaylı bilgi için datasheet’ine bakabilirsiniz.
Peki bu modül ile nasıl haberleşeceğiz? GSM SHIELD‘ın datasheet’ine baktığımız zaman UART, SPI veya I2C haberleşme protokolleri ile kullanılabileceğini görürüz. Ben UART haberleşme protokolü ile kullandım. Bu tarz modüller “AT” komutları ile kullanılır. Örneğin gsm modüle uart ile “AT+CMGF=1\r” karakter dizisini gönderdiğimiz zaman modül SMS moduna geçmektedir. AT komutları standarttır. Sıkça kullanılan ESP8266 Wİ-Fİ modülleri de bu komutlar ile kullanılır. AT komutları ile ilgili daha detaylı bilgi için buraya tıklayabilirsiniz.
STM32 ile Kullanılması
Ben STM32 ile çalışırken HAL kütüphaneleri ve CubeMX programından faydalanıyorum. Bu yüzden aşağıda vereceğim kodlar HAL kütüphaneleri kullanarak yazılmıştır. Ayrıca kullandığım mikrodenetleyici STM32F103C8T6’dır.
Öncelikle USART haberleşmesi için kullandığım fonksiyondan bahsedelim.
1 | HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) |
Bu fonksiyon yukarıda görüldüğü gibi dört farklı parametre almaktadır. Bunlar; hangi uart’ın kullanıldığı(&huart1,&huart2 vb.), uart üzerinden gönderilecek karakter değişkeni( 8 bitlik integer değişkene çevirilerek gönderilir),gönderilecek karakterin size’ı yani karakterin uzunluğu(örneğin; AT+CMGF=1\r karakterinin uzunluğu 11’dir çünkü son karakter stringin bittiğini ifade eden “\0” karakteridir.) ve Timeout yani zaman aşımı değişkeni(milisaniye).
1 | HAL_UART_Transmit(&huart1,(uint8_t *)"AT+CMGF=1\r",uzunluk("AT+CMGF=1\r"),100); |
GSM modüle HAL kütüphanesi kullanılarak AT komutları gönderilirken dikkat edilmesi gereken en önemli nokta gönderilen string karakterin boyutu veya uzunluğudur. Benim bu konuda takılmamdaki başlıca sebep budur.Eğer modüle gönderdiğiniz string ifadenin uzunluğunu HAL_UART_Transmit(); fonksiyonuna girmezseniz GSM modül gönderdiğiniz komutlara cevap vermeyecektir.
Şimdi gelelim string değişkenin uzunluğunu bulmaya. Öncelikle C de string işlemini pointer kullanarak yaptığımız için asıl bulmamız gereken uzunluk pointer olarak tanımlanan değişkenin uzunluğudur. Bu uzunluğu bulmak için Keil’de aşağıdaki gibi bir fonksiyon yazdım.
1 2 3 4 5 6 | int uzunluk(char *gelen) { int i; for(i = 0; gelen[i] != 0; i++); // string'in son karakterini görene kadar i değişkeni artacaktır. return i; } |
Bu fonksiyon , içine gönderilen karakterin uzunluğunu integer olarak bize geri döndürür. Böylece her mesaj karakterinin uzunluğunu hesaplamamıza gerek kalmaz.Bu fonksiyon bizim yerimize hesaplar.(Not: Bu fonksiyon yerine <string.h> kütüphanesi içerisindeki “strlen” fonksiyonu da kullanılabilir.)
GSM modül ile SMS atmak için aşağıdaki gibi bir fonksiyon yazdım. Bu fonksiyonu kullanabilmek için main fonksiyonun üzerine yazabilirsiniz. Önce size SMS göndermek için yazdığım fonksiyonu veriyim sonra bu fonksiyonun içeriğinden bahsedelim. Bu fonksiyonun kodları aşağıdaki gibidir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | void SMS_print(char *msg) { /**************************************************************************/ // /******************GSM SMS GÖNDERME***************************************/ /*****************************************************************************/ HAL_Delay(5000); HAL_UART_Transmit(&huart1,(uint8_t *)"AT+CMGF=1\r",uzunluk("AT+CMGF=1\r"),100); HAL_Delay(250); HAL_UART_Transmit(&huart1,(uint8_t *)tx,sprintf(tx,"%c",(char)13),100);// enter karakteri gönderildi. HAL_Delay(250); HAL_UART_Transmit(&huart1,(uint8_t *)"AT+CMGS=\"+90538278XXXX\"",uzunluk("AT+CMGS=\"+90538278XXXX\""),100); HAL_Delay(250); HAL_UART_Transmit(&huart1,(uint8_t *)tx,sprintf(tx,"%c",(char)13),100); HAL_Delay(250); HAL_UART_Transmit(&huart1,(uint8_t *)msg,uzunluk(msg),100); HAL_Delay(250); HAL_UART_Transmit(&huart1,(uint8_t *)tx,sprintf(tx,"%c",(char)13),100); HAL_Delay(250); HAL_UART_Transmit(&huart1,(uint8_t *)tx,sprintf(tx,"%c",(char)26),100); HAL_Delay(250); HAL_UART_Transmit(&huart1,(uint8_t *)tx,sprintf(tx,"%c",(char)13),100); /*******************************************************************************/ /*******************************************************************************/ } |
Bu fonksiyonu bize herhangi bir değer döndürmeyeceği için void olarak tanımladık ve alacağı tek parametre *char msg tipinde bir pointer değişkendir. Bu fonksiyon main fonksiyon içerisinde herhangi bir yerde aşağıdaki gibi kullanılabilir.
1 | SMS_print("Bu bir deneme mesajıdır"); |
şeklinde kullanılabilir. SMS gönderebilmek için kullanılan AT komutları aşağıdaki sırayla gönderilmelidir. NOT: GSM modül uart ile haberleşirken her haberleşme sonunda sizden enter(carriage return) karakterini göndermenizi bekler. Bu karakter ASCİİ tablosunda integer değeri 13 olan karakterdir.)
- “AT+CMGF=1\r” : GSM modülü SMS moduna alır.
- “AT+CMGS=\”+90538278XXXX\”” : Mesaj gönderilecek olan telefon numarası girilir.
- Gönderilecek olan SMS mesajı uart üzerinden GSM modüle gönderilir.
- ASCİİ tablosunda integer değeri 26 olan Substitude karakteri gönderilir.
Enter(carriage return) karakterini gönderirken sprintf() fonksiyonunu kullandım.NOT: sprintf() fonksiyonunun kullanıldığı satırlarda “tx” isimli bir değişken bulunmakta bu değişkeni fonksiyon içinde tanımlamadım main.c dosyasının en üst satırında char tx[10]; şeklinde tanımladım. sprintf() fonksiyonu bu tx[] dizisine fonksiyonun içine yazılan karakterleri atamaktadır.
Eğer GSM modül ile bağlantınızda sorun yok ise bu kodlar sorunsuz çalışacaktır. Aşağıda STM32 için Uart ayarlarının yapıldığı kod bloğunu da paylaştım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* USART1 init function */ static void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 19200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } } |
GSM modül teknik döküman ve Arduino için yazılmış örnekler için tıklayın.
Merhaba,
Paylaşımlarınız çok faydalı teşekkür ederiz.
Rica etsem mesaj almayıda gösterebilir misiniz?
Rica ederim. Mesaj okuma ile ilgili bir örneği ilerleyen zamanlarda paylaşmayı düşünüyorum.
Mesaj okuma örneğine yaptığım projede benim de çok ihtiyacım var. Örneğinizi dört gözle bekliyorum.