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

ارسال و دریافت SMS با STM32 و ماژول SIM800c

ارسال و دریافت SMS با استفاده از میکروکنترلر STM32F103C8 و ماژول SIM800c GSM

ماژول‌های GSM با توجه به قابلیتی که در ارسال و دریافت ریموت داده‌ها دارند، در سیستم‌ها و پروژه‌های IoT به صورت مکرر مورد استفاده قرار می‌گیرند. خوبی این ماژول‌ها این است که برخلاف ماژول‌های WiFi، محدودیت‌ها و بستگی‌های چندانی در استفاده ندارند و در حالیکه ماژول‌هایی مانند Wi-Fi و Zigbee معایبی مانند برد کوتاه و قیمت بالا دارند، ماژول‌های GSM هم برد بلند‌تری دارند و هم قابلیت اطمینان بیشتری و برای استفاده از آنها تنها کافیست که یک سیم‌کارت در اختیار داشته باشیم. البته نقطه ‌ضعف این ماژول‌ها نیز این است که قابلیت ارسال و دریافت داده‌های وسیعی که مثلا از طریق سنسورها جمع‌آوری می‌شوند را ندارند و تنها برای استفاده در مواردی مناسب هستند که با مبادله‌ی داده‌های کوچک سر و کار داریم.

در این جلسه می‌خواهیم یکی از ماژول‌های GSM را به میکروکنترلر STM32F103C8 ARM متصل کنیم و با استفاده از یک خط تلفن همراه پیامک ارسال کنیم. برای نمایش دادن پیام ارسال و دریافت شده هم از یک LCD 16×2 در پروژه استفاده می‌کنیم. از دو کلید فشاری هم برای initialize کردن بعد از هر ارسال و دریافت استفاده می‌کنیم.

تجهیزات مورد نیاز برای اجرای پروژه

  • میکروکنترلر STM32F103C8 Cortex-M3
  • ماژول GSM SIM800-C
  • LCD 16×2
  • دو عدد کلید فشاری
  • پتانسیومتر 10K
  • برد بورد
  • سیم رابط برد بوردی

آشنایی با ماژول SIM800C

ارسال و دریافت SMS با استفاده از میکروکنترلر STM32F103C8 و ماژول SIM800c GSM

SIM800-C یکی از ماژول‌های معروف و پرکاربرد GSM است که اینترفیس سریال دارد و ولتاژ کاری آن بین ۳.۴ تا ۴.۴ ولت است. این ماژول در حقیقت یک ماژول GSM/GPRS چهار بانده (Quad-band) است که در کاربردهای امبددی که به جابه‌جایی ریموت داده‌ها نیاز دارند مورد استفاده قرار می‌گیرد. SIM800C در فرکانس‌های ۸۵۰، ۹۰۰، ۱۸۰۰ و ۱۹۰۰ مگاهرتز کار می‌کند. این ماژول قادر است تماس صوتی و پیامک را با مصرف توان پایینی ارسال و دریافت کند. کار کردن با آن به وسیله‌ی AT Command‌ها صورت می‌گیرد. یک عدد سیم‌کارت می‌خورد و از پروتکل‌های UART و RS-232 پشتیبانی می‌کند. به این ترتیب می‌تواند با میکروکنترلرهای مختلف اینترفیس داشته باشد.

تغذیه‌ی ماژول SIM800C

تغذیه‌ی این ماژول با یک آداپتور ۱۲ ولتی DC تامین می‌شود.

قرار دادن سیم‌کارت در درون ماژول

محل قرار گرفتن سیم‌کارت در پشت ماژول SIM800C است. فقط توجه داشته باشید که این ماژول از سیم‌کارت‌های 4G پشتیبانی نمی‌کند بنابراین نباید از این سیم‌کارت‌ها استفاده کنید.

ارسال و دریافت SMS با استفاده از میکروکنترلر STM32F103C8 و ماژول SIM800c GSM

متصل کردن SIM800C به میکروکنترلر STM32F103C8

برای اتصال این ماژول به میکروکنترلر STM32، از پورت سریال UART آن استفاده می‌کنیم. پین‌های UART میکروکنترلر هم A9 و A10 هستند که در شکل زیر نشان داده شده‌اند.

ارسال و دریافت SMS با استفاده از میکروکنترلر STM32F103C8 و ماژول SIM800c GSM

این میکروکنترلر دارای سه اینترفیس UART است که می‌توان همزمان سه دستگاه جانبی را با این پروتکل به آن متصل کرد.

AT Command‌ها

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

مطلب پیشنهادی:  راه اندازی پروتکل سریال میکروکنترلرهای STM32-بخش مقدماتی( STM32 UART )

ارسال و دریافت SMS با استفاده از میکروکنترلر STM32F103C8 و ماژول SIM800c GSM

دیاگرام مدار

برای اتصال ماژول SIM800C به میکروکنترلر STM32 از مدار زیر استفاده می‌کنیم.

ارسال و دریافت SMS با استفاده از میکروکنترلر STM32F103C8 و ماژول SIM800c GSM

اتصالات بین SIM800C و میکروکنترلر

ارسال و دریافت SMS با استفاده از میکروکنترلر STM32F103C8 و ماژول SIM800c GSM

اتصالات بین میکروکنترلر و LCD 16×2

ارسال و دریافت SMS با استفاده از میکروکنترلر STM32F103C8 و ماژول SIM800c GSM

دو کلید فشاری با مقاومت‌های پول داون 10K به پایه‌های PA0 و PA1 میکروکنترلر متصل می‌شوند و ست آپ کلی مدار چیزی شبیه شکل زیر خواهد شد.

ارسال و دریافت SMS با استفاده از میکروکنترلر STM32F103C8 و ماژول SIM800c GSM

نوشتن کد میکروکنترلر برای ارتباط با SIM800C

این میکروکنترلر را می‌توان با استفاده از Arduino IDE هم پروگرم کرد. به این ترتیب دیگر به پروگرمر FTDI و یا ST-link نیازی نداریم. برای پروگرم کردن کافی است بعد از نوشتن کد در IDE، پورت میکرو USB کابل USB را به میکرو، و پورت USB آن را به PC وصل کنیم. در صورتی که در این رابطه سوال داشتید، به آموزش مفصلی که قبلا برای پروگرم کردن میکروی STM32 با استفاده از Arduino IDE  داشته‌ایم مراجعه کنید.

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

پین‌های LCD را تنظیم می‌کنیم و کتابخانه‌های مورد نیاز را اضافه می‌کنیم.

#include <LiquidCrystal.h>                           
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;      
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

LCD را با استفاده از تابع ;(lcd.begin(16,2 مقداردهی اولیه می‌کنیم. منظور از (16,2) در این دستور، نوع LCD مورد استفاده است که 2×16 می‌باشد.

یک پیام را پرینت می‌کنیم صرفا برای اینکه تست کنیم که اتصالات LCD به درستی برقرار شده‌ و کار می‌کنند.

lcd.begin(16,2);           
lcd.print("STM32 WITH GSM");   
lcd.setCursor(0,1);
lcd.print("SIM800C");

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

pinMode(PA0,INPUT);       
pinMode(PA1,INPUT);

بادریت ارتباط سریال را هم مشخص می‌کنیم.

Serial1.begin(9600);

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

تابع SendMessage

از این تابع برای ارسال SMS به یک شماره‌ی مخصوص استفاده می‌کنیم. AT Command‌هایی که باید ارسال کنیم مربوط به ارسال و تعیین شماره‌ی مقصد و نیز تنظیم مود پیام ارسالی است.

با دستور زیر، مود پیام را روی حالت پیام متنی قرار می‌دهیم.

Serial1.println("AT+CMGF=1");  //Sets the GSM Module in Text Mode

بعد از آن دستور مربوط به ارسال را قرار می‌دهیم و شماره‌ی مقصد را نیز در آن ذکر می‌کنیم. ارسال را از طریق پورت سریال ۱ انجام می‌دهیم.

Serial1.println("AT+CMGS=\"+91XXXXXXXXXX\"\r"); // Replace x with mobile number

پیام‌ها را با یک وقفه‌ی یک ثانیه‌ای ارسال می‌کنیم و همان‌طور که گفتیم برای ارسال باید از کلیدهای CTRL+Z استفاده کنیم. به این منظور ASCII این دستور (CTRL+Z) را وارد کنیم.

delay(1000);
 Serial1.println("Hi Circuit Digest from GSM Module"); // The SMS text you want to send
 Serial1.println((char)26);// ASCII code of CTRL+Z

پس از آن می‌بینیم که SMS ارسال شده بر روی LCD نشان داده می‌شود.

lcd.print("SMS SENT");

تابع ReceiveMessage

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

Serial1.println("AT+CNMI=2,2,0,0,0");

AT Command فوق برای دریافت پیام‌ها استفاده می‌شود.

مطلب پیشنهادی:  پروتکل ارتباطی SPI در میکروکنترلر STM32

هر پیامی ‌که بر روی پورت سریال ۱ دریافت شود، به صورت یک رشته (string) است که علاوه بر پیام، شامل اطلاعات دیگری مانند تاریخ و زمان و … نیز هست. اصل متن پیام دریافتی، در ششمین “” موجود در رشته‌ی دریافت شده قرار دارد. پس تمام اطلاعات دیگر به غیر از آن را حذف کرده و فقط همین قسمت را بر روی LCD نمایش می‌دهیم.

while(1)
  {
           if(Serial1.available())
            {
                do
                  {
                     while ( !Serial1.available() );    
                  } while ( '"' != Serial1.read() );
               do
                  {
                      while ( !Serial1.available() );    
                  } while ( '"' != Serial1.read() );
               do
                 {
                      while ( !Serial1.available() );    
                  } while ( '"' != Serial1.read() );
               do
                 {
                    while ( !Serial1.available() );    
                 } while ( '"' != Serial1.read() );
                do
                  {
                     while ( !Serial1.available() );              
                  } while ( '"' != Serial1.read() );
                do
                 {
                    while ( !Serial1.available() );  
                  } while ( '"' != Serial1.read() );
                  while ( !Serial1.available() );
                  receive = Serial1.read();     
                  while ( !Serial1.available() );
                  receive = Serial1.read();
    lcd.clear();
    while(1)
    {
        while ( !Serial1.available() ); 
        receive = Serial1.read();
        if ( receive == '\r' )   
              break;
     else
             lcd.write(receive);
     }
}
}

دموی ارسال و دریافت داده با استفاده از میکروکنترلر STM32

  1. برای ارسال پیام متنی: کافیست که کلید فشاری سمت چپ را بزنید. پیام به شماره‌ای که در کد درج کرده باشید ارسال خواهد شد.

ارسال و دریافت SMS با استفاده از میکروکنترلر STM32F103C8 و ماژول SIM800c GSM

  1. برای دریافت پیام متنی: کلید فشاری سمت راست را بزنید تا پیام دریافت شده و بر روی LCD نشان داده شود.

ارسال و دریافت SMS با استفاده از میکروکنترلر STM32F103C8 و ماژول SIM800c GSM

به پایان این آموزش رسیدیم. ارتباط بین ماژول SIM800C و میکروکنترلر STM32 به همین سادگی قابل برقراری است. اگر هر سوال دیگری در مورد این پروژه داشتید، حتما در قسمت کامنت‌های همین مطلب برایمان ارسال کنید.

کد

#include <LiquidCrystal.h>            //Library for LCD display                    
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;      //Pins that are connected between LCD and STM32
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int receive = 0;
void setup()
{
  lcd.begin(16,2);           //LCD set at 16x2 mode
  
  pinMode(PA0,INPUT);       //Push buttons as INPUT pins
  pinMode(PA1,INPUT);
  
  lcd.print("STM32 WITH GSM");   //Display Welcome message
  lcd.setCursor(0,1);
  lcd.print("SIM800C");
  
  Serial1.begin(9600);   // Setting the baud rate of GSM Module 

  delay(1000);

  lcd.clear();

}

void loop()

{
 
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("S to Send sms");
  lcd.setCursor(0,1);
  lcd.print("R to Receive sms");
  delay(100);
  
  
  int a = digitalRead(PA0);          //Read status of the push buttons
  int b = digitalRead(PA1);
  
  if (a == 1)                         // Depeding upon which push button is pressed the respected function is called
       {
         SendMessage();
       } 
       
else if( b == 1)
      {
         RecieveMessage();
      }
       
} 
 
 void SendMessage()      //Function to Send Message
{
  lcd.clear();
  
  lcd.print("Sending sms");
  delay(1000);
  Serial1.println("AT+CMGF=1");    //Sets the GSM Module in Text Mode

  delay(1000);  

  Serial1.println("AT+CMGS=\"+91XXXXXXXXXX\"\r"); // Replace x with mobile number

  delay(1000);

  Serial1.println("Hi Circuit Digest from GSM Module"); // The SMS text you want to send

  delay(100);

  Serial1.println((char)26);// ASCII code of CTRL+Z

  delay(1000);
  lcd.clear();
  lcd.print("SMS SENT");
  delay(1000);
}

 void RecieveMessage()         //Function to Receive Message

{
 
  lcd.clear();
  lcd.print("Receiving sms");

  Serial1.println("AT+CNMI=2,2,0,0,0"); // AT Command to recieve a live SMS

  delay(1000);
  
  while(1)
  {
           if(Serial1.available())
            {
                do

                  {

                     while ( !Serial1.available() );    

                  } while ( '"' != Serial1.read() );

               do

                  {

                      while ( !Serial1.available() );    

                  } while ( '"' != Serial1.read() );

               do

                 {

                      while ( !Serial1.available() );    

                  } while ( '"' != Serial1.read() );

               do

                 {

                    while ( !Serial1.available() );    

                 } while ( '"' != Serial1.read() );

                do
        
                  {

                     while ( !Serial1.available() );  
                         

                  } while ( '"' != Serial1.read() );

                do

                 {
             
                    while ( !Serial1.available() );  
                       

                  } while ( '"' != Serial1.read() );

                  while ( !Serial1.available() );

                  receive = Serial1.read();     

                  while ( !Serial1.available() );

                  receive = Serial1.read();

    
    lcd.clear();

    while(1)

    {

        while ( !Serial1.available() ); 

        receive = Serial1.read();

        if ( receive == '\r' )
           
              break;
           
        else

             lcd.write(receive);
     }
}
}
}

ویدئو

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

امیدواریم آموزش «ارسال و دریافت SMS با STM32 و ماژول SIM800c» برایتان مفید واقع شده باشد. در ادامه پیشنهاد می‌کنیم دیگر آموزش‌های STM32 را نیز مطالعه کنید.

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

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

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