راه اندازی ماژول SIM800L با آردوینو UNO

5
2972
راه اندازی ماژول SIM800L با آردوینو UNO

برای راه اندازی ماژول SIM800L با آردوینو ، ابتدا باید آنتن را به ماژول GSM وصل کرد. سپس سیم کارت میکرو فعال شده را در سوکت سیم کارت قرار داد. با اتصال پین TX ماژول به پین ۳ آردوینو می توان از طریق مانیتور سریال آردوینو با ماژول ارتباط برقرار کرد. 

باید به این نکته توجه شود که نمی توان پین Rx ماژول را به صورت مستقیم به پین دیجیتال آردوینو وصل کرد. زیرا ولتاژ روی پایه های GPIO در آردوینو Uno پنج ولت است، در حالیکه ماژول SIM800L با ۳٫۳ ولت کار می کند و تحمل ۵ ولت را ندارد. بنابراین سطح ولتاژی که از آردوینو به ماژول وارد می شود باید به ۳٫۳ کاهش یابد تا به ماژول آسیبی نرسد. چندین راه حل برای کاهش سطح سیگنال  وجود دارد که ساده ترین آن استفاده از یک تقسیم مقاومتی ساده است. می توان یک مقاومت ۱۰ کیلو اهم بین پین Rx ماژول SIM800L GSM و پین ۲ آردوینو Uno و همچنین یک مقاومت ۲۰ کیلو اهم بین پین RX ماژول و زمین قرار داد.

حال باید پین های منبع تغذیه وصل شوند. همانطور که در مقاله معرفی ماژول SIM800L GSM توضیح داده شد، می توان برای تغذیه ماژول به دو روش عمل کرد که در شکل های زیر شماتیک مدار و نحوه اتصال آن آورده شده است. در شکل اول از باتری Li-Po  با ظرفیت ۱۲۰۰mAh و در شکل  دوم از مبدل کاهنده باک LM2596 برای تغذیه ماژول استفاده شده است.

  راه اندازی ماژول SIM800l با آردوینو UNO و استفاده از باتری Li-Po 3.7 ولت برای تغذیه ماژول
راه اندازی ماژول SIM800l با آردوینو UNO و استفاده از باتری Li-Po 3.7 ولت برای تغذیه ماژول
 راه اندازی ماژول SIM800l با آردوینو UNO و استفاده از مبدل کاهنده باک برای تغذیه ماژول
راه اندازی ماژول SIM800l با آردوینو UNO و استفاده از مبدل کاهنده باک برای تغذیه ماژول

توجه: هنگامیکه از مبدل کاهنده LM2596 به عنوان منبع تغذیه ماژول استفاده می شود، زمین های مدار باید به یکدیگر متصل باشند.


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

بررسی دستورات AT برای راه اندازی ماژول SIM800l با آردوینو

برای ارسال دستورات AT و ارتباط با ماژول SIM800L از مانیتور سریال نرم افزار آردوینو استفاده می شود. کد زیر برای ارتباط آردوینو با ماژول SIM800L بر روی مانیتور سریال ، نوشته شده است. . برای برنامه ریزی آردوینو ، ابتدا باید آردوینو به کامپیوتر وصل شود و سپس کد زیر اجرا و در آردوینو آپلود شود.

لازم به ذکر است که در پنجره مانیتور سریال  ، باید گزینه NL&CR انتخاب شود. حال به شرح قسمت های مختلف کد پرداخته می شود.

#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+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();
}
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
  }
}

در ابتدای کد کتابخانه SoftwareSerial.h برای ارتباط سریال میان پین های آردوینو و پورت های Rx /Tx ماژول SIM800L افزوده  شده است. 

#include < SoftwareSerial.h >
//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2

در تابع setup ، تنظیمات اولیه ارتباط سریال بین آردوینو، محیط آردوینو IDE و ماژول SIM800L با نرخ ارسال ۹۶۰۰ آورده شده است.

//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 دیده شوند به این معناست که کد به درستی اجرا شده است. سپس کد دستوری برای درخواست ارتباط با ماژول داده می شود که حاوی اطلاعات زیر است:

دستور AT : پایه ترین دستور AT است که با ارسال آن و دریافت OK از سمت ماژول می توان از برقراری ارتباط بین ماژول و آردوینو اطمینان یافت. سپس می توان دستوراتی را مانند دستورات زیر، برای ماژول ارسال کرد و اطلاعاتی را در مورد آن بدست آورد:

دستور AT+CSQ : شدت سیگنال را بررسی می کند. عدد اول، شدت سیگنال به دسی بل را بیان می کند که باید مقدارش از ۵ بیشتر باشد. هر چه این مقدار بیشتر باشد، بهتر است. البته این مقدار به نوع آنتن مورد استفاده و موقعیت مکانی ماژول بستگی دارد. 

دستور AT+CCID : با ارسال این دستور و دریافت OK می توان از فعال بودن سیم کارت اطمینان پیدا کرد. به علاوه با این دستور شماره سیم کارت قابل دریافت است. 

دستور ?AT+CREG : بررسی می کند که آیا سیم کارت در شبکه ثبت شده یا خیر. عدد دوم که در پاسخ به این دستور دریافت می شود، نوع شبکه ای که سیم کارت در آن ثبت شده است را نشان می دهد. این عدد می تواند ۱ یا ۵ باشد. عدد ۱ نشان دهنده شبکه خانگی و عدد ۵ نشان دهنده شبکه رومینگ است. هر عدد دیگری به جز ۱ و ۵ ، نشان می دهد که سیم کارت در هیچ شبکه ای ثبت نشده است.

  delay(1000);
  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();

در تابع loop ، تابع ()updateSerial قرار دارد که دائماً منتظر ورودی های مانیتور سریال است تا آن را از طریق پین ۲ (پین Rx ماژول) به ماژول SIM800L ارسال کند. همچنین دائماً پین D3 (پین Tx ماژول) را چک می کند تا اگر ماژول پاسخی به ورودی داشته باشد، آن را در مانیتور سریال نشان دهد.

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 برای راه اندازی ماژول SIM800l با آردوینو
دستورات پایه AT برای ارتباط با ماژول SIM800

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

دستور ATI : نام و نسخه ماژول را می دهد.

دستور ?AT+COPS : اتصال به شبکه را بررسی می کند. .

دستور AT+COPS=? : لیست اُپراتورهای موجود در شبکه را نشان می دهد.

دستور AT+CBC : وضعیت باتری Li-Po را نشان می دهد. عدد دوم میزان شارژ باتری (که در اینجا ۹۳%) و عدد سوم ولتاژ واقعی به میلی ولت (در اینجا ۳٫۸۷۷ ولت) است.

دستورات AT برای اتصال شبکه در ماژول SIM800L GSM

ارسال پیام با ماژول SIM800L GSM

پس از آماده سازی آردوینو و SIM800 ، می توان ماژول آردوینو را برای ارسال پیام به شماره موبایل مورد نظر کد نویسی کرد. قبل از کد نویسی باید شماره موبایل را وارد کرد. در رشته ZZxxxxxxxxxx ، کد کشور باید جایگزین ZZ و شماره ۱۰ رقمی به جای xxxxxxxxxx قرار گیرد.

#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 | lastminuteengineers.com"); //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 : قالب پیام را از نوع “متن” قرار می دهد. قالب پیشفرض PDU (پروتکل انتقال داده) است.

دستور AT+CMGS=+ZZxxxxxxxxxx : پیام را به شماره مشخص شده ارسال می کند. پیامی که به دنبال آن کلید ‘Ctrl+z’ وارد شود به عنوان یک پیام متنی در نظر گرفته می شود. کلید ‘Ctrl+z’ بیست و ششمین کاراکتر جدول ASCII است. بنابراین، لازم است که هنگام ارسال پیام متنی ۲۶ دسیمال یا ۱A هگز ارسال شود. 

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 | lastminuteengineers.com"); //text content
  updateSerial();
  mySerial.write(26);

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

دریافت پیام با SIM800L

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

#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 متفاوت است. در این کد ، هنگامی که اتصال برقرار می شود، دستورات AT زیر اجرا می شوند: 

دستور AT+CMGF=1 : قالب پیام را از نوع ‘متنی’ قرار می دهد. قالب پیشفرض PDU است. 

دستور AT+CNMI=1,2,0,0,0 : چگونگی دستیابی کامپیوتر به پیام جدید را تعیین می کند. با استفاده از این دستور می توان تعیین کرد که ماژول پیام های ورودی جدید را مستقیما به کامپیوتر ارسال کند یا آنها را در حافظه خود ذخیره کند و سپس مکان ذخیره سازی پیام را به کامپیوتر اطلاع دهد.

پاسخ ماژول با کد دستوری CMT+ شروع می شود: تمام مقادیر در آن با استفاده از کاما ‘,’ از یکدیگر جدا شده اند. اولین مقدار شماره موبایل، مقدار دوم نام شخصی است که پیام را فرستاده، مقدار سوم تاریخ و زمان دریافت پیام و مقدار چهارم متن پیام است. 

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();

این بار تابع loop (حلقه) خالی نیست  تا هر زمان که پیامی به ماژول ارسال شود، بتوان آن را خواند. به محض ارسال پیام به ماژول SIM800 ، می توان آن را بر روی مانیتور سریال مشاهده کرد.

افزایش اندازه بافر SoftwareSerial آردوینو برای دریافت پیام

در صورتی که پیام طولانی باشد، ممکن است که برخی از کاراکترها حذف شوند. این مساله به دلیل خطای کد نویسی نمی باشد بلکه بافر دریافتی SoftwareSerial پر شده و به همین دلیل، برخی از کاراکترها حذف می شوند. 

ساده ترین راه حل افزایش اندازه بافر SoftwareSerial است. اندازه پیشفرض بافر ۶۴ بایت است که می توان آن را تا ۲۵۶ بایت (این مقدار بسته به کاربرد میتواند کمتر انتخاب شود) افزایش داد. برای این منظور، در کامپیوتر در صورتی که دارای سیستم عامل ویندوز باشد، به آدرس زیر رفته :

C:\Program Files (x86) -> Arduino -> hardware -> Arduino -> avr -> libraries -> SoftwareSerial

(در صورتی که از نسخه های جدیدتر آردوینو IDE استفاده می شود به پوشه src رفته)، سپس کتابخانه SoftwareSerial.h را باز کرده و دستور مربوط به اندازه بافر مانند زیر تغییر کند:

// RX buffer size
#define _SS_MAX_RX_BUFF 64

باید به صورت زیر تغییر کند:

// RX buffer size
#define _SS_MAX_RX_BUFF 256

پس از ذخیره کردن فایل، باید کد دوباره اجرا شود.

آردوینو  SoftwareSerial افزایش اندازه بافر
افزایش اندازه بافر SoftwareSerial آردوینو

برقراری تماس با ماژول SIM800L و آردوینو

این دستورات برای برقراری تماس کمکی (SoS) در موقعیت های خطرناک و اضطراری بطور مثال، زمانیکه آتش سوزی یا سرقت در منزل رخ بدهد، کاربرد دارد. 

قبل از اجرای برنامه، ابتدا باید شماره موبایل مورد نظر وارد شود به این صورت که در رشته ZZxxxxxxxxxx کد کشور با ZZ و شماره موبایل ۱۰ رقمی مورد نظر با xxxxxxxxxx  جایگزین شوند.

#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+ +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();
}
 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 زیر را به کار برد: 

دستور ;ATD+ +ZZxxxxxxxxxx : با شماره وارد شده تماس می گیرد. کاراکتر (;) نشان دهنده پایان دستور است و باید در انتهای تمام خط کدها قرار بگیرد. 

دستور ATH : تماس را قطع می کند.

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();

دریافت تماس با آردوینو و ماژول SIM800L

برای دریافت تماس، تنها کافیست که به ماژول SIM800L گوش داده شود. کد زیر برای زمانی که لازم باشد هنگام دریافت تماس از یک شماره بخصوص، کار خاصی انجام گیرد، کاربرد دارد.

#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
  }
}

زمانی که تماس دریافت می شود، “RING” در مانیتور سریال مشاهده می شود. به دنبال “RING” شماره تلفن و شناسه تماس گیرنده نیز در مانیتور سریال نرم افزار آردوینو دیده می شود. برای پذیرش یا قطع تماس ورودی، از دستورات AT زیراستفاده می شود: 

دستور ATA  : برای پذیرش تماس ورودی به کار میرود.

دستور ATH : تماس ورودی را قطع می کند. هنگام قطع تماس، “NO CARRIER” را بر روی مانیتور سریال می فرستد و نشان دهنده این است که تماسی برقرار نشده است. 

5 دیدگاه‌ها

  1. سلام و خداقوت بسیار خدمت شما.امیدوارم هرکجا که هستید سالم و موفق وخوشحال باشید.مطالبی که ذکر کردید بسیار مفید بود.

  2. من هرچقدر تلاش کردم نتونستم با استفاده از این ماژول پیامک بفرستم!
    ماژول پیامک و تماس دریافت می کنه
    اما وقتی پیامک می فرستم ارور میده؟
    پیشنهادی ندارید؟

ارسال یک پاسخ

لطفا دیدگاه خود را وارد کنید!
لطفا نام خود را در اینجا وارد کنید