Arduino Gsm Sms Kontrol ve Lokasyon Bilgisi

Başlatan fide, 28 Mart 2019, 05:14:33

fide

Arduino DUE board ve Telit GM862GPS ile geliştirdiğim kodları paylaşıyorum.
1ON,1OFF,2ON,2OFF komutları sms olarak gönderilince arduino ya bağlı iki led ayrı ayrı yakılıp söndürülebilir.
Loc metni sms olarak gönderilince GPS lokasyonu google maps linki şeklinde sms olarak gönderiyor.


#define led1 53
#define led2 13

#define pinGsmOnOff 7
#define pinGsmState 6
String data;
String ser3Data;
int isGsmOn;
long int processPlanner;
int dataLen;
String smsNotice="+CMTI";
String telNum;
String enlemStr,boylamStr;
String smsBody;
int sayac,sure;
String temp;
char dirEW;
char dirNS;




String deg;
int mn;
int scnd;


long int dec;

int gun;
int ay;
int yil;
int sa;
int dk;
int sn;  

enum enumCmd
{
  eAT,
  eATFCLASS,
  eATGPSACP,
  eATE,
  eATCOPS,
  eATCNMI,
  eATCMGF,
  eATCMGD,
  eATCMGS,
  eATCMGL,
  eATCCLK,
  eATNITZ
  
  };

//typedef
struct command{
  int nr;
  String text;
  int sure;
  
};
command myCmd[20]
{
  eAT,{"AT"},300,
  eATFCLASS,{"AT+FCLASS=8"},300,
  eATGPSACP,{"AT$GPSACP"},1000,
  eATE,{"ATE0"},300,
  eATCOPS,{"AT+COPS?"},300,
  eATCNMI,{"AT+CNMI=2,1"},300,
  eATCMGF,{"AT+CMGF=1"},300,
  eATCMGD,{"AT+CMGD=1,4"},300,
  eATCMGS,{"AT+CMGS="},1000,
  eATCMGL,{"AT+CMGL=\"ALL\""},2000,
  eATCCLK,{"AT+CCLK"},300,
  eATNITZ,{"AT#NITZ=1,1"},300
  } ;
  
void sendCmd(int cmd)
{
  Serial2.print("cmd: ");
  Serial2.println(myCmd[cmd].text);
  Serial3.println(myCmd[cmd].text);
  //delay(myCmd[cmd].sure);
  delay(10);//minimal bir süre bekle
  sure=myCmd[cmd].sure/10;
  for (sayac=0;sayac<sure;sayac++)
  {
    if (Serial3.available()>0)
    {
      
      break;
      }
      else
      {
        delay(10);
      }
    
    }
    Serial2.print("sayac:");
    Serial2.println(sayac);
  if (Serial3.available()>0)
  {
    ser3Data=Serial3.readString();
    Serial2.print("Veri: ");
    Serial2.println(ser3Data);
    if(ser3Data.startsWith("\r\n+CMGL:"))
    {
    //String smsBody=ser3Data;
    //smsBody.replace('\n','_');
    //smsBody.replace('\r','_');
    
    //Serial2.print("smsBody:");
    //Serial2.println(smsBody);
    telNum=ser3Data.substring(26,39);
    Serial2.print("Tel Num:");
    Serial2.println(telNum);
    if (ser3Data.substring(42,45)=="1ON")
      {
        digitalWrite(led1,HIGH);
        
      } 
      if (ser3Data.substring(42,46)=="1OFF")
      {
        digitalWrite(led1,LOW);
      }
      if (ser3Data.substring(42,45)=="2ON")
      {
        digitalWrite(led2,HIGH);
      } 
      if (ser3Data.substring(42,46)=="2OFF")
      {
        digitalWrite(led2,LOW);
      }
      if (ser3Data.substring(42,45)=="Loc")
      {
        sendSms(telNum,smsBody);
      }
    }
    if(ser3Data.startsWith("\r\n$GPSACP:")  and ser3Data.length()>81)
    {
      enlemStr=ser3Data.substring(22,32);
      Serial2.println("enlemRAW: ");
      Serial2.println(enlemStr);
      
      deg=enlemStr.substring(0,2);
      mn=enlemStr.substring(2,4).toInt();
      scnd=enlemStr.substring(5,9).toInt();
      dirNS=enlemStr[9];
      dec = (mn *100000 +scnd* 10)/6;
      
      enlemStr=deg + "." + String(dec);

      //Serial2.println("enlem: ");
      //Serial2.print(enlemStr);
      //Serial2.println(dirNS);
      
      
      boylamStr=ser3Data.substring(33,44);

      //Serial2.println("boylamRAW: ");
      //Serial2.println(boylamStr);
      
      deg=boylamStr.substring(0,3);

      mn=boylamStr.substring(3,5).toInt();
      scnd=boylamStr.substring(6,11).toInt();
      dirEW=boylamStr[10];
      dec = (mn *100000 +scnd* 10)/6;
     
      boylamStr=deg + "." + String(dec);
      //Serial2.println("boylam: ");
      //Serial2.print(boylamStr);
      //Serial2.println(dirEW);


      smsBody="Konum: https://www.google.com.tr/maps/place/" + enlemStr + dirNS + "+" +boylamStr + dirEW;
      //Serial2.print("smsBody");
      //Serial2.println(smsBody);

          
      
    }

    
    if(ser3Data.startsWith("\r\n+CCLK:"))
    {
      //Serial2.println("+CCLK komutu");
      temp=ser3Data.substring(9,11);
      yil=temp.toInt();
      temp=ser3Data.substring(12,14);
      ay=temp.toInt();
      temp=ser3Data.substring(15,17);
      gun=temp.toInt();

      temp=ser3Data.substring(18,20);
      sa=temp.toInt();
      temp=ser3Data.substring(21,23);
      dk=temp.toInt();
      temp=ser3Data.substring(24,26);
      sn=temp.toInt();
      /*
      Serial2.print("gun:");
      Serial2.println(gun);
      Serial2.print("ay:");
      Serial2.println(ay);
      Serial2.print("yil:");
      Serial2.println(yil);
      Serial2.print("saat:");
      Serial2.println(sa);
      Serial2.print("dk:");
      Serial2.println(dk);
      Serial2.print("sn:");
      Serial2.println(sn);
      */
    }
    
    }
  
  }
  void sendSms(String num,String text)
  {
    int chrBrk=26;
    Serial3.print(myCmd[eATCMGS].text);
    Serial3.println(num);

    //Serial2.print(myCmd[eATCMGS].text);
    //Serial2.println(num);
    
    delay(myCmd[eATCMGS].sure);
    Serial3.print(text);
    Serial3.write(chrBrk);
    //Serial2.print(text);
    
    Serial2.println("SMS sent");
    
    
    }
void gsmModuleCheck()
{
  isGsmOn=digitalRead(pinGsmState);
  Serial2.print("GSM State: ");
  Serial2.println(isGsmOn);
  if (isGsmOn==0)
  { 
    digitalWrite(pinGsmOnOff,HIGH);
    delay(1500);
    digitalWrite(pinGsmOnOff,HIGH);
    
    Serial2.println("GSM is on now");
    delay(5000);
    
    
    }
    else
    {
      Serial2.println("GSM is already on");
    
      
    }
    sendCmd(eAT);
    sendCmd(eATFCLASS);
    sendCmd(eATE);
    sendCmd(eATCOPS);
    sendCmd(eATCMGF);
    sendCmd(eATCNMI);
    sendCmd(eATCMGD);
    sendCmd(eATNITZ);
 
    }
  
void setup() {
  // put your setup code here, to run once:
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(pinGsmOnOff,OUTPUT);
  pinMode(pinGsmState,INPUT);
  
  Serial2.begin(115200);
  delay(500);
  Serial3.begin(115200);
  delay(500);
  Serial2.println("merhaba");
  gsmModuleCheck();
  processPlanner=0;
}

void loop() {
  // put your main code here, to run repeatedly:
  
  if (Serial3.available()>0)
  {
    data=Serial3.readString();
    Serial2.print("GSM:");
    Serial2.println(data);
    if (data.startsWith("\r\n+CMTI"))
    {
      Serial2.println("SMS Alindi");
      Serial2.println(data.length());
      sendCmd(eATCMGL);
      delay(100);
      sendCmd(eATCMGD);
      
      
      }
    }
    
    if (processPlanner%5000==2500)
    {
      sendCmd(eATGPSACP);
    }
    if (processPlanner%5000==1500)
    {
      sendCmd(eATCCLK);
    }
    
   processPlanner++;
   delay(1);


   
}
 
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

Serial2 debug için Serial3 gsm modül haberleşmesi için tanımlandı.
6 ve 7 nolu pinlerin birisi modülü  uyandırmak için diğer modülün o anda aktif olup olmadığını anlamak için kullanıldı.


#E2SMSRI komutuyla sms gelince harici kesme yada pinin lojik seviyesinde değişme ile donanımsal sms kontrolü yapılabilir. SMS bildirimi ile başka komutların cevabı arka arkaya gelince arduino bazen sms bildirimini kaçırabiliyor. Bilginiz olsun.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

At komutlarını göndermek için enum ve structure yapısı var. Diğer AT komutları da bu yapıya uygun tanımlanıp kullanılabilir.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com