اگر علاقه دارید قسمت هایی از خانه خود را با برقراری یک تماس یا پیامک کنترل کنید، اتفاقات خانه خود را رصد کنید و یا حتی از طرف خانه شما پیامکی برروی تلفن همراه شما ارسال شود، پس با ما در آموزش راه اندازی ماژول SIM800L با آردوینو همراه باشید. پس از اتمام این مقاله شما میتوانید بهسادگی یک پروژه اینترنت اشیا (IOT) برای خود بسازید.
برای راه اندازی ماژول SIM800L با آردوینو، ابتدا باید آنتن را به ماژول GSM وصل کرد. سپس سیم کارت میکرو فعال شده را در سوکت سیم کارت قرار داد. با اتصال پین TX ماژول به پین 3 آردوینو می توان از طریق مانیتور سریال آردوینو با ماژول ارتباط برقرار کرد.
باید به این نکته توجه داشته باشید که نمی توان پین Rx ماژول را به صورت مستقیم به پین دیجیتال آردوینو وصل کرد. زیرا ولتاژ روی پایه های GPIO در آردوینو Uno پنج ولت است، در حالیکه ماژول SIM800L با 3.3 ولت کار می کند و تحمل 5 ولت را ندارد. بنابراین سطح ولتاژی که از آردوینو به ماژول وارد می شود باید به 3.3 کاهش یابد تا به ماژول آسیبی نرسد. چندین راه حل برای کاهش سطح سیگنال وجود دارد که ساده ترین آن استفاده از یک تقسیم مقاومتی ساده است. می توان یک مقاومت 10 کیلو اهم بین پین Rx ماژول SIM800L GSM و پین 2 آردوینو Uno و همچنین یک مقاومت 20 کیلو اهم بین پین RX ماژول و زمین قرار داد.
حال باید پین های منبع تغذیه وصل شوند. همانطور که در مقاله معرفی ماژول SIM800L GSM توضیح داده شد، می توان برای تغذیه ماژول به دو روش عمل کرد که در شکل های زیر شماتیک مدار و نحوه اتصال آن آورده شده است. در شکل اول از باتری Li-Po با ظرفیت 1200mAh و در شکل دوم از مبدل کاهنده باک LM2596 برای تغذیه ماژول استفاده شده است.
توجه: هنگامیکه از مبدل کاهنده LM2596 به عنوان منبع تغذیه ماژول استفاده می شود، زمین های مدار باید به یکدیگر متصل باشند.
هنگامیکه تمام اتصالات انجام شد، می توان آردوینو را برای ارسال و دریافت تماس و پیامک برنامه ریزی کرد.
بررسی دستورات AT برای راه اندازی ماژول SIM800l با آردوینو
برای ارسال دستورات AT و ارتباط با ماژول SIM800L از مانیتور سریال نرم افزار آردوینو استفاده می شود. کد زیر برای ارتباط آردوینو با ماژول SIM800L بر روی مانیتور سریال ، نوشته شده است. . برای برنامه ریزی آردوینو ، ابتدا باید آردوینو به کامپیوتر وصل شود و سپس کد زیر اجرا و در آردوینو آپلود شود.
لازم به ذکر است که در پنجره مانیتور سریال ، باید گزینه NL&CR انتخاب شود. حال به شرح قسمت های مختلف کد پرداخته می شود.
#include< SoftwareSerial.h > //Create software serial object to communicate with SIM800L SoftwareSerialmySerial (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 (); } voidupdateSerial () {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 SoftwareSerialmySerial (3, 2 );//SIM800L Tx & Rx is connected to Arduino #3 & #2
در تابع setup، تنظیمات اولیه ارتباط سریال بین آردوینو، محیط آردوینو IDE و ماژول SIM800L با نرخ ارسال 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 دیده شوند به این معناست که کد به درستی اجرا شده است. سپس کد دستوری برای درخواست ارتباط با ماژول داده می شود که حاوی اطلاعات زیر است:
دستور AT : پایه ترین دستور AT است که با ارسال آن و دریافت OK از سمت ماژول می توان از برقراری ارتباط بین ماژول و آردوینو اطمینان یافت. سپس می توان دستوراتی را مانند دستورات زیر، برای ماژول ارسال کرد و اطلاعاتی را در مورد آن بدست آورد:
دستور AT+CSQ : شدت سیگنال را بررسی می کند. عدد اول، شدت سیگنال به دسی بل را بیان می کند که باید مقدارش از 5 بیشتر باشد. هر چه این مقدار بیشتر باشد، بهتر است. البته این مقدار به نوع آنتن مورد استفاده و موقعیت مکانی ماژول بستگی دارد.
دستور AT+CCID : با ارسال این دستور و دریافت OK می توان از فعال بودن سیم کارت اطمینان پیدا کرد. به علاوه با این دستور شماره سیم کارت قابل دریافت است.
دستور ?AT+CREG : بررسی می کند که آیا سیم کارت در شبکه ثبت شده یا خیر. عدد دوم که در پاسخ به این دستور دریافت می شود، نوع شبکه ای که سیم کارت در آن ثبت شده است را نشان می دهد. این عدد می تواند 1 یا 5 باشد. عدد 1 نشان دهنده شبکه خانگی و عدد 5 نشان دهنده شبکه رومینگ است. هر عدد دیگری به جز 1 و 5 ، نشان می دهد که سیم کارت در هیچ شبکه ای ثبت نشده است.
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 قرار دارد که دائماً منتظر ورودی های مانیتور سریال است تا آن را از طریق پین 2 (پین Rx ماژول) به ماژول SIM800L ارسال کند. همچنین دائماً پین D3 (پین Tx ماژول) را چک می کند تا اگر ماژول پاسخی به ورودی داشته باشد، آن را در مانیتور سریال نشان دهد.
voidupdateSerial () {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 } }
با اجرای کد، شکل زیر بر روی مانیتور سریال دیده می شود.
علاوه بر دستوراتی که بیان شد، دستورات دیگری نیز می توان برای دریافت اطلاعات بیشتری در مورد اتصال شبکه و وضعیت باتری از طریق مانیتور سریال به ماژول ارسال کرد. در ادامه چند دستور آورده شده است.
دستور ATI : نام و نسخه ماژول را می دهد.
دستور ?AT+COPS : اتصال به شبکه را بررسی می کند. .
دستور AT+COPS=? : لیست اُپراتورهای موجود در شبکه را نشان می دهد.
دستور AT+CBC : وضعیت باتری Li-Po را نشان می دهد. عدد دوم میزان شارژ باتری (که در اینجا 93%) و عدد سوم ولتاژ واقعی به میلی ولت (در اینجا 3.877 ولت) است.
ارسال پیام با ماژول SIM800L GSM
پس از آمادهسازی آردوینو و SIM800، می توان ماژول آردوینو را برای ارسال پیام به شماره موبایل مورد نظر کد نویسی کرد. قبل از کد نویسی باید شماره موبایل را وارد کرد. در رشته ZZxxxxxxxxxx ، کد کشور باید جایگزین ZZ و شماره 10 رقمی به جای xxxxxxxxxx قرار گیرد.
#include< SoftwareSerial.h > //Create software serial object to communicate with SIM800L SoftwareSerialmySerial (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 OKupdateSerial (); 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."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 است. بنابراین، لازم است که هنگام ارسال پیام متنی 26 دسیمال یا 1A هگز ارسال شود.
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."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 SoftwareSerialmySerial (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 است. اندازه پیشفرض بافر 64 بایت است که می توان آن را تا 256 بایت (این مقدار بسته به کاربرد میتواند کمتر انتخاب شود) افزایش داد. برای این منظور، در کامپیوتر در صورتی که دارای سیستم عامل ویندوز باشد، به آدرس زیر رفته :
C:\Program Files (x86) -> Arduino -> hardware -> Arduino -> avr -> libraries -> SoftwareSerial
(در صورتی که از نسخه های جدیدتر آردوینو IDE استفاده می شود به پوشه src رفته)، سپس کتابخانه SoftwareSerial.h را باز کرده و دستور مربوط به اندازه بافر مانند زیر تغییر کند:
#define _SS_MAX_RX_BUFF 64
باید به صورت زیر تغییر کند:
#define _SS_MAX_RX_BUFF 256
پس از ذخیره کردن فایل، باید کد دوباره اجرا شود.
برقراری تماس با ماژول SIM800L و آردوینو
این دستورات برای برقراری تماس کمکی (SoS) در موقعیت های خطرناک و اضطراری بطور مثال، زمانیکه آتش سوزی یا سرقت در منزل رخ بدهد، کاربرد دارد.
قبل از اجرای برنامه، ابتدا باید شماره موبایل مورد نظر وارد شود به این صورت که در رشته ZZxxxxxxxxxx کد کشور با ZZ و شماره موبایل 10 رقمی مورد نظر با xxxxxxxxxx جایگزین شوند.
#include< SoftwareSerial.h > //Create software serial object to communicate with SIM800L SoftwareSerialmySerial (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 () { } voidupdateSerial () {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 SoftwareSerialmySerial (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 (); } voidupdateSerial () {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” را بر روی مانیتور سریال می فرستد و نشان دهنده این است که تماسی برقرار نشده است.
راه اندازی ماژول SIM800L با آردوینو یک پروژه محبوب و کاربردی برای فعالیت در حوضه اینترنت اشیا است، اگر شماهم به این حوضه علاقهمند شده اید پس همین حالا کار با این ماژول را شروع کنید. به راحتی با کمی خلاقیت و تمرین میتوانید به نتیجه ای جذاب و کاربردی برسید. حتما سوالات و نظرات خود در بخش دیدگاه با ما در میتن بگذارید، همچنین شما میتوانید با عضویت در وبسایت ما در زمینه انتشار مقالات با ما همکاری کنید! مقالات شما پس از بررسی توسط تیم فنی مجموعه، با نام خودتان منتشر خواهد شد.
سلام و خداقوت بسیار خدمت شما.امیدوارم هرکجا که هستید سالم و موفق وخوشحال باشید.مطالبی که ذکر کردید بسیار مفید بود.
سلام ممنونم دوست عزیز.
من هرچقدر تلاش کردم نتونستم با استفاده از این ماژول پیامک بفرستم!
ماژول پیامک و تماس دریافت می کنه
اما وقتی پیامک می فرستم ارور میده؟
پیشنهادی ندارید؟
سلام
کدتون خطای سین تکس داره
#include
با اس بزرگ نوشته می شه!!!
سلام دوست عزیز
ممنونم اصلاح شد.
باید بعد از شروع AT دو تا خط کد اضافه کرد:
mySerial.println(“AT+CSMP=17,167,2,25\r”); // set this parameter if empty SMS received
delay(100);
سلام دوست عزیز، ممنون از نظرتون، این دو خط هم میتونه باشه.
با عرض سلام.
یه سوالی که داشتم اینه چرا از 3.3 ولت آردوینو استفاده نمیکنید به جای این 2 روش؟؟؟
سلام دوست عزیز،
خروجی ۳.۳ ولت آردوینو، حداکثر ۵۰ میلیآمپر جریان میتونه تامین کنه،
در حالی که sim800 در حالت ارسال و دریافت بهطور متوسط ۳۵۰ میلیآمپر جریان نیاز داره،
این جریان بهصورت لحظهای ممکنه بسیار بیشتر هم بشه.