Arduino Due bord üzerinde sms ile röle ve led kontrol uygulaması

Başlatan fide, 04 Kasım 2019, 11:18:13

fide



2009 yılında aldığım - 96€+kdv ödedim-
telit gm862gps modül ile arduino due'yi birleştirip uygulamaya döktüm.

Gsm/gps modül eski ama kodlar elinizdeki gsm modüle göre revize edilip kullanılabilir.

Tanımlama kısmından gsm modül, röle ler, ledler ve usb debug için seri port bağlantısı incelenebilir.

Hangi röle/led açık kapalı öğrenmek için stat mesajı atınca röle/Led durumları sms atan numaraya mesajla gönderiliyor.
#Hatırlatma:
Sistem sms üzerinden çalıştığı için gelen text veri telit gm862'nin gönderdiği formatta göre düzenlendi. Farklı gsm modül kullanımında .substring ile başlayan bütün fonksiyonlar kendi modülünüze göre revize edilmelidir.
#Hatırlatma:
Gsm modüller genelde 2.8 ile 3 volt ttl seviyede iletişim kurarlar. Arduino Due 3.3 volt ttl seviyesi verdiği için çok problem yok ama aynı işlemleri arduino mega ile yapmak isterseniz gerilim bölücü yada logic level converter kullanmanız gerekir. Gsm modül seri portuna 5v sinyal vermek modüle zarar verebilir. Aklınızda bulunsun.

Projenin tam ve çalışan kodlarıdır.

Projenin ingilizce açıklamasına hackster.io/FiDeNet adresinden ulaşabilirsiniz.

Kodlar burada.
#include <LiquidCrystal.h>
const int rs = 37, en = 35, d4 = 33, d5 = 31, d6 = 29, d7 = 27;
#define led0 26
#define led1 28
#define led2 30
#define led3 32
#define led4 34
#define led5 36
#define led6 38
#define led7 40
#define led8 42
#define led9 44
#define ledA 46
#define ledB 48
#define ledC 50
#define ledD 52

#define rl0 53
#define rl1 51
#define rl2 49
#define rl3 47
#define rl4 45
#define rl5 43
#define rl6 41
#define rl7 39


int rl0Stat;
int rl1Stat;
int rl2Stat;
int rl3Stat;
int rl4Stat;
int rl5Stat;
int rl6Stat;
int rl7Stat;


//LCD backlight için pwm pini
#define pinDimm 8
//LCD backlight için pwm değeri
int dimm;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);



int led0Stat=0;
int led1Stat=0;
int led2Stat=0;
int led3Stat=0;
int led4Stat=0;
int led5Stat=0;
int led6Stat=0;
int led7Stat=0;
int led8Stat=0;
int led9Stat=0;
int ledAStat=0;
int ledBStat=0;
int ledCStat=0;
int ledDStat=0;

#define pinGsmOnOff 9
#define pinGsmState 10

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)
{
  Serial.print("cmd: ");
  Serial.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);
      }
    
    }
    Serial.print("sayac:");
    Serial.println(sayac);
  if (Serial3.available()>0)
  {
    ser3Data=Serial3.readString();
    Serial.print("Veri: ");
    Serial.println(ser3Data);
    if(ser3Data.startsWith("\r\n+CMGL:"))
    {
    //String smsBody=ser3Data;
    //smsBody.replace('\n','_');
    //smsBody.replace('\r','_');
    
    //Serial.print("smsBody:");
    //Serial.println(smsBody);
    telNum=ser3Data.substring(26,39);
    Serial.print("Tel Num:");
    Serial.println(telNum);
    
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("T:");
    lcd.print(telNum);
    lcd.setCursor(0,1);
    lcd.print("SMS:");
    lcd.print(ser3Data.substring(42,46));
    
//0
    if (ser3Data.substring(42,46)=="L0ON")
      {
        led0Stat=HIGH;
        digitalWrite(led0,led0Stat);
      } 
      if (ser3Data.substring(42,47)=="L0OFF")
      {
        led0Stat=LOW;
        digitalWrite(led0,led0Stat);
      }
//1
      if (ser3Data.substring(42,46)=="L1ON")
      {
        led1Stat=HIGH;
        digitalWrite(led1,led1Stat);
      } 
      if (ser3Data.substring(42,47)=="L1OFF")
      {
        led1Stat=LOW;
        digitalWrite(led1,led1Stat);
      }
//2
      if (ser3Data.substring(42,46)=="L2ON")
      {
        led2Stat=HIGH;
        digitalWrite(led2,led2Stat);
      } 
      if (ser3Data.substring(42,47)=="L2OFF")
      {
        led2Stat=LOW;
        digitalWrite(led2,led2Stat);
      }
//3
      if (ser3Data.substring(42,46)=="L3ON")
      {
        led3Stat=HIGH;
        digitalWrite(led3,led3Stat);
      } 
      if (ser3Data.substring(42,47)=="L3OFF")
      {
        led3Stat=LOW;
        digitalWrite(led3,led3Stat);
      }
//4
      if (ser3Data.substring(42,46)=="L4ON")
      {
        led4Stat=HIGH;
        digitalWrite(led4,led4Stat);
      } 
      if (ser3Data.substring(42,47)=="L4OFF")
      {
        led4Stat=LOW;
        digitalWrite(led4,led4Stat);
      }
//5
      if (ser3Data.substring(42,46)=="L5ON")
      {
        led5Stat=HIGH;
        digitalWrite(led6,led6Stat);
      } 
      if (ser3Data.substring(42,47)=="L5OFF")
      {
        led5Stat=LOW;
        digitalWrite(led5,led5Stat);
      }
//6
      if (ser3Data.substring(42,46)=="L6ON")
      {
        led6Stat=HIGH;
        digitalWrite(led6,led6Stat);
      } 
      if (ser3Data.substring(42,47)=="L6OFF")
      {
        led6Stat=LOW;
        digitalWrite(led6,led6Stat);
      }
//7
      if (ser3Data.substring(42,46)=="L7ON")
      {
        led7Stat=HIGH;
        digitalWrite(led7,led7Stat);
      } 
      if (ser3Data.substring(42,47)=="L7OFF")
      {
        led7Stat=LOW;
        digitalWrite(led7,led7Stat);
      }
//8
      if (ser3Data.substring(42,46)=="L8ON")
      {
        led8Stat=HIGH;
        digitalWrite(led8,led8Stat);
      } 
      if (ser3Data.substring(42,47)=="L8OFF")
      {
        led8Stat=LOW;
        digitalWrite(led8,led8Stat);
      }
//9
      if (ser3Data.substring(42,46)=="L9ON")
      {
        led9Stat=HIGH;
        digitalWrite(led9,led9Stat);
      } 
      if (ser3Data.substring(42,47)=="L9OFF")
      {
        led9Stat=LOW;
        digitalWrite(led9,led9Stat);
      }
//A
      if (ser3Data.substring(42,46)=="LAON")
      {
        ledAStat=HIGH;
        digitalWrite(ledA,ledAStat);
      } 
      if (ser3Data.substring(42,47)=="LAOFF")
      {
        ledAStat=LOW;
        digitalWrite(ledA,ledAStat);
      }
//B
      if (ser3Data.substring(42,46)=="LBON")
      {
        ledBStat=HIGH;
        digitalWrite(ledB,ledBStat);
      } 
      if (ser3Data.substring(42,47)=="LBOFF")
      {
        ledBStat=LOW;
        digitalWrite(ledB,ledBStat);
      }
//C
      if (ser3Data.substring(42,46)=="LCON")
      {
        ledCStat=HIGH;
        digitalWrite(ledC,ledCStat);
      } 
      if (ser3Data.substring(42,47)=="LCOFF")
      {
        ledCStat=LOW;
        digitalWrite(ledC,ledCStat);
      }
//D
      if (ser3Data.substring(42,46)=="LDON")
      {
        ledDStat=HIGH;
        digitalWrite(ledD,ledDStat);
      } 
      if (ser3Data.substring(42,47)=="LDOFF")
      {
        ledDStat=LOW;
        digitalWrite(ledD,ledDStat);
      }
//Röle Kontrol
//0
      if (ser3Data.substring(42,46)=="R0ON")
      {
        rl0Stat=HIGH;
        digitalWrite(rl0,rl0Stat);
      } 
      if (ser3Data.substring(42,47)=="R0OFF")
      {
        rl0Stat=LOW;
        digitalWrite(rl0,rl0Stat);
      }
//1
      if (ser3Data.substring(42,46)=="R1ON")
      {
        rl1Stat=HIGH;
        digitalWrite(rl1,rl1Stat);
      } 
      if (ser3Data.substring(42,47)=="R1OFF")
      {
        rl1Stat=LOW;
        digitalWrite(rl1,rl1Stat);
      }
//2
      if (ser3Data.substring(42,46)=="R2ON")
      {
        rl2Stat=HIGH;
        digitalWrite(rl2,rl2Stat);
      } 
      if (ser3Data.substring(42,47)=="R2OFF")
      {
        rl2Stat=LOW;
        digitalWrite(rl2,rl2Stat);
      }
//3
      if (ser3Data.substring(42,46)=="R3ON")
      {
        rl3Stat=HIGH;
        digitalWrite(rl3,rl3Stat);
      } 
      if (ser3Data.substring(42,47)=="R3OFF")
      {
        rl3Stat=LOW;
        digitalWrite(rl3,rl3Stat);
      }
//4
      if (ser3Data.substring(42,46)=="R4ON")
      {
        rl4Stat=HIGH;
        digitalWrite(rl4,rl4Stat);
      } 
      if (ser3Data.substring(42,47)=="R4OFF")
      {
        rl4Stat=LOW;
        digitalWrite(rl4,rl4Stat);
      }
//5
      if (ser3Data.substring(42,46)=="R5ON")
      {
        rl5Stat=HIGH;
        digitalWrite(rl5,rl5Stat);
      } 
      if (ser3Data.substring(42,47)=="R5OFF")
      {
        rl5Stat=LOW;
        digitalWrite(rl5,rl5Stat);
      }
//6
      if (ser3Data.substring(42,46)=="R6ON")
      {
        rl6Stat=HIGH;
        digitalWrite(rl6,rl6Stat);
      } 
      if (ser3Data.substring(42,47)=="R6OFF")
      {
        rl6Stat=LOW;
        digitalWrite(rl6,rl6Stat);
      }
//7
      if (ser3Data.substring(42,46)=="R7ON")
      {
        rl7Stat=HIGH;
        digitalWrite(rl7,rl7Stat);
      } 
      if (ser3Data.substring(42,47)=="R7OFF")
      {
        rl7Stat=LOW;
        digitalWrite(rl7,rl7Stat);
      }

      
      if (ser3Data.substring(42,46)=="Stat")
      {
        String smsText="Led States\r\n 0:" + String(led0Stat) + "\r\n1:" + String(led1Stat)+ "\r\n2:" + String(led2Stat)+ "\r\n3:" + String(led3Stat)+ "\r\n4:" + String(led4Stat)+ "\r\n5:" + String(led5Stat)+ "\r\n6:" + String(led6Stat)+ "\r\n7:" + String(led7Stat)+ "\r\n8:" + String(led8Stat)+ "\r\n9:" + String(led9Stat)+ "\r\nA:" + String(ledAStat)+ "\r\nB:" + String(ledBStat)+ "\r\nC:" + String(ledCStat) + "\r\nD:" + String(ledDStat)+"\r\n Relay States\r\n 0:" + String(rl0Stat)+ "\r\n1:" + String(rl1Stat)+ "\r\n2:" + String(rl2Stat)+ "\r\n3:" + String(rl3Stat)+ "\r\n4:" + String(rl4Stat)+ "\r\n5:" + String(rl5Stat)+ "\r\n6:" + String(rl6Stat)+ "\r\n7:" + String(rl7Stat);
        
        sendSms(telNum,smsText);
      }
  /*
      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(led0,OUTPUT);
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(led3,OUTPUT);
  pinMode(led4,OUTPUT);
  pinMode(led5,OUTPUT);
  pinMode(led6,OUTPUT);
  pinMode(led7,OUTPUT);
  pinMode(led8,OUTPUT);
  pinMode(led9,OUTPUT);
  pinMode(ledA,OUTPUT);
  pinMode(ledB,OUTPUT);
  pinMode(ledC,OUTPUT);
  pinMode(ledD,OUTPUT);

  pinMode(rl0,OUTPUT);
  pinMode(rl1,OUTPUT);
  pinMode(rl2,OUTPUT);
  pinMode(rl3,OUTPUT);
  pinMode(rl4,OUTPUT);
  pinMode(rl5,OUTPUT);
  pinMode(rl6,OUTPUT);
  pinMode(rl7,OUTPUT);

  pinMode(pinGsmOnOff,OUTPUT);
  pinMode(pinGsmState,INPUT);

  lcd.begin(16, 2);
  lcd.print("TOBB Fen Lisesi");
  dimm=100;
  //LCD backlight pwm
  analogWrite(pinDimm,dimm);
 
  
  Serial.begin(115200);
  delay(500);
  Serial3.begin(115200);
  delay(500);
  Serial.println("merhaba");
  gsmModuleCheck();
  processPlanner=0;
}

void loop() {
  // put your main code here, to run repeatedly:
  
  if (Serial3.available()>0)
  {
    data=Serial3.readString();
    Serial.print("GSM:");
    Serial.println(data);
    if (data.startsWith("\r\n+CMTI"))
    {
      Serial.println("SMS Alindi");
      Serial.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

Aynı kodlar üzerinde /* */ işaretleri ile kapatılan bölüm sms gönderildiğinde konumunuzu Google maps linki olarak sms gönderiyor. Loc text ile sms göndermek yeterli.
Burada da gpsacp komutunun çıktısı referans alınıp text-parse işlemi yapıldığını ve başka modül kullanılacak sa parse işlemi kodlarının revize edilmesi gerektiğini hatırlatayım.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

Sozuak

Aynı parçalardan elimde var benim de. Denemek için iyi bir proje. Elinize sağlık.