مهندس موفق الکترونیک

ساخت مسیریاب مکانی با استفاده از SIM800 و آردوینو

ساخت مسیریاب مکانی با استفاده از GSM SIM800 و آردوینو

خودروهایی با رانندگی خودکار و وسایل نقلیه متصل، قطعا نحوه‌ی ارتباطات ما را تغییر خواهند داد. امروزه شرکت‌هایی مانند Tesla صاحبان خودروها را تشویق می‌کنند تا خودروهای خود را، هنگامی ‌که از آنها استفاده نمی‌کنند به عنوان  روبات‌های تاکسی به آنها قرض دهند. مدیر شرکت تسلا، ایلان ماسک اخیراً در توییتر اعلام کرد که تا سال 2020 حدود 1 میلیون تاکسی روباتی در جاده‌ها حضور خواهد داشت.

با وجود خودروهای بدون سرنشین حامل مسافر و کامیون‌های حامل محموله‌های ارزشمند، وجود یک سیستم مدیریت ناوگان احساس می‌شود، سیستمی ‌که مکان این خودروها را دنبال کرده و مطمئن گردد که در زمان مناسب در مکان مناسب خواهند بود. در حالت کلی از یک ماژول GPS برای هر نوع مکان‌یابی استفاده می‌شود، اما اینجا در این مقاله  ما از ماژول GSM SIM800 برای ساخت یک ردیاب مکانی ساده همراه با آردوینو استفاده می‌کنیم. سیستم ردیابی GPRS از طریق مودم GSM و میکروکنترلر (آردوینو) عمل می‌کند و روی یک PCB از PCBGOGO ساخته می‌شود. این سیستم به گونه‌ای عمل می‌کند که با برقراری تماس تلفنی از ماژول GSM، ماژول مکان را بررسی کرده و آن را به صورت پیام متنی شامل لینک نقشه گوگل، به شماره‌ای که تماس از آن برقرار شده ارسال می‌کند. وقتی که لینک روی تلفن باز می‌شود، مکان مودم روی نقشه گوگل  نمایش داده می‌شود. جالب به نظر میرسد نه؟! با ما همراه باشید.

دیاگرام مدار

سیستم ردیاب خودرو GSM از GPRS ماژول SIM800 GSM استفاده می‌کند، که به یک میکروکنترلر مانند آردوینو متصل شده است. اگرچه هم آردوینو و هم ماژول GSM به صورت جداگانه قابل تهیه هستند تصمیم گرفتیم که مدار خود را به گونه‌ای تنظیم کنیم که هر دو را روی یک بورد ترکیب کرده تا در فضا و هزینه صرفه‌جویی شود. بورد را می‌توان با یک اداپتور ۱۲ ولتی و یا یک باتری ۱۲ ولتی خودرو/کامیون تغذیه کرد، مبدل باک روی برد ولتاژ را از ۱۲ ولت به ۴ ولت برای ماژول GSM و به ۳.۳ ولت برای آردوینو پایین می‌آورد. دیاگرام مداری کامل در زیر آمده است.

ساخت مسیریاب مکانی با استفاده از GSM SIM800 و آردوینو

ساخت مسیریاب مکانی با استفاده از GSM SIM800 و آردوینو

در زیر بخش‌های مختلف مدار را به چند بلوک تقسیم کرده و توضیح می‌دهیم تا مطمئن گردیم که شما قادر به استفاده و یا ویرایش آنها مطابق نیاز خودتان خواهید بود.

ماژول توان LM2596

ما از آی‌سی رگولاتور LM2596 Buck، برای فراهم کردن ولتاژ ۴ ولت برای ماژول SIM800 از ورودی ۱۲ ولت استفاده کرده ایم. ماژول SIM800 هنگام راه‌اندازی اولیه و جستجوی شبکه، به جریان پیک حدود ۲ آمپر نیاز دارد و بنابراین، منبع تغذیه باید بتواند این جریان را تحمل کند در غیر این صورت، ماژول وارد حالت shutdown می‌شود، به همین دلیل هم آی‌سی LM2596 انتخاب شده که تا جریان ۳ آمپر را تحمل می‌کند. مدار رگولاتور منبع تغذیه به صورت زیر است.

ساخت مسیریاب مکانی با استفاده از GSM SIM800 و آردوینو

ولتاژ ۱۲ ولت تنظیم نشده به پین ۱ اعمال گردیده و ولتاژ تنظیم شده از پین ۲ گرفته می‌شود، و از یک فلیتر LC با مقدار 100uH و 470uF عبور کرده تا نویزهای سوئیچینگ حذف گردد. ولتاژ خروجی را می‌توان با استفاده از مقاومت‌های R30 و R29، که یک مقسم ولتاژ ایجاد می‌کنند و همانند شکل به پین فیدبک متصل هستند تنظیم کرد. فرمول محاسبه ولتاژ خروجی برای LM2596 به صورت زیر است.

Vout = 1.23 * ((R1+R2)/R1)

در دیاگرام ما، مقاومت R29 ،R1 و مقاومت R30 برابر R2 است. برای مقاومت R29 مقدار ۱ کیلواهم و برای مقاومت R29 مقدار ۲.۲ کیلواهم را انتخاب کرده تا به ولتاژ ۴ ولت دست پیدا کنیم. دقت کنید که ماژول SIM800 ولتاژ را بین ۳.۷ ولت تا ۴.۲ ولت مجدداً به دست آورده تا به صورت نرمال کار کند.

توان‌دهی و ارتباط با آی‌سی SIM800

مودم SIM800 GSM معمولاً به اندازه مودم‌های معمولی در دسترس است، اما ما از آی‌سی خام استفاده کردیم تا فضا و هزینه برد را کاهش دهیم. استفاده از مودم SIM800 بسیار آسان است، تنها نیاز است که آی‌سی را از طریق  پین VBAT و GND توان دهیم و پین PWR KEY را برای فعال کردن مودم  به مدت ۱ ثانیه پایین بکشیم. به صورت پیش‌فرض، پین از طریق یک مقاومت به صورت داخلی به VBAT بالاکش شده است.

ساخت مسیریاب مکانی با استفاده از GSM SIM800 و آردوینو

ولتاژ برای VBAT از ولتاژ تنظیم شده (GSM_VCC) آی‌سی LM2596 می‌آید. نام پین VBAT است زیرا معمولاً با یک باتری لیتیومی‌ تغذیه می‌شود، بنابراین اگر از آن بر روی دستگاه‌های قابل حمل استفاده کنید، در آن صورت می‌توانید مدار LM2596 را نادیده گرفته و آن را مستقیماً به باتری لیتیوم پلیمری وصل کنید. پس از آن پین‌های شبکه را داریم که به یک جای سیم کارت ۶ پینه وصل شده‌اند. پین NETLIGHT به یک LED متصل است. این LED، به عنوان یک LED وضعیت برای نمایش وضعیت شبکه عمل می‌کند، هرچند استفاده از آن دلخواه است. به صورت مشابه، از پین BT_ANT می‌توان برای اتصال یک آنتن به ماژول استفاده کرد تا کار وصل شدن به شبکه را آسان‌تر گرداند، که باز هم اختیاری است.

درنهایت، پین‌های TxD RxD به یک پین هدر متصل شده‌اند، این دو پین برای ارتباط با یک میکروکنترلر مانند آردوینو از طریق پروتکل استاندارد UART در 9600 buad rate استفاده می‌شوند. دیگر اتصالات نشان داده شده در مدار بالا اختیاری بوده و تاثیر چندان مهمی ‌بر این پروژه ندارند.

مطلب پیشنهادی:  تغییر شدت نور LED با آردوینو

بخش میکروکنترلری مکان‌نمای GSM

در سمت میکروکنترلر ما چیپ ATMEGA328P از AVR را داریم، که در آردوینو UNO/Nano  به کار می‌رود، اما در اینجا کنترلر مستقیماً روی برد جاسازی شده تا با ماژول SIM800 ارتباط برقرار کند. از آنجایی که ماژول SIM800 در منطق ۳.۳ ولت عمل می‌کند، تصمیم گرفتیم از خود چیپ ATmega328 نیز با ۳.۳ ولت استفاده کنیم، زیرا این میکرو خود از دو ولتاژ کاری ۳.۳ ولت و ۵ ولت بهره می‌گیرد.

ساخت مسیریاب مکانی با استفاده از GSM SIM800 و آردوینو

همانطور که در بالا میبینید ما از آی‌سی رگولاتور AMS1117 3.3V برای تنظیم ولتاژ از ورودی ۱۲ ولت استفاده کرده‌ایم و از طریق آن آی‌سی Atmega328 را تغذیه کرده‌ایم. اگرچه SIM800 با سطح منطق ۳.۳ ولت عمل می‌کند، می‌تواند بدون نیاز به هیچ مبدل سطح منطقی، با آردوینو Uno/Nano به صورت خارجی ارتباط برقرار کند. مدار همچنین برخی پین‌ها را به یک پین هدر وصل کرده تا مشابه اردوینو Pro mini در حالت ۳.۳ ولت، بتوانیم از طریق پروگرامر FTDI آی‌سی Atmega328 را برنامه‌ریزی کنیم.

اتصال برد به اردوینو Nano

هدر روی بورد با برچسب P2 را می‌توان مستقیماً به آردوینو Nano متصل کرد. ما پین‌ها را مطابق جدول زیر اتصال داده‌ایم.

Arduino Nano

SIM800

Pin D12

PWR_KY

Pin D11

TxD

Pin D10

RxD

Gnd

GND

Power key متصل به پین D12 برای فعال/غیرفعال کردن ماژول پس از روشن شدن آن استفاده می‌شود، این کار منجر به ذخیره توان در زمان‌هایی می‌شود که از ماژول استفاده نمی‌گردد. پین D11 و پین D12 به ترتیب به Tx و Rx متصل شده‌اند، ما آردوینو را به گونه‌ای برنامه‌ریزی می‌کنیم که از این پین‌ها برای برقراری ارتباط سریال با بورد استفاده کند. پس از برقراری اتصالات بورد به ترتیب زیر خواهد بود.

ساخت مسیریاب مکانی با استفاده از GSM SIM800 و آردوینو

برنامه‌ریزی آردوینو برای سیستم ردیابی خودرو GPRS

کل پروژه را می‌توان به سه بخش اصلی، یعنی دریافت تماس از کاربر، دریافت مختصات GPS از SIM800، و ارسال داده‌های GPS به تماس گیرنده از طریق پیام کوتاه تقسیم کرد. تا اینجا با نحوه‌ی ارسال پیام با استفاده از ماژول GSM و آردوینو و مدیریت تماس‌ها با ماژول GSM آشنا شدیم، بنابراین بیشتر از این راجع به آنها صحبت نخواهیم کرد.

دریافت مختصات جغرافیایی مکان‌ها (طول و عرض) از ماژول SIM800 GSM

دریافت مختصات از GPS در مقایسه با GSM آسان‌تر می‌باشد. دستورات AT زیر را برای دریافت اطلاعات مکان در فرمت DD از ماژول SIM800 به کار می‌بندیم.

توضیح

دستورAT

اتصال سیم کارت به GPROS

AT+CGATT=1

فعال کردن پروفایل حامل(bearer profile) با اتصال نوع GPRS

AT+SAPBR=3,1,”CONTYPE”,”GPRS”

تعیین VPN برای پروفایل حامل

AT+SAPBR=3,1,”APN”,”RCMNET”

بازکردن پروفایل حامل

AT+SAPBR=1,1

گرفتن آدرس IP پروفایل حامل

AT+SAPBR=2,1
درخواست برای مکان پین کد (Pincode)، طول و عرض

AT+CIPGSMLOC=1,1

وقتی که دستورات مستقیماً از طریق پورت سریال اجرا می‌شوند پاسخی مشابه شکل زیر دارند.

ساخت مسیریاب مکانی با استفاده از GSM SIM800 و آردوینو

در شکل بالا دور مکان نهایی خط کشیده‌ایم. همانطور که میبینید پاسخ به دستور «AT+CIPGSMLOC=1,1» چیزی شبیه زیر خواهد بود

+CIPGSMLOC: 0,75.802460,26.848892,2019/04/23,08:32:35

وقتی که پین کد مکان صفر است، (در کشور هند قابل دریافت نیست) ۲۶.۸۴۸۸۸۳۲ عرض و ۷۵.۸۰۲۴۶۰ طول می‌باشد. بنابراین این مقادیر را از نتایج حاصله جدا کرده و آن را به یک لینک نقشه گوگل اضافه می‌کنیم تا روی نقشه به این مکان اشاره شود. لینک چیزی شبیه شکل زیر خواهد بود.

https://www.google.com/maps/place/26.8488892,75.802460

از کد اردوینو برای انجام این کار استفاده می‌کنیم و لینک را هنگام درخواست از طریق SMS به تلفن‌مان ارسال می‌کنیم. مانند همیشه برنامه کامل همراه با ویدئو و جزئیات در انتهای صفحه آمده است، اما در اینجا برنامه را در بخش‌های کوچک توضیح خواهیم داد تا آن را بهتر درک کنید.

آردوینو به وسیله ارتباط سریال و دستور AT با ماژول SIM800 ارتباط برقرار می‌کند. برای هر دستور AT که می‌فرستیم ماژول به صورت کارکتر به کارکتر پاسخ می‌دهد و اگر نتیجه موفقیت‌آمیز باشد پیام با OK به پایان می‌رسد. بنابراین پیش از شروع به نوشتن برنامه، یک تابع با نام SIM800_send می‌نویسیم که یک دستور AT را به عنوان رشته دریافت کرده و آن را با استفاده از دستور SIM800.println به ماژول GSM می‌فرستد و با استفاده از تابع ()SIM800.read نتایج حاصله از ماژول SIM800 را گرفته و بازمی‌گرداند. تابع در زیر آمده است.

String SIM800_send(String incoming) //Function to communicate with SIM800 module
{
    SIM800.println(incoming); delay(100); //Print what is being sent to GSM module
    String result = "";
    while (SIM800.available()) //Wait for result
    {
    char letter = SIM800.read();
    result = result + String(letter); //combine char to string to get result
    }
return result; //return the result
}

درون تابع setup، ارتباط serial monitor و SIM800 را در نرخ 9600 baud آغاز می‌کنیم و همچنین پین ۱۲ (PWR_KY) را برای فعال کردن ماژول GSM به مدت ۱ ثانیه low می‌کنیم. سپس از تابعی که در بالا درست کردیم برای ارتباط با ماژول GSM بهره می‌گیریم. ابتدا اکو را با استفاده از دستور «ATE» فعال کرده و سپس دستوراتی که در بالا لیست شده بود را برای دریافت مختصات از ماژول GSM آغاز می‌کنیم. بعد از هر دستور AT، پاسخ را در serial monitor با هدف اشکال‌زدایی چاپ می‌کنیم، کد مربوطه در زیر آمده است.

void setup() {
//PWRKY pin of GSM module has to be pulled low for 1sec to enable the module
  pinMode(12,OUTPUT);
  digitalWrite(12, LOW);   //Pull-down
  delay(1000);                     
  digitalWrite(12, HIGH); //Release

  Serial.begin(9600); //Serial COM for debugging
  SIM800.begin(9600); //Software serial called SIM800 to speak with SIM800 Module

  delay(1000); //wait for serial COM to get ready

  responce = SIM800_send("ATE1"); //Enable Echo if not enabled by default
  Serial.print ("Responce:"); Serial.println(responce);
  delay(1000);

  responce = SIM800_send("AT+CGATT=1"); //Set the SIM800 in GPRS mode
  Serial.print ("Responce:"); Serial.println(responce);
  delay(1000);

  responce = SIM800_send("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\" "); //Activate Bearer profile
  Serial.print ("Responce:"); Serial.println(responce);
  delay(1000);

  responce = SIM800_send("AT+SAPBR=3,1,\"APN\",\"RCMNET\" "); //Set VPN options => 'RCMNET' 'www'
  Serial.print ("Responce:"); Serial.println(responce);
  delay(2000);

  responce = SIM800_send("AT+SAPBR=1,1"); //Open bearer Profile
  Serial.print ("Responce:"); Serial.println(responce); //Open bearer Profile
  delay(2000);

  responce = SIM800_send("AT+SAPBR=2,1"); //Get the IP address of the bearer profile
  Serial.print ("Responce:"); Serial.println(responce);
  delay(1000);
}

دقت کنید که از دستور AT آخر لیست، که در واقع مختصات مکان را اخذ می‌کند استفاده نکرده‌ایم. زیرا از آن تنها زمانی استفاده می‌کنیم که یک تماس روی ماژول GSM قرار دارد.

مطلب پیشنهادی:  راه اندازی سنسور دما LM35 با آردوینو

درون تابع loop، بررسی می‌کنیم که آیا ماژول چیزی برای گفتن دارد یا نه. اگر ماژول یک تماس دریافت کند، «RING» را چاپ خواهد کرد. بنابراین برنامه را به گونه‌ای تنظیم می‌کنیم که همه کارکترهای خروجی‌ها را برای بررسی عبارت RING به صورت رشته ترکیب کند و آن را مستقیماً با «RING» مقایسه کند. کد در زیر آمده است.

  if (SIM800.available()) { //Check if the SIM800 Module is telling anything
    char a = SIM800.read();
    Serial.write(a); //print what the module tells on serial monitor
    incoming = incoming + String(a);
    if (a == 13) //check for new line
    incoming =""; //clear the string if new line is detected
    incoming.trim(); //Remove /n or /r from the incomind data

    if (incoming=="RING") //If an incoming call is detected the SIM800 module will say "RING" check for it
    {

اگر RING تشخیص داده شود، زمان اخذ کردن داده‌های مکان است، داده را تریم (trim) کرده و آن را به یک لینک نقشه گوگل تبدیل می‌کنیم و در نهایت به صورت یک پیام کوتاه ارسال می‌کنیم. اما پیش از آن باید تماس ورودی را قطع کنیم، برای انجام این کار از دستور «ATH» استفاده می‌کنیم. سپس اکو را با دستور ATE غیرفعال کرده و با استفاده از دستور «AT+CIPGSMLOC=1,1» داده‌ی مکانی را از اینترنت می‌گیریم.

     Serial.println ("Sending sms"); delay(1000);
     responce = SIM800_send("ATH"); //Hand up the incoming call using ATH
     delay (1000);
     responce = SIM800_send("ATE0"); //Disable Echo
     delay (1000);
     responce = ""; Latitude=""; Longitude=""; //initialise all string to null
     SIM800.println("AT+CIPGSMLOC=1,1"); delay(5000); //Request for location data

مجددا، از همان روش حلقه while برای تبدیل کارکترهای خروجی به رشته استفاده می‌کنیم. همانطور که پیش از این صحبت کردیم، این بار رشته شامل پاسخ دستور «AT+CIPGSMLOC=1,1» می‌باشد که حاوی اطلاعات عرض و طول است. از تابع ()prepare_message برای تریم کردن مقدار عرض و طول استفاده می‌کنیم. همانطور که در پیام ساده زیر مشاهده می‌کنید.

+CIPGSMLOC: 0,75.802460,26.848892,2019/04/23,08:32:35

مقدار طول جغرافیایی پس از دستور اول شروع شده و پیش از دستور دوم به پایان می‌رسد. به طرز مشابه، مقدار عرض جغرافیایی پس از دستور دوم شروع شده و با کامای سوم به پایان می‌رسد. با استفاده از این ویژگی‌ها می‌توان عرض و طول جغرافیایی را با استفاده از کد زیر از برنامه اخذ کرد.

void prepare_message()
{
  //Sample Output for AT+CIPGSMLOC=1,1   ==> +CIPGSMLOC: 0,75.802460,26.848892,2019/04/23,08:32:35 //where 26.8488832 is Lattitude and 75.802460 is longitute
  int first_comma = responce.indexOf(','); //Find the position of 1st comma
  int second_comma = responce.indexOf(',', first_comma+1); //Find the position of 2nd comma
  int third_comma = responce.indexOf(',', second_comma+1); //Find the position of 3rd comma

  for(int i=first_comma+1; i<second_comma; i++) //Values form 1st comma to 2nd comma is Longitude
    Longitude = Longitude + responce.charAt(i);

  for(int i=second_comma+1; i<third_comma; i++) //Values form 2nd comma to 3rd comma is Latitude
    Latitude = Latitude + responce.charAt(i);

حال که مقادیر عرض و طول جغرافیایی را داریم باید آنها را با یک کامای مابین، به لینک اضافه کنیم. کد در زیر امده است.

  Serial.println(Latitude); Serial.println(Longitude);
  Link = Link + Latitude + "," + Longitude; //Update the Link with latitude and Logitude values

درنهایت، می‌توان لینک را به صورت پیام کوتاه به شماره موبایل ارسال کرد. در اینجا ما شماره موبایل را به صورت‌ هارد کد با دستور ”AT+CMGS=”0907923XXXX نوشته‌ایم، مراقب باشید که آن را با شماره موبایل خود جایگزین کنید.

SIM800.println("AT+CMGF=1"); //Set the module in SMS mode
     delay(1000);

     SIM800.println("AT+CMGS=\"907923XXXX\""); //Send SMS to this number
     delay(1000);

     SIM800.println(Link); // we have send the string in variable Link
     delay(1000);

     SIM800.println((char)26);// ASCII code of CTRL+Z - used to terminate the text message
     delay(1000);

تست دستگاه ردیابی GPRS

اتصالات را همانند آنچه در بالا صحبت کردیم برقرار کرده و کد را به آردوینو آپلود کنید. سیم کارت را قرار داده و اطمینان حاصل کنید که سیگنال شبکه حاصل شده است. یک راه برای انجام این کار مشاهده LED روی ماژول GSM است، که باید هر ۳ ثانیه چشمک بزند. اکنون monitor serial را باز کرده و باید پیام زیر را در صفحه مشاهده کنید.

ساخت مسیریاب مکانی با استفاده از GSM SIM800 و آردوینو

این بدان معناست که ماژول GSM برای اخذ مختصات تنظیم شده و آماده دریافت تماس‌های ورودی است. می‌توان به سادگی به شماره GSM SIM خود از هر شماره‌ای تماس گرفته و مشاهده کنید که تماس بعد از چند بار زنگ خوردن قطع می‌شود و یک پیام به شماره‌ای که در برنامه وارد کرده بودید ارسال می‌شود. پیام متنی شامل لینک نقشه گوگل به صورت زیر است.

مطلب پیشنهادی:  آموزش راه اندازی ESP8266 با استفاده از آردوینو

ساخت مسیریاب مکانی با استفاده از GSM SIM800 و آردوینو

روی لینک کلیک کرده و تلفن به صورت خودکار وارد Google maps شده و مکان دریافتی روی گوشی شما با یک پین قرمز رنگ مشخص می‌شود. آنگاه می‌توان به مکان مراجعه کرده و یا آدرس آن را گرفت. لینک بالا هنگامی ‌که باز می‌شود مانند تصویر زیر ظاهر می‌شود.

ساخت مسیریاب مکانی با استفاده از GSM SIM800 و آردوینو

همانطور که می‌بینید نقطه آبی مکانی است که GPS گوشی اخذ کرده و علامت قرمز مکانی است که ماژول GSM داده است. همانطور که انتظار می‌رفت به اندازه GPS دقیق نیست اما برای برخی کاربردها کماکان مناسب است و از آنجایی که از یک ماژول برای ارسال پیام و برقراری تماس استفاده شده است بسیار موثر می‌باشد. اگر می‌خواهید ردیابی مکانی با استفاده از GPS را ببنید لینک را دنبال کنید.

عملکرد کامل پروژه را می‌توانید در ویدئوی زیر مشاهده کنید. امیدواریم آن را دوست داشته باشید و از ساخت آن لذت برده باشید. اگر هرگونه سوالی داشتید در بخش کامنت‌ها آنها را مطرح کنید و یا از فروم مباحث تخصصی استفاده کنید.

کد

/*Program to send Latitude and Logitute Information from SIM800 to Phone via SMS on call request
 * Code by: B.Aswinth Raj
 * For: www.circuitdigest.com
 * Tr: Melec.ir
 * Dated:23-04-2019
 * Sample Output for AT+CIPGSMLOC=1,1   ==> +CIPGSMLOC: 0,75.802460,26.848892,2019/04/23,08:32:35 //where 26.8488832 is Lattitude and 75.802460 is longitute 
 * Link to send: https://www.google.com/maps/place/26.8488892,75.802460  //where 26.8488832 is Lattitude and 75.802460 is longitute 
 */

#include <SoftwareSerial.h> //Software Serial header to communicate with GSM module 

SoftwareSerial SIM800(10, 11); // RX, TX 

String Link = "The current Location is https://www.google.com/maps/place/"; //we will append the Lattitude and longitude value later int the program 
String responce = "";
String Longitude = "";
String Latitude = ""; 

String SIM800_send(String incoming) //Function to communicate with SIM800 module 
{
    SIM800.println(incoming); delay(100); //Print what is being sent to GSM module 
    String result = "";
    while (SIM800.available()) //Wait for result 
    {
    char letter = SIM800.read();
    result = result + String(letter); //combine char to string to get result 
    }
    
return result; //return the result 
}

void setup() {

//PWRKY pin of GSM module has to be pulled low for 1sec to enable the module 
  pinMode(12,OUTPUT);
  digitalWrite(12, LOW);   //Pull-down
  delay(1000);                      
  digitalWrite(12, HIGH); //Release 
 
  Serial.begin(9600); //Serial COM for debugging 
  SIM800.begin(9600); //Software serial called SIM800 to speak with SIM800 Module 

  delay(1000); //wait for serial COM to get ready 

  responce = SIM800_send("ATE1"); //Enable Echo if not enabled by default 
  Serial.print ("Responce:"); Serial.println(responce); 
  delay(1000);

  responce = SIM800_send("AT+CGATT=1"); //Set the SIM800 in GPRS mode 
  Serial.print ("Responce:"); Serial.println(responce); 
  delay(1000);

  responce = SIM800_send("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\" "); //Activate Bearer profile 
  Serial.print ("Responce:"); Serial.println(responce); 
  delay(1000);

  responce = SIM800_send("AT+SAPBR=3,1,\"APN\",\"RCMNET\" "); //Set VPN options => 'RCMNET' 'www'
  Serial.print ("Responce:"); Serial.println(responce); 
  delay(2000);
   
  responce = SIM800_send("AT+SAPBR=1,1"); //Open bearer Profile
  Serial.print ("Responce:"); Serial.println(responce); //Open bearer Profile 
  delay(2000);

  responce = SIM800_send("AT+SAPBR=2,1"); //Get the IP address of the bearer profile 
  Serial.print ("Responce:"); Serial.println(responce); 
  delay(1000);

}

void prepare_message()
{
  //Sample Output for AT+CIPGSMLOC=1,1   ==> +CIPGSMLOC: 0,75.802460,26.848892,2019/04/23,08:32:35 //where 26.8488832 is Lattitude and 75.802460 is longitute 
  int first_comma = responce.indexOf(','); //Find the position of 1st comma 
  int second_comma = responce.indexOf(',', first_comma+1); //Find the position of 2nd comma 
  int third_comma = responce.indexOf(',', second_comma+1); //Find the position of 3rd comma 

  for(int i=first_comma+1; i<second_comma; i++) //Values form 1st comma to 2nd comma is Longitude 
    Longitude = Longitude + responce.charAt(i); 

  for(int i=second_comma+1; i<third_comma; i++) //Values form 2nd comma to 3rd comma is Latitude 
    Latitude = Latitude + responce.charAt(i); 

  Serial.println(Latitude); Serial.println(Longitude); 
  Link = Link + Latitude + "," + Longitude; //Update the Link with latitude and Logitude values 
  Serial.println(Link);
}

String incoming = "";

void loop() {
  
  if (SIM800.available()) { //Check if the SIM800 Module is telling anything 
    char a = SIM800.read();
    Serial.write(a); //print what the module tells on serial monitor 
    incoming = incoming + String(a);
    if (a == 13) //check for new line 
    incoming =""; //clear the string if new line is detected 
    incoming.trim(); //Remove /n or /r from the incomind data 
    
    if (incoming=="RING") //If an incoming call is detected the SIM800 module will say "RING" check for it 
    {
     Serial.println ("Sending sms"); delay(1000);
     responce = SIM800_send("ATH"); //Hand up the incoming call using ATH
     delay (1000);
     responce = SIM800_send("ATE0"); //Disable Echo
     delay (1000);

     responce = ""; Latitude=""; Longitude=""; //initialise all string to null
     SIM800.println("AT+CIPGSMLOC=1,1"); delay(5000); //Request for location data 
      while (SIM800.available()) 
      {
       char letter = SIM800.read();
       responce = responce + String(letter); //Store the location information in string responce 
      }
      Serial.print("Result Obtained as:");   Serial.print(responce); Serial.println("*******");

     prepare_message(); delay(1000); //use prepare_message funtion to prepare the link with the obtained LAT and LONG co-ordinates 

     SIM800.println("AT+CMGF=1"); //Set the module in SMS mode
     delay(1000);
     
     SIM800.println("AT+CMGS=\"9612345678\""); //Send SMS to this number 
     delay(1000);

     SIM800.println(Link); // we have send the string in variable Link 
     delay(1000);

     SIM800.println((char)26);// ASCII code of CTRL+Z - used to terminate the text message 
     delay(1000);
    }
  }
  
  if (Serial.available()) { //For debugging 
    SIM800.write(Serial.read());
  }
  
}

ویدیو

اگر آموزش «ساخت مسیریاب مکانی با استفاده از GSM SIM800 و آردوینو» براتون مفید واقع شده ما را نیز دعا کنید و اگر خواستین می‌توانید از محتوا‌ی رایگان آموزشی حمایت مالی کنید. همچنین نظرات، پیشنهادات و درخواست‌های خود را در کامنت‌ها ⇓ بنویسید.

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

یک دیدگاه

  1. سلام
    ممنون از سایت خوبتون
    چند تا نکته راجع به این آموزش
    در دستورAT+SAPBR=3,1,”APN”,”RCMNET”
    بجای rcmnet برای سیمکارت همراه اول بایستی mcinet و برای ایرانسل mtnirancell قرار دهید.
    من نتونستم از AT+CIPGSMLOC=1,1 جواب بگیرم
    بجاش از دستور AT+CLBS=1,1 استفاده کردم