Posted by : MC 1 Mart 2015 Pazar

Günümüzde gelişen teknoloji ile birlikte sistemlerin kendi aralarında kablosuz olarak haberleştirmek kaçınılmaz.Bunun içinde wireless teknolojiler kullanılmakta.Gsm ile haberleşme sistemlerin uzak mesafelerde bağlantılı kalabilemesi açısından gerçektende önemli bir husus.


Arduino resmi sitesine baktığımızda Gsm shield olarak telefonica marka bir modül göze çarpmakta ancak piyasada bulunan neredeyse tüm gsm shield ları aynı sistemi kullandığından arduinonun bize sağlamış olduğu gsm kütüphanesi sorunsuz olarak çalışacaktır.

Peki bir Gsm uygulaması için bize neler gereklidir?

1 adet arduino board
1 adet gms shield
ve 1 adet sim kart (sim kartın aktif olması haberleşmemiz açısından kaçınılmaz )

Gelelim kodları irdelemeye

İlk olarak arduino projemizin içerisine gsm kütüphanemizi ekliyoruz.
#include <GSM.h>

Sonrasında gsm sheildımıza yerleştirmiş olduğumuz sim kartın pin numarasını belirtiyoruz.
#define PINNUMBER ""

Biz bu yazımızda sizlere gsm shield ile arduino tarafından nasıl sms gönderileceğini açıklamaya çalışacağımızdan dolayı gsm kütüphanemizin gsm access ve gsm sms değişkenleri kullanacağız.
GSM gsmAccess;
GSM_SMS sms;
Burada gsm kütüphanemizden gsmAccess adı altında bir adet gsm ağı ve sms değişkeni adı altında GSM_SMS sistemi tanımladık.

Arduinomuzun setup fonksiyonu içerisinde gsm modülü kontrolünü ve sistem takibini sağlamak açısından seri monitör bağlantımızı oluşturuyoruz.

void setup(){
Serial.begin(9600);
Serial.println("SMS Messages Sender");
GSM ağına bağlı olup olmadığımızın kontrolü açısından notConnected adı altında boolean bir değişken tanımlıyoruz.Bu değişken bağlı olduğumuzda "false" bağlantı olmadığında ise "true" değerini döndürecektir.Değişkenimizin içerisine başlangıç koşulu olarak true değerini atıyoruz.

boolean notConnected = true;
Gelelim sistemimizi gsm networküne bağlamaya.Bunun için gsm kütüphanemizden gsmAccess.begin() fonksiyonunu çağıracağız.Bu fonksiyon bizim pin tanımladığımız pin numaramızı kullanarak gsm modem ile bağlantımızı sağlayacak ve sürekli olarak gsm bağlantı durumumuzu kontrol edeceğiz.gsmAccess()fonksiyonu bizim modeme bağlı kaldığımız süre zarfında GSM_READY bilgisini döndürecektir.Bizde bu bilgiyi kullanarak işlemlerimize devam edeceğiz.



while(notConnected)
{
if(gsmAccess.begin(PINNUMBER)==GSM_READY)
notConnected = false;
else
{
Serial.println("Not connected");
delay(1000);
}
}
 
Bağlantı sağladığımıza dair seri monitör üzerinden bağlantı durumunu yazdırıyoruz.

Serial.println("GSM initialized.");

}

Yazımızın başında da bahsettiğimiz gibi biz sistemin bilgilerini seri monitör üzerinden takip edeceğimizden dolayı seri monitörler etkileşim içerisinde olmalıyız ve seri monitörden de arduino içerisine telefon numarası gibi bilgileri çekebilmeliyiz.Bunun için seri monitörden gelecek olan telefon numarasını okumak açısından seri bağlantımızı açacağız ve oradan gelen veriyi okumak açısından buffer oluşturacağız.int olarak seri haberleşmeyi okuyacağımız ve sms göndereceğimiz numarayı almamızı sağlayan bir fonksiyon oluşturuyoruz.




int readSerial(char result[])

{

Seri haberleşmeden gelecek olan verimizin buffer genişliğini kontrol etmek açısından int bir kontrol değişkeni tanımlıyoruz ve sürekli olarak haberleşmeyi sağlamak açısından sonsuz döngü içerisine giriyoruz.



int i = 0;
while(1)

{
Seri haberleşmeden gelen veri olup olmadığını Serial.available() fonsiyonu ile kontrol ediyor ve gelen verileri char inChar değişkenimizin içerisine alıyoruz.Char her defasında bir karakteri alıyor.



while (Serial.available() > 0)
{
char inChar = Serial.read();

Seri monitörden bir alt satıra geçme karakteri yani "\n" komutu gelinceye kadar numarayı çekeceğimiz dizi değişkenimize verileri kabul ediyoruz.Alt satıra geçme karakteri geldiğinde ise ki bu biz seri monitörden numara bilgisi girip enter a bastığımızda gerçekleşecek, numarak kabul eden değişkenimize veri almayı kesiyoruz."\r " komutunu aldığımızda ise numaramızın son halini alıyoruz ve buffer indeximizi bir arttırarak sonsuz döngümüzü kırıyoruz.

if (inChar == '\n')
{
result[i] = '\0';
Serial.flush();
return 0;

}
if(inChar!='\r') {
result[i] = inChar;
i++;
}
}
}
}

Remote number adı altında seri monitörden gelecek olan verimizi alıyoruz ve yine seri ekranda anlasılması açısından mobile numarasını girmesi gerektigini söylecek bir text yazdırıyoruz.

Serial.print("Enter a mobile number: ");
char remoteNumber[20];
readSerial(remoteNumber);
Serial.println(remoteNumber);
Char değişken tipinde telefona göndermek istediğimiz sms mesajımızı alıyoruz.

Serial.print("Now, enter SMS content: ");
char txtMsg[200];

readSerial(txtMsg);
sms.beginSMS() fonksiyonunu kullanarak sms sistemini başlatıyoruz ve sms.print() fonksiyonu ile de mesajımızı gönderiyoruz.

Serial.println("SENDING");
Serial.println();
Serial.println("Message:");
Serial.println(txtMsg);
sms.beginSMS(remoteNumber);
sms.print(txtMsg);
sms.endSMS();
Serial.println("\nCOMPLETE!\n");
}

Tüm sistemin kodu:



GSM gsmAccess; // include a 'true' parameter for debug enabled
GSM_SMS sms;
void setup()
{
// initialize serial communications
Serial.begin(9600);
Serial.println("SMS Messages Sender");
// connection state
boolean notConnected = true;
// Start GSM shield
// If your SIM has PIN, pass it as a parameter of begin() in quotes
while(notConnected)
{
if(gsmAccess.begin(PINNUMBER)==GSM_READY)
notConnected = false;
else
{
Serial.println("Not connected");
delay(1000);
}
}
Serial.println("GSM initialized");
}
void loop()
{
Serial.print("Enter a mobile number: ");
char remoteNumber[20]; // telephone number to send sms
readSerial(remoteNumber);
Serial.println(remoteNumber);
// sms text
Serial.print("Now, enter SMS content: ");
char txtMsg[200];
readSerial(txtMsg);
Serial.println("SENDING");
Serial.println();
Serial.println("Message:");
Serial.println(txtMsg);
// send the message
sms.beginSMS(remoteNumber);
sms.print(txtMsg);
sms.endSMS();
Serial.println("\nCOMPLETE!\n");
}
/*
Read input serial
*/
int readSerial(char result[])
{
int i = 0;
while(1)
{
while (Serial.available() > 0)
{
char inChar = Serial.read();
if (inChar == '\n')
{
result[i] = '\0';
Serial.flush();
return 0;
}
if(inChar!='\r')
{
result[i] = inChar;
i++;
}
}
}

}

Resmi olarak gsm kütüphanesine ise buradan ulaşabilirsiniz.

Özetlemek gerekirse yukarıda paylaştığımız gms kutuphanesini kullanarak sms içerisinde serial monitor kullanmadan arduino tarafında okuduğunuz bilgileri sms olarak telefona gönderebilirsin.Birçok akıllı ev uygulamalarında kullanılan bu sistem,yine güç takip sistemleri,gprs modulü ile bilikte araç takip sistemleri gibi sistemler de de kullanılabilir.

{ 8 Comments... read them below or Comment }


  1. Bilgilendirdiğiniz için teşekkürler, peki cep telefonundan arduinoya nasıl mesaj gönderebiliriz. Örneğin arduino ya 1 mesajını gönderdiğimde sistem aktif hale gelsin, 0 gönderdiğimde kapansın. Bu işlemi nasıl gerçekleyebiliriz.

    YanıtlaSil
    Yanıtlar
    1. while içerisinde sms.avaible() kontrolü sağlamalısınız bu durumda herhangi bir numaradan sms gonderimi oldugunda bu loop içerisinde girecektir sonrasında ise sms.read() ile gelen mesajı kontrol edin ve sizin kosulunuza uygun oldugu anda çıkısı aktif ya da pasif hale getirin

      Sil
    2. GSM modülde yeniyim. Bir sorum olacaktı. 1. butona bastığımızda belirlenen numaraya mesaj attık diyelim 2. butona bastığımızda farklı numaraya mesaj atmamız mümkün mü? Biraz bilgilendirirseniz sevinirim.

      Sil
    3. mumkun burada tek yapmanız gereken sms.BeginSMS(); içerisinde yer alan alandaki remote number yani göndermek istediğiniz numarayı değiştirmek

      Sil
  2. iyi günler.peki bu modül ile her yerden bir şeyi kontrol etmemiz mümkün mü? mesela bir step motoru çok uzak bir yerden döndürmek. ve bu işlem ayrıca bilgisayar ile de yapılabilir mi?

    YanıtlaSil
  3. Merhaba.

    Bu gsm modülünün IMEI sini kayıt ettirmemiz gerekmiyor mu?

    YanıtlaSil
  4. Merhaba,

    Acaba Arduino Gsm Shield kullanımında, gelen sms'in hangi numaraya ait olduğunu gösteren bir kod var mı

    YanıtlaSil
  5. mesajı okuyamıyorum, gelen mesaja göre aktif veya deaktig olması gerekiyor

    #include
    #include
    SoftwareSerial gprsSerial(8, 7);
    int motor1=10;
    void SendTextMessage()
    {
    Serial.println("Sending Text...");
    gprsSerial.print("AT+CMGF=1\r"); // Set the shield to SMS mode
    delay(100);
    gprsSerial.println("AT+CMGS = \"+905399669129\"");
    delay(100);
    gprsSerial.println("sa"); //the content of the message
    delay(100);
    gprsSerial.print((char)26);//the ASCII code of the ctrl+z is 26 (required according to the datasheet)
    delay(100);
    gprsSerial.println();
    Serial.println("Text Sent.");



    }

    void receiveTextMessage()
    {

    Serial.println("Receive Text...");
    gprsSerial.print("AT+CNMI"); // Set the shield to SMS mode
    delay(100);
    gprsSerial.println("AT+CNMI=3,3,0,0");
    delay(100);
    gprsSerial.println("sa"); //the content of the message
    delay(100);
    gprsSerial.print((char)26);//the ASCII code of the ctrl+z is 26 (required according to the datasheet)
    delay(100);
    gprsSerial.println();
    Serial.println("Receive .");
    }
    void DialVoiceCall()
    {
    gprsSerial.println("ATD+905399669129;");//dial the number, must include country code
    delay(100);
    gprsSerial.println();
    }
    void setup()
    {
    gprsSerial.begin(19200); // GPRS shield baud rate
    Serial.begin(19200);
    delay(500);
    }
    void waterpump(){
    pinMode(motor1, OUTPUT);
    digitalWrite(motor1, HIGH);
    Serial.begin(19200);
    delay(3000);
    Serial.println("AT+CNMI");
    Serial.println("AT+CNMI=3,3,0,0 ");
    delay(200);
    }
    void waterpump2()
    {
    pinMode(motor1, OUTPUT);
    digitalWrite(motor1, LOW);
    Serial.begin(19200);
    delay(3000);
    delay(200);
    }
    void loop()
    {
    if (Serial.available()) // if there is incoming serial data
    switch (Serial.read()) // read the character
    {
    case 't': // if the character is 't'
    SendTextMessage(); // send the text message
    break;
    case 'd': // if the character is 'd'
    DialVoiceCall(); // dial a number
    break;
    case'm':
    {
    waterpump();
    }
    break;
    case'k':
    {
    waterpump2();
    }
    }

    if (gprsSerial.available()) { // if the shield has something to say
    Serial.write(gprsSerial.read()); // display the output of the shield
    }
    }

    YanıtlaSil

ELEKTRO BLOGGER A HOŞGELDINIZ

ARAMA YAP

EN COK OKUNANLAR

- Copyright © ELEKTRO-BLOGGER Blogger