آردوینو arduino, آموزش, اینترنت اشیاء, پروژه آردوینو, توصیه شده

ساخت ردیاب با GPS و ارسال پیام با ماژولSIM808 و آردوینو

راه اندازی GPS با SIM808
بعضی اوقات نیاز است که برای برخی از پروژه‌ها یک ردیاب درست کنید، حالا این ردیاب ممکن است که برای خودروهای شخصی یا ردیابی اشخاص و یا برای کارهای دیگری که مدنظر است به کار رود. حال مسئله‌ای که وجود دارد این است که چطور باید این کار را انجام داد. دقت کنید نکته‌ای که در ساخت ردیاب‌ها بسیار حائز اهمیت است، اندازه برد و توان مصرفی است، که این پارامترها کاملا بستگی به نوع پروژه دارد. فرض کنید برای یک خودرو شخصی ردیاب درست می‌کنید، مسلما در این نوع پروژه‌ها شما با محدودیت فضا مواجه هستید که باید حتما آن را در نظر بگیرید. در این مقاله می‌خواهیم اطلاعات GPS ماژول SIM808 را توسط آردوینو دریافت و سپس در قالب یک پیام به همراه نقشه گوگل (GoogleMap) به مخاطب ارسال کنیم. برای انجام این پروژه به موارد زیر نیاز است: ماژول سیم SIM808 آنتن GPS و GSM راه اندازی SIM808 با آردوینو آردوینو UNO برد آردینو UNO   خب همانطور که می‌دانید یک پروژه الکترونیکی از دو بخش کدنویسی و طراحی سخت افزار تشکیل شده است، البته هر کدام از این دو بخش برای خود یک دنیای کاملا مجزایی است که حرفه‌ای شدن در هر یک از این‌ها مستلزم تلاش بی‌وقفه است. در این آموزش تمرکز ما صرفا روی بخش اول، یعنی کدنویسی است.

کدنویسی ماژول SIM808

توصیه‌ای که می‌کنیم قبل از خواندن این بخش، مقاله راه اندازی GSM Modem با آردوینو (MC60) را مطالعه کنید.
در این بخش به موارد زیر می‌پردازیم.
  • راه اندازی GPS
  • ارسال پیام
  • دریافت پیام
  • تنظیمات فعال سازی
  • اعلام موجودی
  • شناسایی اپراتور
  • تغییر زبان سیم کارت به انگلیسی
  • دریافت شماره تلفن
  • معرفی تابع فیلتر پیام
  • حذف پیام‌های دریافتی جهت مدیرت حافظه
  • ارسال پیام به همراه مختصات GoogleMap
  • معرفی تابع فیلتر برای بدست آوردن مقادیر GPS
  • معرفی تابع ارسال پیام به همراه داشتن TimeOut و Debug
نکته: تمامی قابلیت‌ها با کمی خلاقیت قابل تعمیم برای تمام میکروکنترلرهای دیگر هم می‌باشد

راه اندازی GPS با SIM808

برای راه‌اندازی این قسمت نیاز است که یک دید کلی نسبت به دیتاشیت این ماژول داشته باشیم تا بتوانیم کار موردنظر خود را انجام دهیم.
دقت کنید که دستورات GPS این ماژول کمی دچار تغییر شده‌اند و این اشتباه را نکنید که دستورات را طبق دیتاشیت‌های قدیمی این ماژول وارد کنید چون به احتمال زیاد دچار خطا خواهید شد. البته این روند برای ورژن های جدید ماژول های این شرکت صادق می‌باشد.
به طور مثال اگر دستور روشن کردن GPS را به صورت AT+CGPSPWR=1 وارد کنید ماژول EEROR را نمایش خواهد داد حال برای رفع این موضوع فقط کافیست که دستور را به صورت AT+CGNSPWR=1 وارد کنید و به طور کلی می‌توان گفت که به جای GPS واژه GNS قرار دهید. دلیل اینکار هم این است که در سری های قبلی این ماژول‌ها از سیستم GPS پشتیبانی می‌شد اما چند سالی است که ورژن‌های جدید این ماژول ها از سیستم GNSS پشتیبانی می‌کنند و همین امر سبب تغییر برخی از دستورات ماژول شده است. خب برای راه اندازی GPS ماژول SIM808 به دستورات زیر نیاز داریم.
  • AT+CGNSPWR=1 روشن کردن GPS
  • AT+CGNSPWR=0 خاموش کردن GPS
  • AT+CGNSINF ارسال اطلاعات
این تابع جهت دیباگ GPS به کار می‌رود به صوریکه اطلاعاتی از قبیل طول و عرض جغرافیایی را روی سریال مانیتور نمایش می‌دهد و از این طریق به راحتی می‌توانید تشخیص دهید که پارامترهای GPS را دریافت کرده اید.

ارسال پیام در SIM808

این تابع همانطور که از اسمش هم مشخص است صرفا برای ارسال پیام نوشته شده است که عملکرد آن به صورت زیر است.

فعال سازی SIM808

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

دریافت پیام در SIM808

این تابع صرفا برای تشخیص پیام‌های ورودی است که به سیمکارت ارسال می‌شود و درصورتیکه پیام دریافتی در کد تعریف شده باشد وارد شرط مربوطه شده و کار مربوط به خود را انجام می‌دهد، در غیر اینصورت پیام خوانده نخواهد شد و در نهایت حذف می‌شود.

تشخیص اپراتور در SIM808

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

دریافت اعلام موجودی در SIM808

این تابع موجودی سیمکارت را برمی‌گرداند، که عملکرد آن همانطوری که مشخص شده است یک کد USSD برای اپرتور ارسال می‌کند در صورتیکه زبان اپراتور به زبان انگلیسی تعییر کرده باشد به راحتی موجودی سیمکارت را برای مخاطب موردنظر ارسال می‌کند.

تغییر زبان اپراتور به زبان انگلیسی در SIM808

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

دریافت شماره تلفن در SIM808

این تابع کار دریافت شماره تلفن‌های ورودی را برعهده دارد به طوریکه هر شماره‌ای که بخواهد پیام دهد، ابتدا توسط این تابع شماره ورودی دریافت می‌شود.

ارسال پیام توسط نقشه GoogleMap

برای این کار نیاز داریم که لینک گوگل را پیدا کنیم که دقیقا با چه فرمتی نوشته شده است و دقیقا همان فرمت را پیاده سازی کنیم. اگر به خط بالا دقت کنید می‌بینید که دارای مقادیر مختلفی است حالا این اعداد چه چیزی را بیان می‌کنند؟ این اعداد دقیقا همان طول و عرض جغرافیایی هستند، کاری هم که ما باید انجام دهیم دقیقا بدست آوردن همین مقادیر است و در نهایت جایگزین کردن مقادیر بدست آمده در مختصات GoogleMap.
نکته: حتی اگر یک نقطه اضافی در مختصات قرار بگیرید گوگل آن مختصات را شناسایی نخواهد کرد پس باید فیلتر کردن مقادیر به درستی صورت بگیرد اگر به هر دلیلی پس از اجرای پروژه موقعیت مکانی که ارسال شد گوگل مپ آن را شناسایی نکرد، به احتمال زیاد مشکل از فرمت اطلاعات ارسال شده است.
فرمت صحیح به صورت خط زیر می‌باشد:  

تابع GPS

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

تابع ارسال پیام به همراه داشتن TimeOut و Debug

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

نحوه اتصال برد آردوینو به SIM808

نحوه اتصال SIM808 به آردوینو خب حالا وقت تلفیق کدها با یکدیگر رسیده است که تمامی آپشن‌ها را در قالب یک کد پیاده سازی کنیم. نکته‌ای که حائز اهمیت است، این مقاله صرفا آموزشی است و به روش‌های بسیار ساده کدنویسی شده است تا خوانایی کد برای تمامی خوانندگان واضح باشد. طبق کد بالا هر 1 ثانیه یک بار مختصات به روز می‌شوند. و در نهایت اگر همه چیز به درستی صورت گرفته باشد باید به جواب شکل زیر برسید.   امیدواریم که این آموزش هم برای شما مفید واقع شده باشد. با سیسوگ همراه باشید.  
BLO OM

درباره BLO OM

«السَّلَامُ عَلَیْکَ یَا أَبَا عَبْدِ اللَّهِ، السَّلَامُ عَلَیْکَ وَ رَحْمَهُ اللَّهِ وَ بَرَکَاتُهُ».

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

نوشته های مشابه

پاسخی بگذارید

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

28 دیدگاه در “ساخت ردیاب با GPS و ارسال پیام با ماژولSIM808 و آردوینو

  1. محمدی گفت:

    سلام میتونید بگید که کدوم کد هارو زیر void setup بنویسیم وکدوم زیر void loop

    1. زئوس Zeus زئوس Zeus گفت:

      خوب خیلی بستگی به خودتون داره آخه
      تابع setup یک بار بعد از روشن شدن و به کار افتادن آردینو اجرا خواهد شد و تابع لوپ به شکل مداوم صدا زده میشه

  2. محمدی گفت:

    سلام کد هارو باید زیر void setup نوشت یا زیرvoid loop نوشت

  3. مهرداد گفت:

    سلام دوستان . من این برنامه را برای کار با آردوینو نانو دانلود کردم و در همان ابتدا خطای costumer , Phone خطا میگیرد.

    1. زئوس Zeus زئوس Zeus گفت:

      دیگر دوستان هم همین مشکل رو داشتند
      کامنت ها رو مطالعه کنید احتمالا جوب سوالتون رو پیدا کنید.

  4. علی گفت:

    سلام چرا رو خط String Phone= costumer; گیر میده؟
    متن خطا ‘costumer’ was not declared in this scope

    1. زئوس Zeus زئوس Zeus گفت:

      سلام دوست عزیز شما به جای costumer باید شماره همراه رو وارد کنید مثلا به این شکل “09xxxxxxxx” که برنامه خطا نگیره

      1. علی گفت:

        invalid digit “9” in octal constant
        سلام الان اینو میده بعد اگه خط رو پاک کنم رو sendData(“AT+CGNSPWR=1”,1000,DEBUG); اروری مشابه قبلی میده
        این کد کتابخونه ای نداره؟
        بعد چرا دوتا string phone داره یکی چنتا x دادین بهش یکی هم که costumer قضیش چیه؟

        1. زئوس Zeus زئوس Zeus گفت:

          احتمالا اونجا یادش رفته – منظور این بوده که شماره دلخواه خودتون رو وارد کنید دوست عزیز
          الان کدی که تغییر دادید و خطا دریافت میکنید رو می شه برام بفرستید

          1. علی گفت:

            سلام بفرمایید
            #include
            #define DEBUG true
            SoftwareSerial mySerial(10,11 );// RX, TX
            String data[5];
            String state,timegps,latitude,longitude;
            String Operator,Balance;
            String Phone = “***********”; // like a 0938*****75

            void setup() {
            Serial.begin(9600);
            mySerial.begin(9600);
            mySerial.println(“AT&F”);
            delay(100);
            mySerial.println(“AT+CMGF=1”);
            mySerial.setTimeout(100);
            sendData(“AT+CGNSPWR=1″,1000,DEBUG);
            delay(50);

            while(1){

            Operator= Ooperator();
            if(Operator==”nothing”){
            Serial.println(Operator);
            }// end if operator
            else{
            Serial.println(Operator);
            Operator_Setting(Operator);
            GSM_Initilaize();
            Balance=balance(Ooperator());

            // Send_Message(Phone, Balance);
            Send_Message(Phone, “Welcome to SIM808”);

            Serial.println(Balance);

            return;
            }
            }// end while

            } // end of Main

            void loop() {

            String Read_Message = receive_message();

            if(Read_Message != “0”){

            String phones = Get_PhoneNumber(Read_Message);

            delay(100);

            sendTabData(“AT+CGNSINF”,1000,DEBUG);
            delay(300);
            if (state !=0) {
            Serial.println(“State :”+state);
            Serial.println(“Time :”+timegps);
            Serial.println(“Latitude :”+latitude);
            Serial.println(“Longitude :”+longitude);
            }

            delay(1000);

            //send_sms(Phone , “http://maps.google.com/maps?q=loc:”+latitude+”,”+longitude);
            Serial.println(“http://maps.google.com/maps?q=loc:”+latitude+”,”+longitude);

            }

            }

      2. علی گفت:

        اگه موردی نداره از طریق any desk یه ارتباط بگیریم

        1. زئوس Zeus زئوس Zeus گفت:

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

  5. داود گفت:

    سلام.ببخشید چرا به دستور sendData(“AT+CGNSPWR=1”,1000,DEBUG);
    گیر میده ؟؟؟ متن خطا ‘sendData’ was not declared in this scope

    1. زئوس Zeus زئوس Zeus گفت:

      سلام
      تابع sendData در قسمت «تابع ارسال پیام به همراه داشتن TimeOut و Debug» از مقاله تعریف شده است متونید کپی کنید توی متنتون

  6. ابوالفضل گفت:

    سلام من هرچی سرچ کردم نتونستم پیدا کنم میشه این کد رو جوری بزارید که با یک پیامک بشه یک رله رو روشن کرد

  7. ابوالفضل گفت:

    سلام خدمت شما اگه بخواهم چند رله به اردوینو وصل کنم و با ارسال پیام رله ها روشن بشه باید چیکار کنم میشه راهنمایی کنید و برنامشو بهم بدید

    1. زئوس Zeus زئوس Zeus گفت:

      احتمالا با یه سرچ کوچولو میتونید نمونه سورس کد رو پیدا کنید 😐

  8. محمد گفت:

    با سلام و خسته نباشید.
    word_filter در قسمت تشخیص اپراتور یه متده؟ کتابخونه خاصی داره یا خودتون ساختید؟ چون من جایی پیداش نکردم و اردوینو گیر میده بهش ارور میده.

    1. زئوس Zeus زئوس Zeus گفت:

      سلام فکر کنم فراموش کردن این تابع رو بنویسن
      چیزی که مشخصه اینه که این تابع میآد و یه بخش از رشته رو جدا میکنه و توی خروجی بر میگردونه
      احتمالا تایع به شکل زیر تعریق شده

      String word_filter(String str,String start,String end)
      {
      int Word1 = str.indexOf(start);
      int Word2 = str.lastIndexOf(end);
      retrun str.substring(Word1 , Word2);
      }

  9. محمد رضا نکونام گفت:

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

    1. Sisoog Os Sisoog Os گفت:

      سلام
      دوست عزیز اکثر اینها یک پروتکل ارتباطی دارند که اون را از فروشنده بخاهید و بعد از اون میتونید با تنظیم ای پی و پورت و نوشتن یک برنامه روی سرور خودتون داشته باشید
      حتی نرم افزارهای اپن سورسی هم هستند که اکثر پروتکلها را پشتیبانی میکنند و فقط کافیه شما اون را روی سرور نصب کنید و اطلاعات کامل خیلی راحت روی دیتابیس سرور شما میشینه
      مثل
      https://www.traccar.org/

  10. حسین گفت:

    سلام .
    بسیار عالی.
    من همیشه علاقه مند بودم با ماژولهای gsm کار کنم . از مقاله شما لذت بردم ، این که به صورت تابعی مطالب رو تشریح کردید باعث شده مطلب خیلی روان باشه .
    یک سوال هم دارم . مثلا اگر بخواهیم اون مختصات گوگل روی گوشی نمایش بدیم چطور میتونیم اون رو به صورت اتوماتیک توی مرورگر یاmap گوشی وارد کنیم؟
    اینکار مستلزم نرم افزار های اندرویدی هست یا با یک سری تنظیمات توی گوشی امکانپذیره ؟
    برای pc چطوز امکانپذیره ؟
    اگر بخواهیم مسیر حرکت رو روی map گوشی نمایش بده ایا باز هم از همون لینک گوگل استفاده میشه یا راهکار دیگه ای داره ؟
    ببخشید یک مقدار سوالات زیاد شد.
    باز هم متشکر از مطلب خوبتون .

    1. BLO OM BLO OM گفت:

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

      بخش دوم سوالتون که چطور اونو روی گوشی بیارید
      در بخش اول توضیح دادم که با ارسال پیام این کار صورت میگیره اما فکر میکنم منظور شما تحت اپلیکیشن هست.
      برای اینکار شما نیاز به نوشتن یک نرم‌افزار اندروید یا IOS دارید بسته به نوع گوشیتون حالا اتفاقی که میفته
      شما باید تابعی رو بنویسید (همون تابع فیلتری که معرفی کردم برای دریافت پیام) برای اندروید که این قابلیت رو داشته باشه دیتای دریافتی رو از هم تفکیک کنه یعنی چی؟ یعنی اینکه فرض کنید شما پیامی با عنوان لینک گوگل + طول جغرافیایی + عرض جغرافیایی برای گوشی ارسال می‌کنید حالا توی نرم‌افزار باید بتونید این رو فیلتر کنید چطور؟ به این روشی که میگم خدمتتون اول پیامتون مثلا BLOOM+ لینک گوگل + طول جغرافیایی + عرض جغرافیایی +bloom برای گوشی ارسال کنید و توی نرم‌افزاری که نوشتید تابع فیلتری رو که گفتم پیاده سازی کنید و تعریف کنید زمانی که پیامی داشتید اولش BLOOM , bloom بود رو تشخیص بده و پس از اینکه تشخیص داد به روی کلید مدنظرتون کلیک کنید و در نهایت به صورت خودکار وارد گوگل مپ خواهد شد

      بخش سوم سوالتون
      بله برای PC هم کاملا امکان پذیره فقط مستلزم اینه که شما شما یک نرم‌افزار دقیقا طبق توضیحاتی که دادم مجددا بنویسید
      البته مدل پیشرفته ترش اینکه شما توسط یک وب سایت که نوشتید پیاده سازی کنید که این مسله هم چیز سختی نیست چون تقریباکسی نرم‌افزاری رو برای PC نمی‌نویسه بلکه همه سعیشون بر اینکه اونو توسط یه وب سایت پیاده سازی کنند.

      بخش چهارم سوالتون
      اگر بخواید که لحظه به لحظه دیتا رو مشخص کنید و اصطلاحا مسیر یابی کنید مسلما باید نقاطی رو که ارسال می‌کنید به صورت لحظه به لحظه باشه و از طرف گوشی و یا وب سایت این داده ها رو تفکیک کنید که با این روش، قابلیت هایی از جمله مختصات لحظه ای دستگاه رو خواهید داشت و همینطور اگر به درستی فیلتر صورت بگیرد می‌توانید ساعت دقیق را از GPS دریافت کنید و به طور مثال بگویید که دستگاه در چه ساعتی در کجا بوده و …

      بخش پنجم سوالتون
      برای اینکه این تنظیمات را انجام دهیم نیازی به تنظیمی از طرف گوشی نیست که فکر کنید باید تنظیم خاصی رو انجام بدید فقط تنها چیزی که باید ان را انجام دهید روشن کردن دیتاتونه البته اگر اینترنت هم روشن نباشه میتونید مختصات رو ذخیره کنید توی یه SD CARD و در نهایت نقط رو چک کنید و بسیاری از اپشن های دیگر که کاملا ممکنه بسته به سلیقه شما متفاوت باشه

      امیدوارم توضیحاتی رو که دادم مفید واقع شده باشه برای شما.

      موفق باشید

      1. حسین گفت:

        سلام .
        مرسی . لطف کردید توضیحات کاملی بود . جواب سوالاتم رو گرفتم .

        1. BLO OM BLO OM گفت:

          سلام دوست عزیز
          خواهش میکنم وظیفه بود
          موفق باشید.