ارسال و دریافت پیامک و تماس توسط ماژول SIM800L و آردوینو

الکترونیک و رباتیک -> ماژول ها و سنسور ها 21047 6 کاربر آکادمی پارتینه

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

مواد اولیه :
# عنوان تعداد لینک
0 بورد آردوینو 1 لینک خرید
1 ماژول GSM چهار باند SIM800L 1 لینک خرید
2 برد بورد 1 لینک خرید
3 ماژول LM2596 1 لینک خرید

مرحله 1 : اتصالات و دیاگرام مداری

در وهله‌ی اول باید آنتن را به ماژول لحیم کرده و میکرو سیم را داخل سوکت قرار داد. به دلیل اینکه بورد آردوینو Uno فقط دارای یک پورت ارتباط سریال می‌باشد که جهت ارتباط با کامپیوتر به منظور پروگرام کردن استفاده می‌شود، باید ازکتابخانه‌ی SoftwareSerial بهره‌گرفته و پین‌های دیجیتال آردوینو را به صورت پورت سریال تعریف کرد. بنابراین پین Tx ماژول را به پین دیجیتال شماره سه آردوینو متصل کرده و توسط یک مدار مقسم ولتاژ پین RX  به صورت غیر مستقیم به ماژول متصل می‌شود. دلیل تقسیم ولتاژ این است که سطح ولتاژ خروجی پین‌های GPIO در آردوینو پنج ولت بوده، در حالیکه سطح ولتاژ ماژول 3.3 ولت است و با اعمال 5 ولت آسیب میبیند. بنابراین از مقسم ولتاژی شامل مقاومت‌های 10 کیلو اهم و 20 کیلو اهم استفاده کرده و سطح ولتاژ را کاهش می‌دهیم.

برای تامین تغذیه‌ی ماژول از دو روشی که این آموزش معرفی شد می‌توان استفاده کرد. در دو دیاگرام مداری هر دو روش نشان داده شده است.

نکته: در صورت استفاده از مبدل LM2596 باید زمین (GND) تمامی قطعات مشترک باشد.

مرحله 2 : کدنویسی و تنظیمات نرم‌افزاری

دستورات (AT (Attention Command به صورت انحصاری برای ماژول ‌های GSM طراحی شده‌اند تا مواردی از جمله ارسال دریافت پیامک و تماس را پوشش دهند. برای ارسال دستورات AT و برقراری ارتباط با ماژول SIM800L از سریال مانیتور کامپایلر آردوینو استفاده خواهد شد. برنامه زیر امکان ارتباط بین ماژول و آردوینو را فراهم می‌کند. برنامه‌ی زیر را آپلود کرده و سریال مانیتور کامپایلر را باز کنید.

برنامه شامل کتابخانه‌ی SoftwareSerial.h است که پین‌های 2 و 3 به عنوان پورت سریال تعریف شده‌اند.

#include <SoftwareSerial.h>

//Create software serial object to communicate with SIM800L

SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2

در قسمت تنظیمات برنامه سرعت انتقال داده را 9600 تعریف می‌کنیم.

//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)

  Serial.begin(9600);

    //Begin serial communication with Arduino and SIM800L

  mySerial.begin(9600);

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

AT+CSQ

این دستور قدرت سیگنال و باند رادیویی را شناسایی می‌کند. مقدار آن باید بیش از 5 دسی بل باشد. البته این مساله بستگی به آنتن و مکان آن دارد.

AT+CCID

با این دستور شماره سیم‌کارت خوانده شده و درستی عملکرد آن تست می‌شود.

AT+CREG

این فرمان وضعیت رجیستر شبکه (اتصال) را بررسی می‌کند. 0 به معنای عدم اتصال، ۱ به معنای اتصال به یک شبکه، ۲ جستجوی شبکه، ۴ رد شدن اتصال به شبکه و ۵ اتصال به شبکه رومینگ است. 

  mySerial.println("AT"); //Once the handshake test is successful, it will back to OK
  updateSerial();
  mySerial.println("AT+CSQ"); //Signal quality test, value range is 0-31 , 31 is the best
  updateSerial();
  mySerial.println("AT+CCID"); //Read SIM information to confirm whether the SIM is plugged
  updateSerial();
  mySerial.println("AT+CREG?"); //Check whether it has registered in the network
  updateSerial();

در حلقه برنامه از تابعی به نام ()updateSerial استفاده می‌شود. این تابع دائما منتظر دریافت فرمان از سریال مانیتور است و آن را از طریق پین Rx به ماژول SIM800L می فرستد.

void updateSerial()
{
  delay(500);
  while (Serial.available()) 
  {
    mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
  }
  while(mySerial.available()) 
  {
    Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
  }
}

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

مرحله 3 : برنامه‌ی ارسال پیامک توسط SIM808

جالب ترین قابلیت ماژول ارسال و دریافت پیامک است. باید آردوینو را برای ارسال پیامک به شماره تلفن مورد نظر برنامه‌ریزی کرد. قبل از آپلود برنامه بر روی بورد، باید شماره تلفن را وارد کنید. در داخل برنامه عبارت ZZxxxxxxxxxxx را پیدا کرده و ZZ را با کد کشور و xxxxxxxxxxx را با شماره تلفن 11 رقمی جایگزین کنید.

#include <SoftwareSerial.h>
 
//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2
 
void setup()
{
  //Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
  Serial.begin(9600);
  
  //Begin serial communication with Arduino and SIM800L
  mySerial.begin(9600);
 
  Serial.println("Initializing..."); 
  delay(1000);
 
  mySerial.println("AT"); //Once the handshake test is successful, it will back to OK
  updateSerial();
 
  mySerial.println("AT+CMGF=1"); // Configuring TEXT mode
  updateSerial();
  mySerial.println("AT+CMGS="+ZZxxxxxxxxxx"");//change ZZ with country code and xxxxxxxxxxx with phone number to sms
  updateSerial();
  mySerial.print("Last Minute Engineers"); //text content
  updateSerial();
  mySerial.write(26);
}
 
void loop()
{
}
 void updateSerial()
{
  delay(500);
  while (Serial.available()) 
  {
    mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
  }
  while(mySerial.available()) 
  {
    Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
  }
}
 

AT+CMGF=1

این دستور به منظور تنظیم حالت ماژول برای دریافت SMS به حالت عددی یا متنی است. حالت ۰ برای دریافت عددی و حالت ۱ آمادگی ماژول برای دریافت پیامک متنی خواهد بود. به حالت صفر که برای دریافت پیامک عددی است، حالت PDU هم گفته می‌شود. عبارت PDU مخفف protocol description unit می‌باشد.

AT+CMGS=+ZZxxxxxxxxxx 

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

mySerial.println("AT+CMGF=1"); // Configuring TEXT mode
  updateSerial();
  mySerial.println("AT+CMGS="+ZZxxxxxxxxxx"");//change ZZ with country code and xxxxxxxxxxx with phone number to sms
  updateSerial();
  mySerial.print("Last Minute Engineers"); //text content
  updateSerial();
  mySerial.write(26);

 حلقه منتظر گرفتن فرمان جهت ارسال پیامک می‌ماند. برای هر بار ارسال پیامک باید آردوینو را ریست کنید. تصویر بالا پیامک ارسال شده از ماژول GSM SIM800L را نشان می دهد.

مرحله 4 : برنامه‌ی دریافت پیامک توسط SIM800

اکنون برنامه‌ای را به منظور خواندن پیام متنی بررسی می‌کنیم. این برنامه به منظور انجام عملی خاص برای مثال روشن کردن یک رله به محض دریافت پیامک بسیار مفید است.

#include <SoftwareSerial.h>
 
//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2
 
void setup()
{
  //Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
  Serial.begin(9600);
  
  //Begin serial communication with Arduino and SIM800L
  mySerial.begin(9600);
 
  Serial.println("Initializing..."); 
  delay(1000);
 
  mySerial.println("AT"); //Once the handshake test is successful, it will back to OK
  updateSerial();
  
  mySerial.println("AT+CMGF=1"); // Configuring TEXT mode
  updateSerial();
  mySerial.println("AT+CNMI=1,2,0,0,0"); // Decides how newly arrived SMS messages should be handled
  updateSerial();
}
 
void loop()
{
  updateSerial();
}
 
void updateSerial()
{
  delay(500);
  while (Serial.available()) 
  {
    mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port
  }
  while(mySerial.available()) 
  {
    Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port
  }
}
 

AT+CNMI=1,2,0,0,0

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

mySerial.println("AT+CMGF=1"); // Configuring TEXT mode
  updateSerial();
  mySerial.println("AT+CNMI=1,2,0,0,0"); // Decides how newly arrived SMS messages should be handled
  updateSerial();

 خروجی ماژول SIM808 در هنگام ارسال پیامک به صورت تصویر بالا است.

مرحله 5 : برنامه‌ی برقراری تماس توسط SIM800

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

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

#include <SoftwareSerial.h>

//Create software serial object to communicate with SIM800L

SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2

void setup()

{

  //Begin serial communication with Arduino and Arduino IDE (Serial Monitor)

  Serial.begin(9600);

    //Begin serial communication with Arduino and SIM800L

  mySerial.begin(9600);

  Serial.println("Initializing..."); 

  delay(1000);

  mySerial.println("AT"); //Once the handshake test is successful, i t will back to OK

  updateSerial();
  
  mySerial.println("ATD+ +ZZxxxxxxxxxxx;"); //  change ZZ with country code and xxxxxxxxxxx with phone number to dial

  updateSerial();

  delay(20000); // wait for 20 seconds...

  mySerial.println("ATH"); //hang up

  updateSerial();

}

void loop()

{

}


void updateSerial()

{

  delay(500);

  while (Serial.available()) 

  {

    mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port

  }

  while(mySerial.available()) 

  {

    Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port

  }

}

ATD+ +ZZxxxxxxxxxx

 این دستور عبارت ZZxxxxxxxxxx را شماره‌گیری می‌کند.

ATH

توسط این دستور تماس قطع می‌شود.

  mySerial.println("ATD+ +ZZxxxxxxxxxx;"); //  change ZZ with country code and xxxxxxxxxxx with phone number to dial

  updateSerial();

  delay(20000); // wait for 20 seconds...

  mySerial.println("ATH"); //hang up

  updateSerial();

مرحله 6 : برنامه‌ی دریافت تماس توسط SIM800

کد دریافت تماس توسط این ماژول پیچیدگی خاصی ندارد. فقط باید ماژول در حالت آماده‌باش قرار داشته باشد. تماس ورودی معمولاً توسط "RING" در سریال مانیتور و به دنبال آن شماره تلفن و شناسه تماس‌گیرنده نشان داده می‌شود. 

#include <SoftwareSerial.h>




//Create software serial object to communicate with SIM800L

SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2




void setup()

{

  //Begin serial communication with Arduino and Arduino IDE (Serial Monitor)

  Serial.begin(9600);

  

  //Begin serial communication with Arduino and SIM800L

  mySerial.begin(9600);




  Serial.println("Initializing..."); 

}




void loop()

{

  updateSerial();

}

void updateSerial()

{

  delay(500);

  while (Serial.available()) 

  {

    mySerial.write(Serial.read());//Forward what Serial received to Software Serial Port

  }

  while(mySerial.available()) 

  {

    Serial.write(mySerial.read());//Forward what Software Serial received to Serial Port

  }}

برای قبول / قطع تماس از دستورات AT زیر استفاده می شود:

ATA

توسط این دستور تماس ورودی پذیرفته می‌شود.

ATH

توسط این دستور تماس قطع می‌شود.

نظرات سایر کاربران درباره این پست

محمدرضا اسماعیل زاده

سلام میشه بگین چرا من وقتی جای ZZxxxxxxxxxxx در قسمت ارسال sms با ماژول به این error: 'ZZxxxxxxxxxx' was not declared in this scope mySerial.println("AT+CMGS="+ZZxxxxxxxxxx"");//change ZZ with country code and xxxxxxxxxxx with phone number to sms بر میخورم؟؟؟؟ و اینکه چطور میشه مثلا یک if نوشت که اگر پیام ارسال بود red on رو اجرا کنه رو پورت؟؟؟ من تازه اردوینو رو شروع کردم و اگر راهنمای کنید ممنون میشم