برد STM سیم کارت GSM - GPRS قطعات الکترونیک

ارسال و دریافت پیامک با ماژول سیم کارت Sim800l و میکروکنترلر STM32

نوشته شده توسط علی زاهدی

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

 


معرفی ماژول SIM800L


ماژول SIM800L، یک ماژول مخابراتی از نوع سیم کارتی است. این ماژول یک اسلات سیم کارت داشته که سیم کارت از نوع mini درون آن قرار می گیرد. با اتصال سیم کارت، این ماژول قادر خواهد بود که همانند یک تلفن همراه، به شبکه مخابرات متصل شده و به ارسال دریافت پیامک، برقراری تماس تلفنی و اتصال به اینترنت بپردازد. ماژول SIM800L دارای دو پایه سریال، RX و TX جهت دریافت فرمان و ارسال داده است. این ماژول همچنین بر روی خود پایه های اتصال میکروفون و بلندگو جهت برقراری تماس تلفنی است.

ماژول سیم کارت Sim800L - دیجی اسپارک

این ماژول در محدوده فرکانسی ۸۵۰/۹۰۰/۱۸۰۰/۱۹۰۰ فعال است. بنابراین، بدون هیچ مشکلی در ایران قابل استفاده خواهد بود. از طرفی دیگر، این ماژول ها به هیچ عنوان وارد طرح رجیستری نشده و بدون نیاز به فعال سازی آن در سامانه همتا، می توان با خیالی آسوده در پروژه های کنترل از راه دور، از این ماژول استفاده نمود.

 


اتصالات Sim800l به برد STM32


برای راه اندازی ماژول Sim800l نیاز به ولتاژ بین ۳٫۷ تا ۴٫۲ ولت و جریان ۲ آمپر است. از این رو برای تغذیه Sim800l از ماژول کاهنده LM2596 به همراه یک آداپتور ۱۲ ولت ۲ آمپر استفاده شده است. توجه داشته باشید که بایستی قبل از اتصال ماژول کاهنده به Sim800l با استفاده از مولتی ترن موجود بر روی ماژول کاهنده، ولتاژ کاری آن را بین ۳٫۷ تا ۴٫۲ ولت تنظیم کنید.  اتصالات Sim800l به برد STM32 بصورت زیر است.

Schematic

 


پیکربندی میکروکنترلر STM32


پس از ساخت پروژه جدید در نرم افزار STM32CubeMX مطابق بخش اول آموزش میکروکنترلر های STM32 بخش های RCC و SYS را تنظیم کنید. سپس یکی از USART ای میکروکنترلر را فعال کرده و باودریت آن را بر روی ۹۶۰۰ تنظیم کنید. سپس وارد بخش NVIC  Setting شد و وقفه USAR را فعال کنید. در صورتی ک با بخش USART میکروکنترلر های STM32 آشنایی ندارید. بخش سوم و بخش چهارم آموزش میکروکنترلر های STM32 را مطالعه کنید. سپس بایستی وارد بخش FREERTOS شده و گزینه interface را بر روی CMSS_V1 تنظیم کنید. پس از آن در بخش Config Parameter گزینه TOTAL_HEAP_SIZE را پیدا کنید. و مقدار آن را به ۸۱۹۲ Byes تغییر دهید. در آموزش آشنایی با سیستم های بلادرنگ مختصر توضیحاتی دربار سیستم عامل freeRTOS داد شد است. کتابخانه ای که جلوتر به شما معرفی خواهد شد. از ماژول های GSM هم خانواده Sim800l مانند Sim800c نیز پشتیبانی میکند. ب همین دلیل باید یکی از پایه های میکروکنترلر را بعنوان خروجی تعریف کنید. و لیبل “GSM_KEY” را  برای آن قرار دهید. برای درک بهتر این مطلب به تصویر زیر توجه کنید.

پیکربندی میکروکنترلر STM32 - دیجی اسپارک

 

سپس از صفحه Clock Configuration فرکانس کاری میکروکنترلر را بر روی ۷۲ مگاهرتز تنظیم کنید. سپس وارد صفحه ی Project Manager شوید. پس از انتخاب نام و IDE برای پروژه مقدار گزینه های Minimum Heap Size و Maximum Stack Size را بر روی ۰x400 تنظیم کنید. سپس در بخش Code Generator در قسمت Generated files تیک مربوط به گزینه Generate peripheral initialization as a pair of ‘.c/.h’ files per pripheral را بزنید.

stm32cubemx Setting

 

سپس وارد قسمت Advanced Settings شده و در بخش Driver Selector بر روی گزینه USART کلیک کرده و آن را از HAL به LL تغییر دهید. و سپس بر روی گزینه GENERATE CODE کلیک کرده و وارد نرم افزار KEIL شوید.

STM32 Cube Mx Advanced settingg

 


کدنویسی در نرم افزار KEIL


ابتدا از GSM را از این لینک دانلود کنید. سپس کتابخانه را به پروژه اضافه کنید. در صورتی که با نحوه اضافه کردن کتابخانه به پروژه آشنا نیستید. آموزش اضافه کردن کتابخانه به پروژه های STM32 را مطالعه کنید. سپس بایستی وارد فایل gsmConfig.h شده و شمار USART تعریف شده را همانند کد زیر در این فایل تعریف کنید.

سپس وارد فایل stm32f3xx_it.c شده ابتدا بایستی کتابخانه gsm.h را به ابتدای این فایل اضافه کنید. و تابع void USART1_IRQHandler(void) را پیدا کنید. سپس دستور gsm_at_rxCallback() را همانند کد زیر داخل این تابع بنویسید.

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  /* USER CODE BEGIN USART1_IRQn 1 */
     <strong>gsm_at_rxCallback();</strong>
  /* USER CODE END USART1_IRQn 1 */
}

در این پروژه از freeRTOS استفاده شده است. به همین دلیل بجای برنامه نویسی در فایل main.c بایستی کد خود را داخل فایل freertos.c بنویسید. تابع زیر را در این فایل پیدا کنید.

/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for(;;)
  {
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask */
}

برای راه اندازی ماژول Sim800l ابتدا بایستی کتابخانه gsm.h را به ابتدای فایل freertos.c اضافه کنید. سپس دستورات زیر را به تابع بالا قبل از حلقه for اضافه کنید.

gsm_init(osPriorityLow);
gsm_waitForRegister(25);

دستور اول برای تنظیمات مربوط به ماژول است. تنظیماتی از جمله Task بخش مربوط به freeRTOS و اولویت Task و … دستور بعدی مدت زمان مشخصی را برای وارد شبکه شدن ماژول صبر می‌کند. در ادامه کد زیر را قبل از تابع معرفی شده اضافه کنید.

void gsm_callback_newMsg(char *number, Gsm_Time_t time, char *msg) 
{ 
	if(strstr((char*)gsm.msg.buff,"out1")) 
	{ 
		HAL_GPIO_TogglePin(output1_GPIO_Port,output1_Pin); 
		gsm_msg_send(number, "OUTPUT 1 status changed"); 
	} 
	else if(strstr((char*)gsm.msg.buff,"out2")) 
	{ 
		HAL_GPIO_TogglePin(output2_GPIO_Port,output2_Pin); 
		gsm_msg_send(number, "OUTPUT 2 status changed"); 
	} 
	else if(strstr((char*)gsm.msg.buff,"out3")) 
	{ 
		HAL_GPIO_TogglePin(output3_GPIO_Port,output3_Pin); 
		gsm_msg_send(number, "OUTPUT 3 status changed"); 
	} 
	else if(strstr((char*)gsm.msg.buff,"out4")) 
	{ 
		HAL_GPIO_TogglePin(output4_GPIO_Port,output4_Pin); 
		gsm_msg_send(number, "OUTPUT 4 status changed"); 
	} 
	
}

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

 


نحوه عملکرد پروژه 


زمانی که برق ماژول Sim800l متصل می‌شود. در صورتی که وضعیت تغذیه و آنتن دهی مناسب باشد. ماژول پس از گذشت ۵ تا ۱۰ ثانیه وارد شبکه شده و آماده کار می‌باشد. برای این که سیستم منتظر بماند تا ماژول وارد شبکه شود از دستور gsm_waitForRegister استاده شده است. اگر مدت زمان طولانی در این دستور تعریف کنید و ماژول قبل از به پایان رسیدن زمان مشخص شده وارد شبکه شود. برنامه از این دستور عبور می‌کند و زمانی بی مورد تلف نمی‌شود. در ادامه زمانی که ماژول پیامکی دریافت کند. برنامه وارد فایل gsmCallback.h شده و تابع void gsm_callback_newMsg(char *number, Gsm_Time_t time, char *msg) اجرا می‌کند. به دلیل این که این تابع از نوع __weak تعریف شده بود. قابلیت انتقال به فایل های دیگر پروژه را دارد. ما نیز این تابع را به فایل freertos.c منتقل کردیم. داخل این تابع ۴ شرط برای ۴ خروجی تعریف شده قرار دارد. برای مثال با پیامک کلمه “out1” به شماره سیمکارت داخل ماژول Sim800l خروجی مربوطه روشن شده و پیامکی حاوی متن “OUTPUT 1 status changed” برای شماره فرستنده ارسال می‌شود.

 


جمع بندی


ماژول Sim800l از محبوب ترین ماژول های GSM موجود در بازار است. که به دلیل هزینه کم و امکانات زیاد، بسیار مورد توجه قرار گرفته است. در این آموزش پس از شناخت ماژول Sim800l به معرفی مداری کاربردی برای تغذیه ماژول Sim800l و اتصال آن به میکروکنترلر Stm32 پرداختیم. سپس نحوه پیکربندی پایه های میکروکنترلر Stm32 در نرم افزار STM32CubeMX توضیح داده شد. در ادامه کتابخانه ای بسیار کاربردی برای برقراری ارتباط بین میکروکنترلر Stm32 و ماژول Sm800l معرفی شد. سپس کد مربوط به دریافت و ارسال پیام با استفاده از کتابخانه معرفی شده، مورد بررسی قرار گرفت.

 


لوازم مورد نیاز


 

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

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی از وبسایت دیجی اسپارک حمایت کنید.

 

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

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

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

تبادل نظر و رفع عیب با ثبت دیدگاه

۸۴ دیدگاه

    • سلام
      بله، LED موجود بر روی ماژول Sim800l به میکروکنترلر کاری ندارد. در صورت دریافت ولتاژ و جریان و آنتن دهی مناسب وارد شبکه شده و وضعیت چشمک زدن LED متفاوت میشود.

    • سلام‌
      ممنون‌ پایه‌ GSM _key به‌ کجا باید وصل‌ بشه؟
      ونقش‌ تایمر‌ چی‌ هست‌؟طبق‌ ویدئویی‌ که داخل یوتیوب بود پرسیدم از‌ آقای‌ نیما

      • با سلام
        در صورتی که از ماژول SIM800L استفاده میکنید. نیاز به اتصال این پایه نیست. این پایه برای ماژول هایی مانند SIM800C در نظر گرفته شده است.

  • سلام ممنون از پروژه خوبی که قرار دادین. برای خاموش کردن خروجی ها چیکار میشه کرد؟ و اینکه بخوایم مطلع شیم الان کدوم خروجی در چه وضعیت قرار داره چطور؟

    • با سلام از توجه شما سپاسگزارم.
      اگر به کد پروژه توجه کنید. دستور Toggle برای پایه ها نوشته شده است. پس با هر بار ارسال پیامک وضعیت خروجی تغییر میکند. در صورتی که روشن باشد خاموش میشود و در صورتی که خاموش باشد روشن میشود. برای خواندن وضعیت پایه ها میتوانید متغیری تعریف کنید و همزمان با تغییر وضعیت پایه مقدار متغیر را نیز تغییر دهید. سپس در زمان ارسال پاسخ به سمت موبایل مقدار آن متغیر را ارسال کنید.

  • با عرض سلام . بنده از کیل ورژن ۴ استفاده می کنم درتنظیمات کیوب در Advanced settings گزینه LL در usart1 وجود ندارد فقط hal می باشد. طبق گفته شما قسمت Advanced Settings شده و در بخش Driver Selector بر روی گزینه USART کلیک کرده و آن را از HAL به LL تغییر دهید.

    • باسلام
      ورژن نرم افزار KEIL مشکلی ایجاد نمی‌کند. در صورتی که مسیر گفته شده را به درستی طی کنید. و بر روی گزینه HAL جلوی بخش USART کلیک کنید. گزنیه LL را مشاهده خواهید کرد.

  • بسیار ممنونم درست شد. جناب مهندس امکانش هست یه توضیح مختصری راجع به اینکه اگر بخواهم یه تسک دیگه اضافه کنم مثلا خواندن دما باید در همین صفحه freertos یه تابع جدید درست کنم و مشابه دیفالت تسک انجام دهم؟

    • با سلام
      بزودی آموزش نحوه راه اندازی سیستم عامل FreeRTOS بر روی میکروکنترلر های STM32 را منتشر میکنم.

      • سلام جناب مهندس. من اگر بخوام ۴ تا ورودی درنظر بگیرم بصورت وقفه اکسترنال خارجی چجوری باید اینکارو انجام بدم؟ مثلا میخوام بگم اگر ورود صفر شد یا یک شد فلان خروجی فعال بشه، و اسم ام اس هم ارسال بشه. اگر وقفه خارجی اکسترنال اینتراپت رو فعال کنم داخل صفحه free rtos باید کد کال بکشو بنویسم؟

      • با عرض سلام و خسته نباشید. اگر بخوام اکسترنال اینتراپت وقفه براش در نظر بگیرم که بدم به چندتا ورودی چیکار باید بکنم ؟ مثلا هر موقع پایه ورودی که بعنوان وقفه خارجی هستش فعال شد پیام ارسال بشه به طرف

        • با سلام
          در بخش دوم آموزش میکروکنترلر های STM32 نحوه استفاده از وقفه خارجی در میکروکنترلر های STM32 بصورت کامل توضیح داده شده است. پس از فعال سازی وقفه با لبه دلخواه میتوانید دستور مربوط به ارسال پیامک را در روتین وقفه قرار دهید.
          https://digispark.ir/stm32-exti-tutorial/

          • سلام با تشکر فراوان. بنده اگر بخوام این پیام رو با تاخیر ارسال کنم مثلا بعد از ۵ دقیقه پبامک ارسال بشه چه روشی رو پیشنهاد میکنید آیا با تایمر میشه اینکارو کرد اگر میشه چجوری میتونم تایمر رو در rtos فعال کنم ؟ ممنون میشم راهنمای کنید خیلی سرج کردم ولی به نتیجه نرسیدم که بتونم داخل این برنامه بگنجونم .

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

                • سلام مجدد
                  تسک مربوط به Sim800 در فایل freeRTOS نیست و داخل کتابخانه قرار دارد. شما میتوانید روتین تایمر را به فایل freeRTOS انتقال داده و برنامه اصلی خود را در default task بنویسید.

  • سلام، هرکاری میکنم نمی‌شه تا از محیط سریال ترمینال( بدون میکروکنترلر ) با sim800l پیامکی بفرستم.
    چنین کدهایی رو میفرستم ولی، نتیجه ای نداره!
    AT+CMGR=1
    AT+CMGS=”+98937xxxxxxx”
    hello
    بعدش منوال میگه ،ctrl+z بفرست. ولی چنین چیزی نمیفرسته. چیکار باید کرد؟

  • با عرض سلام . بنده در قسمت کیوب تنظیمات تامیر یک رو مانند اموزشی که قرار دادید با تنظیم مقادیربصورت تایم یک ثانیه تنظیم کردم. و روتین وقفه را در صفحه RTOS قبل تابع void StartDefaultTask قرار دادم و دستور استارت تایمر و وقفه را داخل void StartDefaultTask قبل از حلقه وایل نوشتم و کتابخانه تایمر را در صفحه RTOS اضافه کردم اما در کامپایل شدن این خطا را میدهد:
    Undefined symbol htim1 (referred from freertos.o)
    Undefined symbol MX_TIM1_Init (referred from main.o)

      • با عرض سلام مجدد .ممنونم از راهنمایی تون ارور اول رو طبق دستوری که گفتید برطرف کردم اما ارور دوم
        Error: Undefined symbol MX_TIM1_Init (referred from main.o)
        رو هرکاری میکنم از بین نمیره امکانش هست محبت کنید اینو ؟

      • سلام مجدد و تشکر فراوان. نظرتون راجع به ارور چیه Undefined symbol MX_TIM1_Init (referred from main.o ارور اولی با دستوری که دادید برطرف شد اما این دومی مونده . ممنونم

          • با عرض سلام بله دقیقا اینکارو کردمMX_TIM1_Init را در در تابع
            void
            MX_FREERTOS_Init(void) قرار دادم.
            اما همچنان ارور رو دارم

              • سلام مجدد . بنده تمام این کار هارو انجام دادم تمام جزئیات رو انجام دادم طبق اموزش های شما ولی همچنان اروره هست. امکانش هست برنامه رو براتون ایمیل کنم ؟ ممنون میشم چون ۱ ماهه درگیره این کد هستم

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

                    • با سلام
                      هماطور که قبلا فرمودین شما تابع MX_TIM1_Init را در فایل freertos.c کپی کردین که نیازی به این کار نیست و این کار باعث ایجاد ارور می شود.

                  • با عرض سلام مجدد و ممنوم از راهنمایی تون . بنده این دستور MX_TIM1_Init رو در فایل main رو کامنت کردم درست شد درصورتی که اصلا داخل فایل free rtos هم پاک کردم باز ارور بود و وقتی در فایل main دستور را پاک کردم خطا برطرف شد.

  • سلام و خسته نباشید
    من این کد رو روی برد نوکلئو f746 کامپایل کردم اما نمیدونم چرا اجرا نمیشه.
    در تابع freertos قبل از for، وارد تابع gsm_waitForRegister میشه ولی ازش هیچ وقت خارج نمیشه. داخل تابع رو که چک کردم دیدم که هیچ وقت از داخل while موجود در این تابع تاخیر، خارج نمیشه
    ممکنه کمکم کنید؟

    • با سلام
      لطفا اتصالات را بررسی کنید. در صورتی که اتصالات به درستی متصل نشده باشند و یا ماژول نتواند وارد شبکه شود با این مشکل موجه می شوید. موارد اعلام شده را بررسی کنید و نتیجه را اعلام کنید.

      • با سلام و خسته نباشید
        مشکل قبلی مربوط به سیمکارت بود. چونکه سیمکارت ظاهرا فعال نبوده چون تازه خریداری کرده بودم!
        حالا بعد از فعال سازی اون و اجرای کد، پیام ها به سیمکارت میرسه (من با فعال سازی یک uart دیگه در کد و ارسال پیام های دریافتی از ماژول به کامپیوتر متوجه این شدم که پیام ها توسط ماژول دریافت میشه و مشکلی نیست.)
        اما مشکل اینجاست که خروجی ها عمل نمیکنن.
        کد رو بررسی کردم دیدم که اصلا کد وارد تابع gsm_callback_newMsg نمیشه که بخواد ifها رو بررسی کنه.

      • با سلام.
        ظاهرا کد که در ابتدای برنامه وارد تابع gsm_power میشه، در ابتدای این تابع در خط
        if (gsm_at_sendCommand(“AT\r\n”, 1000, NULL, 0, 2, “\r\nOK\r\n”, “\r\nERROR\r\n”) == 1)
        وارد تابع gsm_at_sendCommand شده و دیگه ازش خارج نمیشه!
        در تابع gsm_at_sendCommand هم تا آخر تابع پیش میره اما خط آخر که return gsm.at.answerFound + 1; هست گیر میکنه و ۱ یا صفری رو ریترن نمیکنه!

      • ظاهرا تمام مشکل من از تابع gsm_at_sendCommand هست. وارد میشه ولی خارج نمیشه. من داخل این تابع رو کامنت کردم فقط تابع gsm_at_sendString(command); رو داخلش نگه داشتم و آخرش هم return 1 کردم ازش رد شد. اما مشکل کجاست متوجه نمیشم

        • با سلام
          من در راه اندازی این کتابخانه این مشکلات رو نداشتم. بنظرم یک بار دیگه مراحل را با دقت انجام دهید. همچنین قسمت مربوط به دستور gsm_at_rxCallback(); را فراموش نکنید که داخل روتین وقفه یوزارت قرار دهید.

          • با سلام.
            متاسفانه من نتونستم با کد شما GSM رو فعال کنم. اما خودم کد ساده ای رو نوشتم و به راحتی فعال شد و پیامک و … ارسال و دریافت شد. اما کد شما روعلی رغم چند بار انجام مراحل نتونستم اجرا کنم.
            دو تا نکته رو بگم:
            من از میکرو stm32f405 استفاده می کنم که البته فکر نمیکنم تفاوتی داشته باشه
            یه سوال این که خروجی GSM_KEY شما چه کاربردی داره در این کد؟چون تعریف شده ولی به جایی وصل نشده

            • با سلام
              این کتابخانه از ماژول های دیگری مثل SIM800C نیز پشتیبانی میکند. لزوم تعریف این پایه برای دیگر ماژول ها است. برای این که نیاز به تعریف این پایه نباشد بایستی تغرات کوچکی در کتابخانه ایجاد کنید.

          • مشکل من حل شد. متاسفانه در کانفیگ دیباگ باید دیباگ رو غیر فعال میکردم چون از دیباگ استفاده نمیکنم.
            با تشکر

  • سلام جناب مهندس
    چجوری میشه به صورت ماژول sim800l رو هم به صورت نرم افزاری و هم سخت افزاری ریست کرد… جوری که دیگه هنگ نکنه… آخه من با این ماژول کار کردم.. بعد از یه روز که روشن موندن، وقتی sms میفرستم تحویل داده نمیشه.. باید حتماً خاموش روشن بشه تا دوباره اوکی بشه.. ممنون میشم راهنماییم کنین.

    • با سلام
      در صورتی که تغذیه و آنتن دهی و پارامتر های دیگری رعایت شود این مشکل پیش نمی آید. اما شما میتوانید پایه RST ماژول Sim800l را به میکروکنترلر متصل کنید و داخل برنامه با قرار دادن مقدار خروجی متصل به پایه RST ماژول را ریست کنید.

  • با سلام. اگر بخواهیم برای دستگاه رمز بزاریم و رمز هم قابل تغییر باشه و از طریق تماس با پیام دادن فرقی نمیکنه چیکار باید بکنیم مهندس

    • با سلام
      همانطور که در متن آموزش گفته شده است داخل تابع Callback مربوط به دریافت پیامک، پس از دریافت پیامک جدید، متن پیام داخل رشته gsm.msg.buff قرار میگیرد. شما میتوانید متن داخل این پیامک را خوانده و شرط قرار دهید تا رمز را تغییر دهید.

      • جناب مهندس امکانش هست یکم بیشتر توضیح بدین مثلا اگر طرف پیامک بده و رمز مورد نظرش رو به این شکل بنویسه ramz:1234 من چجوری تو رشته gsm.msg.buff اون مقدار رمز رو دربیارم و ذخیره کنم که به عنوان رمز دستگاه باشه ؟ بجای out1 رو دستور strstr((char*)gsm.msg.buff,”out1″ چی بزارم؟ ممنونم

        • با سلام
          شما برای این که متوجه بشین کاربر قرار است رمز را تغیر دهد با میتوانید داخل دستور strstr بجای عبارت out1، عبارت ramz را قرار دهید. سپس داخل بخش روتین شرط با یک حلقه for به صورت زیر رمز را جدا کنید (برای مثال رشته Pass برای ذخیره رمز جدید است).
          if(strstr((char*)gsm.msg.buff,”out1″))
          {
          for (int i=6;i<10;i++)
          {
          Pass[i-6] = gsm.msg.buff[i];
          }
          }
          البته پیشنهاد میکنم که از بخش debug برای فهمیدن بیت های مربوط به رمز در رشته gsm.msg.buff استفاده کنید.

          • بسیار عالی بود انجام دادم و به نتیجه رسید ممنونم از شما. می توان به صورت مستقیم Pass[i-6] را در eeprom میکرو stm32 پس از تعریف کتابخانه های مرتبطش به همین شکل ذخیره کرد؟ و سوال دوم اینکه امکانش هست با همین کتابخانه freertos راه اندازی gprs را آموزش دهید؟

            • درود بر شما
              بله در ادامه آموزش های Sim800L و میکروکنترلر STM32 راه اندازی و استفاده از GPRS هم منتشر خواهد شد.

              • با سلام و تشکر فراوان. این تابع gprs رو میخوام راه اندازی کنم چجوری هاست رو معرفی کنم و داده های رئ از چه آرایه ای بخونم؟
                gsm_callback_gprsGotData(uint8_t *data, uint16_t len)

                • با سلام
                  بزودی آموزش راه اندازی GPRS ماژول SIM800 با استفاده از همین کتابخانه منتشر خواهد شد.

                  • سلام و خسته نباشید. برای استفاده از ایتترنت با این کتابخونه کی لطف میکنید اموزشش رو تهیه میکنید؟

                    • با سلام
                      در اولین فرصت سعی میکنم پست مربوط به استفاده از GPRS ماژول Sim800L را منتشر کنم.

  • سلام و وقت بخیر.
    طبق مراحل بالا انجام دادم، اما این خط erorr میگیره؟ ببخشید مشکلش چی میتونه باشه؟
    gsm_at_rxCallback();

  • سلام . ممنون از اموزش های عالی تون. یه سوال داشتم. من تموم کار هایی گفتین رو انجام دادم به جز اون قسمتش که گفتین تو تنظیمات advance setup باید usart رو بزاریم رو LL . برای من فقط گذینه hal وجود داره. ورژن برنامم هم فک کنم ۴.۲۰ هست. به نظرتون به خاطر ورژنش هست که نداره؟ الان من برنامه رو که در اخر کامپایل میکنم حدود ۹ تا ارور معمولا مربوط به usart میگیره. که همشون هم تو فایل gsm.c هستن.

    • با سلام
      داخل نرم افزار کیوب در حالت عادی گزینه HAL نمایش داده می شود. بایستی بر روی گزینه HAL کلیک کنید تا بتوانید آن را به LL تغیر دهید.

  • سلام . یادم رفت بگم اون قسمتی که لینک دادین و گفتین در مورد freeroots توضیح دادین هم من وارد شدم ولی هیچی نبود . یعنی هیچ توضیحی نبود فقط نوشته نویسنده علی زاهدی // خودتون چک کنین لطفا.

  • با عرض سلام و احترام
    میخواستم بدونم این کد ها را با میکروپایتون هم نوشتین یا خیر ؟
    بهتر بگم، آیا کدهای برنامه با زبان میکروپایتون هم نوشته شده و در دسترس هست یا خیر ؟
    با احترام
    بصیرنیا

  • با سلام و تشکر از زحمات ارزنده جنابعالی
    در برنامه موجود شماره موبایل جایی نباید درج بشه؟

    • با سلام
      خیر، در این برنامه تمامی دستگاه هایی که شماره سیم کارت را داشته باشند. میتوانند رله هارا کنترل کنند. اما اضافه کردن کد محدود کردن شماره بسیار آسان است.

  • سلام . من کتاب خانه هارو اضافه کردم اما ارور میده داخل GSM.H این کتاب خانه رو ارور میده #include “FreeRTOS.h” که فایلی وجود نداره چیکار باید بکنم

    • با سلام
      در صورتی که از FreeRTOS استفاده نمی‌کنید. بایستی داخل فایل GSMConfig بخش مربوط به FreeRTOS را برابر صفر قرار دهید.

  • سلام بنده درک نمیکنم چطور این کد قراره کار کنه وقتی تابع gsm_callback_newMsg اصلا تعریف نشده (توی gsmcallback.h در جایی که این تابع تعریف شده هیچی داخلش قرار داده نشده )

    • با سلام
      متاسفانه در بروز رسانی های اخیر کتابخانه تغیراتی اساسی اجام شده و کدی که داخل آموزش قرار گرفته است با ورژن اخیر کتابخانه سازگار نیست. به زودی آموزش با اخرین ورژن کتابخانه بروز رسانی خواهد شد.

  • سلام مهندس برای رفع این ارور باید چه کاری انجام بدم؟
    compiling gsm.c…
    ..\..\gsm-master\gsm.c(240): error: #20: identifier “_GSM_KEY_GPIO_Port” is undefined
    HAL_GPIO_WritePin(_GSM_KEY_GPIO_Port, _GSM_KEY_PIN, GPIO_PIN_RESET);
    ..\..\gsm-master\gsm.c(240): error: #20: identifier “_GSM_KEY_PIN” is undefined
    HAL_GPIO_WritePin(_GSM_KEY_GPIO_Port, _GSM_KEY_PIN, GPIO_PIN_RESET);
    ..\..\gsm-master\gsm.c: 0 warnings, 2 errors
    وقتی میخوام کد رو کامپایل کنم با این مشکل مواجه میشم و اینکه من از sim800c استفاده میکنم در جایی از کد نیاز هست تغییری ایجاد کنم؟و پایه gsm_key رو به کجا متصل کنم؟

    • با سلام
      کتابخانه موجود در سایت گیتهاب بروز رسانی شده و آموزش موجود نیز با توجه به تغیرات کتابخانه به زودی بروز رسانی خواهد شد.
      پایه GSM_KEY بایستی در بهش IOC به صورت خروجی تعیرف شده و سپس به کتابخانه معرفی شود.

    • با سلام
      بله این پایه در سری SIM800L وجود ندارد. اما در سری SIM800C این پایه بایستی حتما به میکروکنترلر متصل شود تا ماژول بتواند شروع به کار کند.

  • سلام
    من دقیقا مراحل رو رفتم ولی ۲ ارور داره . کتابخانه gsm.h رو که به stm32f1xx_it و FreeRTOS اضافه میکنم میگه این کتابخانه پیدا نشد.

  • سلام
    ممنونم از آموزش خوبتون
    من میخوام چند تا از این ماژول ها رو برای فقط فروارد کردن هم اس ام اس های دریافتی به شماره خودم استفاده کنم.
    چه کدی باید استفاده کنم؟

    • با سلام
      برای این کار بایستیی داخل فایل gsmCallback.c دربخش مربوط به دریافت پیام تابع ارسال پیام را با شماره خود و قرار دهید. اما توجه داشته باشید که اگر پیام های دریافتی فارسی باشند نیاز است که در کتاخانه تغیراتی ایجاد شود که در حال حاظر این مورد هنوز انجام نشده است.

  • سلام
    با اضافه کردن gsm_at_rxCallback(); برنامه error آورد
    که با برداشتن strong ها برنامه نرمال شد اما روی میکرو کار نکرد.

    • با توجه به کدهای ارائه شده و سوال شما، به نظر می‌رسد که این مشکل به دلیل استفاده از strong در تابع USART1_IRQHandler مربوط به کتابخانه GSM باشد. شما گفته‌اید با حذف strong‌ها، برنامه نرمال شد اما روی میکروکنترلر کار نکرد. در این صورت، ممکن است مشکل از ابتدا در تابع USART1_IRQHandler باشد.
      اگر این مشکل به دلیل استفاده از FreeRTOS بوجود آمده است، یکی از راه‌حل‌ها این است که استفاده از gsm_at_rxCallback در زمان اجرا در یک وظیفه جداگانه از طریق FreeRTOS انجام شود. به عبارت دیگر، شاید بهتر باشد این تابع در یک Task جداگانه اجرا شود.

      مثلاً، می‌توانید یک Task به شکل زیر ایجاد کنید:
      void GSM_Task(void const * argument)
      {
      for(;;)
      {
      gsm_at_rxCallback();
      osDelay(1);
      }
      }

  • سلام خیلی ممنون از سایت خوبتون
    من موقعی که میخوام کامپایل کنم با این مشکل روبرو میشم راه حلی برای رفع این مشکل وجود داره؟
    TEST_LIB_SIM800\TEST_LIB_SIM800.axf: Error: L6406E: No space in execution regions with .ANY selector matching startup_stm32f103x6.o(STACK).

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