سه شنبه ۴ شهریور ۱۴۰۴
آردوینو, ماژول ها

همه چیز درباره ماژول SIM800L – قسمت دوم

اتصال ماژول SIM800L به آردوینو

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

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

در قسمت اول (آشنایی با ماژول SIM800L) بطور کامل درمورد مشخصات و سخت‌افزار این ماژول صحبت شد. حالا نوبت به اتصال ماژول SIM800L به آردوینو رسیده.
البته شما میتونید هر میکروکنترلر دیگه‌ای که قابلیت ساپورت این ماژول رو داره، (مثل atmega8) استفاده کنید. شاید در ادامه، این کار رو هم انجام دادم. اما در حال حاضر قصد دارم با آردوینو UNO این ماژول رو راه اندازی کنم. برای اینکه ماژول رو به آردوینو متصل کنیم، ما به قطعات زیر نیاز داریم.

قطعات مورد نیاز

  • آردوینو UNO
  • ماژول SIM800L
  • سیم جامپر
  • برد بورد
  • منبع تغذیه (باتری یا ماژول LM2596)
  • خازن ۱۰۰۰ میکروفاراد ۱۶ ولت
  • مقاومت های ۱۰ کیلواهم و ۲۰ کیلواهم

نحوه اتصالات

ابتدا سیم‌کارتمون رو درون ماژول میذاریم و روی برد بورد قرارش میدیم. از اونجایی که قراره از طریق UART نرم افزاری با ماژولمون ارتباط برقرار کنیم، باید دو تا پایه از آردوینو رو برای این منظور در نظر بگیریم. که من در اینجا دو پایه ۳ (به عنوان RX) و پایه ۲ آردوینو (به عنوان TX) انتخاب کردم.

حالا پین TX ماژول رو به پین شماره ۳ آردینو اتصال میدیم. اما نمی‌تونیم پین Rx ماژول را به طور مستقیم به پین دیجیتال آردوینو متصل کنیم، چرا که آردوینو UNO دارای سطح منطقی ۵ ولته و ماژول SIM800L دارای سطح منطقی ۳.۳ ولته. ساده تر بخوام بگم، پین Rx ماژول SIM800L تحمل ۵ ولت رو نداره. بنابراین، سیگنال Tx از آردوینو باید به ۳.۳ ولت کاهش پیدا کنه؛ اما چطوری؟ چند تا روش هست که می‌تونیم استفاده کنیم و ساده‌ترین و در دسترس‌ترینشون تقسیم ولتاژ مقاومتیه. یه مقاومت ۱۰ کیلو اهم بین پیم RX ماژول و پین ۲ آردوینو و یه مقاومت ۲۰ کیلو اهم بین پین RX ماژول و GND (زمین مدار) قرار میدیم.

حالا فقط اتصال منبع تغذیه باقی میمونه! اگر از قسمت قبلی به یاد داشته باشید، گفتیم که در اتصال منبع تغذیه اول GND رو متصل کنید و بعد VCC رو اتصال بدید.

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

در پایین تصویر مدار بسته شده با باتری رو مشاهده می‌کنید:

اینم مدار بسته شده با استفاده از تغذیه LM2596 که در قسمت اول درموردش صحبت کردیم:

خب حالا که مدار رو بستیم، کارمون با بخش سخت افزاری تموم شد. بریم سراغ بخش نرم افزاری!

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

دستورات AT یا AT Command، برای کنترل ماژول های ارتباطی مثل SIM800L استفاده می‌شوند. برای ارسال دستورات AT و ارتباط با ماژول SIM800L، از سریال مانیتور (Serial Monitor) استفاده می‌کنیم. قبل از هر چیزی اینو بگم قرار نیست اینجا آموزش آردوینو یا آموزش برنامه نویسی آردوینو بدیم! برای یادگیری آردوینو روی لینک که توی خط قبل هست کلیک کنید و وارد دوره آموزش آردوینو بشید. اونجا همه چیز رو از پایه با هم شروع کردیم و مبانی برنامه نویسی آردوینو رو هم توضیح دادیم.

تست دستورات AT

خب بعد از اینکه اتصالات رو انجام دادیم و ماژول رو به آردوینو متصل کردیم حالا وقتش رسیده تا برنامه نویسی با استفاده از کد زیر از لحاظ نرم افزاری هم ماژولمون رو به آردوینو متصل کنیم و با دستورات AT اتصالات و سایر موارد از جمله اتصال ماژول به شبکه، میزان آنتن‌دهی و … رو بررسی کرد.

برای اینکه دستورات AT رو به ماژول SIM800L بفرستیم و باهاش ارتباط بگیریم، از مانیتور سریال استفاده می‌کنیم. کدی که پایین گذاشتم به آردوینو اجازه می‌ده با ماژول SIM800L از طریق مانیتور سریال حرف بزنه. قبل از اینکه بریم سراغ جزئیات کد، آردوینو رو به کامپیوتر وصل کن، کد رو کامپایل کن و آپلودش کن روی آردوینو.

#include <SoftwareSerial.h>

// ایجاد شیء سریال نرم‌افزاری برای ارتباط با SIM800L
SoftwareSerial mySerial(3, 2); // پایه‌های Tx و Rx ماژول SIM800L به پایه‌های ۲ و ۳ آردوینو متصل هستند

void setup()
{
  // شروع ارتباط سریال با آردوینو و محیط توسعه آردوینو (Serial Monitor)
  Serial.begin(9600);
  
  // شروع ارتباط سریال با آردوینو و SIM800L
  mySerial.begin(9600);

  Serial.println("در حال راه‌اندازی...");
  delay(1000);

  mySerial.println("AT"); // وقتی تست دست دادن موفق باشد، جواب OK برمی‌گردد
  updateSerial();
  mySerial.println("AT+CSQ"); // تست کیفیت سیگنال، محدوده مقدار بین ۰ تا ۳۱ است، ۳۱ بهترین مقدار است
  updateSerial();
  mySerial.println("AT+CCID"); // خواندن اطلاعات سیم‌کارت برای اطمینان از اینکه سیم‌کارت وصل است
  updateSerial();
  mySerial.println("AT+CREG?"); // بررسی اینکه آیا در شبکه ثبت شده است یا خیر
  updateSerial();
}

void loop()
{
  updateSerial();
}

void updateSerial()
{
  delay(500);
  while (Serial.available()) 
  {
    mySerial.write(Serial.read()); // ارسال داده‌های دریافت شده توسط Serial به پورت سریال نرم‌افزاری
  }
  while(mySerial.available()) 
  {
    Serial.write(mySerial.read()); // ارسال داده‌های دریافت شده توسط پورت سریال نرم‌افزاری به Serial
  }
}

وقتی کد رو آپلود کردید، مانیتور سریال رو با نرخ بود ۹۶۰۰ باز کنید و حتماً گزینه ‘Both NL and CR’ رو انتخاب کنید! باید خروجی زیر رو روی مانیتور سریال ببینید.

توضیح کد

کد با اضافه کردن کتابخانه SoftwareSerial.h شروع میشه و شیء SoftwareSerial رو با پایه‌های آردوینو که به پایه‌های Tx و Rx ماژول SIM800L متصل هستند، راه‌اندازی می‌کنه.

#include <SoftwareSerial.h>
// ایجاد شیء سریال نرم‌افزاری برای ارتباط با SIM800L
SoftwareSerial mySerial(3, 2); // پایه‌های Tx و Rx ماژول SIM800L به پایه‌های ۲ و ۳ آردوینو متصل هستند

در تابع setup()، یه ارتباط سریال بین آردوینو، محیط توسعه آردوینو و ماژول SIM800L با نرخ بود ۹۶۰۰ راه‌اندازی می‌کنیم.

// شروع ارتباط سریال با آردوینو و محیط توسعه آردوینو (Serial Monitor)
Serial.begin(9600);
  
// شروع ارتباط سریال با آردوینو و SIM800L
mySerial.begin(9600);

حالا که یه ارتباط پایه‌ای برقرار کردیم، می‌خوایم با ماژول SIM800L ارتباط برقرار کنیم و دستورات AT رو ارسال کنیم.

AT – این ساده‌ترین دستور AT هست. همچنین Auto-bauder رو راه‌اندازی می‌کنه. اگر همه‌چیز درست باشه، پیغام OK رو می‌فرسته که یعنی دستور رو درست فهمیده. بعد می‌تونید دستورات دیگه‌ای بفرستید تا اطلاعات بیشتری از ماژول بگیرید.

AT+CSQ – وضعیت سیگنال رو چک می‌کنه. اولین عدد در پاسخ، قدرت سیگنال به دسی‌بل (dB) هست. این عدد باید بیشتر از حدود ۵ باشه. هر چی بیشتر، بهتر. توجه کنید که این قدرت سیگنال به آنتن و موقعیت مکانی شما بستگی داره!

AT+CCID – بررسی می‌کنه که سیم‌کارت معتبر هست یا نه و شماره سیم‌کارت رو برای ما ارسال می‌کنه.

AT+CREG? – بررسی می‌کنه که آیا در شبکه ثبت شدید یا نه. عدد دوم در پاسخ باید ۱ یا ۵ باشه. ۱ یعنی تو یه شبکه خانگی ثبت شدید و ۵ یعنی در حال رومینگ هستید. هر عدد دیگه‌ای غیر از این دو، یعنی تو هیچ شبکه‌ای ثبت نشدی.

  mySerial.println("AT"); // وقتی تست دست دادن موفق باشد، جواب OK برمی‌گردد
  updateSerial();
  mySerial.println("AT+CSQ"); // تست کیفیت سیگنال، محدوده مقدار بین ۰ تا ۳۱ است، ۳۱ بهترین مقدار است
  updateSerial();
  mySerial.println("AT+CCID"); // خواندن اطلاعات سیم‌کارت برای اطمینان از اینکه سیم‌کارت وصل است
  updateSerial();
  mySerial.println("AT+CREG?"); // بررسی اینکه آیا در شبکه ثبت شده است یا خیر
  updateSerial();

در تابع loop()، تابع updateSerial() رو صدا می‌زنیم که به‌طور مداوم منتظر ورودی از مانیتور سریال می‌مونه و اون رو از طریق پایه D2 (RX ماژول) به ماژول SIM800L می‌فرسته. همچنین به‌طور مداوم پایه D3 (TX ماژول) رو می‌خونیم تا ببینیم پاسخی از ماژول SIM800L دریافت می‌کنیم یا نه.

void updateSerial()
{
  delay(500);
  while (Serial.available()) 
  {
    mySerial.write(Serial.read()); // ارسال داده‌های دریافت شده توسط Serial به پورت سریال نرم‌افزاری
  }
  while(mySerial.available()) 
  {
    Serial.write(mySerial.read()); // ارسال داده‌های دریافت شده توسط پورت سریال نرم‌افزاری به Serial
  }
}

تست دستورات بیشتر از AT

الان می‌تونید دستورات زیر رو از طریق مانیتور سریال ارسال کنید تا اطلاعات بیشتری درباره اتصال شبکه و وضعیت باتری بگیرید:

ATI – نام ماژول و نسخه اون رو برمی‌گردونه.

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

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

AT+CBC – این دستور وضعیت باتری Li-Po رو به ما نشون می‌ده.
عدد اول، وضعیت کلی باتری (از ۰ تا ۲ | ۰ خوب، ۱ ضعیف و ۲ خیلی ضعیف) رو برمی‌گردونه. عدد دوم سطح باتری رو نشون می‌ده (مثلا ۷۵ که نشاندهنده ۷۵٪ است) و عدد سوم ولتاژ واقعی به میلی‌ولت (مثلا ۳۷۱۱ میلی ولت که یعنی ۳.۷ ولت).

AT+CGATT? – بررسی وضعیت اتصال به شبکه GPRS.

AT+CGPADDR – دریافت آدرس IP اختصاص داده شده به ماژول توسط شبکه.

برای دستورات بیشتر می‌تونید به PDF زیر مراجعه کنید.

آموزش ارسال SMS با ماژول SIM800L و آردوینو

بعد از اتصال ماژول SIM800L به آردوینو و تست آن توسط دستورات AT حالا نوبت به بخش جذاب ماجرا یعنی ارسال پیامک با ماژول SIM800L رسیده. کد زیر برای ارسال پیامک با ماژول SIM800L توسط آردوینو نوشته شده.
فقط قبل از اینکه کد رو امتحان کنید، باید شماره تلفنی که می‌خواید پیامک بفرستید رو وارد کنید. دنبال رشته‌ای که به صورت ZZxxxxxxxxxx هایلایت شده بگردید و ZZ رو با کد کشور و xxxxxxxxxx رو با شماره ۱۰ رقمی تلفن جایگزین کنید. برای ایران، شماره تماس باید به این صورت خواهد بود : +۹۸۹۱۲۰۱۲۳۴۵۶ (فقط حواستون باشه علامت + سمت چپ باید باشه).

#include <SoftwareSerial.h>

// ایجاد شیء سریال نرم‌افزاری برای ارتباط با SIM800L
SoftwareSerial mySerial(3, 2); // پایه‌های Tx و Rx ماژول SIM800L به پایه‌های ۳ و ۲ آردوینو متصل هستند

void setup()
{
  // شروع ارتباط سریال با آردوینو و محیط توسعه آردوینو (Serial Monitor)
  Serial.begin(9600);
  
  // شروع ارتباط سریال با آردوینو و SIM800L
  mySerial.begin(9600);

  Serial.println("در حال راه‌اندازی..."); 
  delay(1000);

  mySerial.println("AT"); // وقتی تست ارتباط موفقیت‌آمیز بود، پاسخ OK برمی‌گردد
  updateSerial();

  mySerial.println("AT+CMGF=1"); // تنظیم حالت متنی
  updateSerial();

  mySerial.println("AT+CMGS=\"+ZZxxxxxxxxxx\""); // ZZ را با کد کشور و xxxxxxxxxxx را با شماره تلفن جایگزین کنید تا پیامک ارسال شود
  updateSerial();

  mySerial.print("This is a test message | iamsarvis.ir"); // محتوای متن پیامک
  updateSerial();

  mySerial.write(26); // ارسال کاراکتر CTRL+Z برای پایان پیامک
}

void loop()
{
}

void updateSerial()
{
  delay(500); // تاخیر ۵۰۰ میلی‌ثانیه
  while (Serial.available()) 
  {
    mySerial.write(Serial.read()); // ارسال داده‌های دریافت شده از Serial به پورت سریال نرم‌افزاری
  }
  while(mySerial.available()) 
  {
    Serial.write(mySerial.read()); // ارسال داده‌های دریافت شده از پورت سریال نرم‌افزاری به Serial
  }
}

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

توضیح کد ارسال پیامک با ماژول SIM800L

این کد تقریباً همون کد اول هست، با این تفاوت که قطعه کد زیر اضافه شده. بعد از اینکه ارتباط برقرار شد، دستورات AT زیر رو ارسال می‌کنیم:

این کد تقریباً همون کد اول هست، با این تفاوت که قطعه کد زیر اضافه شده. بعد از اینکه ارتباط برقرار شد، دستورات AT زیر رو ارسال می‌کنیم:

AT+CMGF=1 – فرمت پیامک رو به حالت متن (Text) تنظیم می‌کنه. فرمت پیش‌فرض، واحد داده پروتکل (PDU) هست.
اینجا شاید از خودتون بپرسید PDU چیه؟


واحد داده پروتکل (PDU) یه فرمت استاندارد برای ارسال و دریافت پیامک‌ها در شبکه‌های موبایلی هست. توی این فرمت، پیامک‌ها به صورت باینری کدگذاری می‌شن و اطلاعات بیشتری نسبت به فرمت متنی دارن، مثل شماره فرستنده، طول پیام و اطلاعات شبکه. فرمت PDU برای ارسال پیامک‌های چند بخشی و پیامک‌های حاوی کاراکترهای غیر انگلیسی کاربرد داره. در مقابل، حالت متنی (Text Mode) ساده‌تره و پیامک‌ها رو به صورت متن ساده ارسال و دریافت می‌کنه، اما قابلیت‌های پیشرفته PDU رو نداره. لینک ویکی‌پدیا واحد داده پروتکل رو هم بالا گذاشتم تا در صورت نیاز به اطلاعات بیشتر به لینک ویکی اون مراجعه کنید.

AT+CMGS=+ZZxxxxxxxxxx – پیامک رو به شماره تلفن مشخص‌شده ارسال می‌کنه. بعد از این دستور AT، هر متن پیامی که به دنبال کاراکتر ‘Ctrl+z’ بیاد، به عنوان پیامک تلقی میشه. ‘Ctrl+z’ در واقع کاراکتر غیر چاپی شماره ۲۶ هست که در جدول ASCII به عنوان ‘substitute’ توصیف شده. بنابراین، باید در انتهای دستور، ۲۶ (۰x1A) رو ارسال کنیم.

mySerial.println("AT+CMGF=1"); // تنظیم حالت متنی
updateSerial();
mySerial.println("AT+CMGS=\"+ZZxxxxxxxxxx\"");//ZZ را با کد کشور و xxxxxxxxxxx را با شماره تلفن جایگزین کنید تا پیامک ارسال شود
updateSerial();
mySerial.print("This is a test message | iamsarvis.top"); // محتوای متن پیامک
updateSerial();
mySerial.write(26); // ارسال کاراکتر CTRL+Z برای پایان پیامک
}

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

آموزش دریافت SMS با ماژول SIM800L و آردوینو

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

#include <SoftwareSerial.h>

// ایجاد شیء سریال نرم‌افزاری برای ارتباط با SIM800L
SoftwareSerial mySerial(3, 2); // پین‌های Tx و Rx ماژول SIM800L به پین‌های ۳ و ۲ آردوینو متصل شده‌اند

void setup()
{
  // شروع ارتباط سریال با آردوینو و IDE آردوینو (مانیتور سریال)
  Serial.begin(9600);
  
  // شروع ارتباط سریال با آردوینو و SIM800L
  mySerial.begin(9600);

  Serial.println("در حال راه‌اندازی..."); // پیغام شروع اولیه
  delay(1000);

  mySerial.println("AT"); // وقتی تست handshake موفقیت‌آمیز باشد، پاسخ OK دریافت می‌شود
  updateSerial();
  
  mySerial.println("AT+CMGF=1"); // تنظیم حالت متنی
  updateSerial();
  mySerial.println("AT+CNMI=1,2,0,0,0"); // تعیین نحوه پردازش پیامک‌های جدید
  updateSerial();
}

void loop()
{
  updateSerial();
}

void updateSerial()
{
  delay(500); // تاخیر ۵۰۰ میلی‌ثانیه
  while (Serial.available()) 
  {
    mySerial.write(Serial.read()); // ارسال داده‌های دریافت شده از Serial به پورت سریال نرم‌افزاری
  }
  while(mySerial.available()) 
  {
    Serial.write(mySerial.read()); // ارسال داده‌های دریافت شده از پورت سریال نرم‌افزاری به Serial
  }
}

وقتی پیامک رو به ماژول SIM800L ارسال کنید، متن پیامک ارسالی رو در مانیتور سریال خواهید دید. مشابه تصویر زیر:

همونطور که می‌بینید، پاسخ خروجی با +CMT: شروع می‌شه. تمام فیلدها در پاسخ با کاما جدا شده‌اند. فیلد اول شماره تلفنه، فیلد دوم نام فردی که پیامک رو ارسال کرده، فیلد سوم زمان ارسال و فیلد چهارم خود پیام هست.

توضیح کد

خب همونطور که مشخصه این کد تقریباً مشابه کد اوله، به جز قطعه کد زیر. بعد از اینکه ارتباط برقرار شد، دستورات AT زیر رو ارسال می‌کنیم:

AT+CMGF=1 – فرمت پیامک رو به حالت متن (Text) تنظیم می‌کنه. فرمت پیش‌فرض، واحد داده پروتکل (PDU) هست.

AT+CNMI=1,2,0,0,0 – مشخص می‌کنه پیامک‌های ورودی چطور باید مدیریت بشن. با این دستور می‌تونید به ماژول SIM800L بگید که پیامک‌های ورودی رو مستقیماً به PC ارسال کنه یا اون‌ها رو در حافظه پیام ذخیره کنه و سپس مکان اون‌ها در حافظه پیام رو به PC اطلاع بده.

بذارید بیشتر توضیح بدم؛ دستور AT+CNMI برای تنظیم نحوه‌ی پردازش پیامک‌های ورودی در ماژول‌های GSM مثل SIM800L استفاده میشه. این دستور مشخص می‌کنه که پیامک‌های دریافتی چطور باید به سیستم عامل ارسال بشن. ورودی‌های این دستور به این صورت هستن:

AT+CNMI=<mode>,<bfr>,<mcs>,<bfr>,<mcs>
  1. <mode>
    • ۰: پیامک‌ها به صورت سایلنت ذخیره می‌شن و هیچ اطلاع‌رسانی‌ای ندارند.
    • ۱: پیامک‌ها به صورت اعلان به مانیتور سریال ارسال می‌شن.
    • ۲: پیامک‌ها به صورت متنی به مانیتور سریال ارسال می‌شن.
    • ۳: پیامک‌ها هم به صورت متنی به مانیتور سریال ارسال می‌شن و هم به حافظه پیام ذخیره می‌شن.
  2. <bfr>
    • ۰: برای پیامک‌های ذخیره شده در حافظه، هیچ اعلان یا اطلاع‌رسانی‌ای نمی‌شه.
    • ۱: اگر پیامک‌های جدیدی به حافظه اضافه بشه، اعلان‌هایی به مانیتور سریال ارسال می‌شه.
  3. <mcs>
    • ۰: پیغام‌ها به صورت باینری (عددهای ۰ و ۱) ارسال می‌شن.
    • ۱: پیغام‌ها به صورت متنی ارسال می‌شن.
  4. <bfr>
    • ۰: اگر پیام‌های جدیدی به حافظه اضافه بشه، اعلان اضافه‌ای ارسال نمی‌شه.
    • ۱: برای پیام‌های جدیدی که به حافظه اضافه می‌شه، اعلان‌هایی ارسال می‌شه.
  5. <mcs>
    • ۰: فقط اعلان‌های اولیه ارسال می‌شن.
    • ۱: تمامی اعلان‌ها و پیغام‌های جدید به مانیتور سریال ارسال می‌شه.

مثلا در دستور AT+CNMI=1,2,0,0,0:
0,0,0: تنظیمات پیش‌فرض برای بقیه ورودی‌ها.
۱: پیامک‌ها به صورت اعلان به مانیتور سریال ارسال می‌شن.
۲: پیغام‌ها به صورت متنی ارسال می‌شن.

  mySerial.println("AT+CMGF=1"); // تنظیم حالت متنی
  updateSerial();
  mySerial.println("AT+CNMI=1,2,0,0,0"); // تعیین نحوه پردازش پیامک‌های جدید
  updateSerial();

توجه کنید که این بار تابع loop رو خالی نذاشتیم چون داریم پیامک‌های ورودی رو بررسی می‌کنیم و باید مرتب چک کنیم که آیا پیامکی اومده یا خیر.

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

اگه پیامک خیلی طولانی باشه، احتمالاً پیام رو ناقص دریافت خواهید کرد. این به خاطر اشتباه بودن کد شما نیست، بلکه به خاطر پر شدن کامل ‘بافر دریافت سریال نرم‌افزاری’ و نادیده گرفتن کاراکترهای باقی‌مونده است. ساده‌ترین راه‌حل اینه که اندازه بافر SoftwareSerial رو از اندازه پیش‌فرض ۶۴ بایت، به ۲۵۶ بایت افزایش بدین.

برای اینکار اگر سیستم شما ویندوزیه، به مسیر زیر برین:

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

برای ورژن‌های جدیدتر آردوینو:

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

برای لینوکس، بسته به توزیع شما، مکان این فایل متفاوت است. میتونید با یه سرچ ساده زدن برای سیستم عامل خودتون پیداش کنید. اگر نتونستید پیدا کنید، کامنت بذارید تا کمکتون کنم.
برای من که توزیعم Mint هست، در مسیر :

/home/(Username)/.arduino15/packages/arduino/hardware/avr/1.8.6/libraries/SoftwareSerial/src

قرار داشت. بعد از پیدا کردن این مسیر، کافیه فایل SoftwareSerial.h رو باز کنین و این خط رو پیدا کنید:

// RX buffer size
#define _SS_MAX_RX_BUFF 64

و اون رو با کد زیر جایگزین کنید:

// RX buffer size
#define _SS_MAX_RX_BUFF 256

فایل رو سیو کنید و یکبار دیگه اسکچ رو روی آردوینو آپلود کنید. حالا شما می‌تونید پیامک‌های بلند رو هم دریافت کنید.

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

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

توی این قسمت، به برقراری تماس با ماژول SIM800L و آردوینو می‌پردازیم و برای اون برنامه پایه‌ای رو ارائه و توضیح میدیم. این اسکچ برای مواقع ضروری مثل افزایش دما یا ورود غیرمجاز به خونه، که می‌خواین آردوینو یه تماس SOS/اضطراری بگیره، خیلی مفیده. بعدا توی پروژه‌ی مربوط به این سری آموزش، این کد رو گسترش می‌دیم و کارهای جالبی انجام می‌دیم 🙂

قبل از امتحان کردن این اسکچ، باید شماره تلفنی که می‌خواین تماس بگیره رو وارد کنین. به دنبال رشته‌ای که با ZZxxxxxxxxxx هایلایت شده بگردین. همونطور که قبلا گفتم، ZZ رو با کد کشور و xxxxxxxxxx رو با شماره ۱۰ رقمی تلفن جایگزین کنین.

#include <SoftwareSerial.h>

// ایجاد شیء سریال نرم‌افزاری برای ارتباط با SIM800L
SoftwareSerial mySerial(3, 2); // پایه‌های Tx و Rx ماژول SIM800L به پایه‌های ۳ و ۲ آردوینو متصل هستند

void setup()
{
  // شروع ارتباط سریال با آردوینو و محیط توسعه آردوینو (Serial Monitor)
  Serial.begin(9600);
  
  // شروع ارتباط سریال با آردوینو و SIM800L
  mySerial.begin(9600);

  Serial.println("در حال راه‌اندازی..."); 
  delay(1000);

  mySerial.println("AT"); // وقتی تست ارتباط موفقیت‌آمیز بود، پاسخ OK برمی‌گردد
  updateSerial();
  
  mySerial.println("ATD+ +ZZxxxxxxxxxx;"); // ZZ را با کد کشور و xxxxxxxxxxx را با شماره تلفن جایگزین کنید تا تماس برقرار شود
  updateSerial();
  delay(20000); // ۲۰ ثانیه صبر کنید...
  mySerial.println("ATH"); // قطع تماس
  updateSerial();
}

void loop()
{
}

void updateSerial()
{
  delay(500); // تاخیر ۵۰۰ میلی‌ثانیه
  while (Serial.available()) 
  {
    mySerial.write(Serial.read()); // ارسال داده‌های دریافت شده از Serial به پورت سریال نرم‌افزاری
  }
  while(mySerial.available()) 
  {
    Serial.write(mySerial.read()); // ارسال داده‌های دریافت شده از پورت سریال نرم‌افزاری به Serial
  }
}

حاصل اجرای کد بالا رو پایین می‌تونید ببینید:

توضیح کد

کل کد همون چیزی هست که قبلا توضیح دادیم و فقط دستورات AT متفاوتن که در پایین توضیحاتشون اومده.
دستورات AT زیر برای برقراری تماس استفاده می‌شن:

ATD+ +ZZxxxxxxxxxx; – این دستور با شماره مشخص شده تماس می‌گیره. فراموش نکنید که در پایان دستور یک علامت نقطه‌ویرگول (;) بذارین.

ATH – این دستور هم تماس رو قطع می‌کنه.

mySerial.println("ATD+ +ZZxxxxxxxxxx;"); // ZZ را با کد کشور و xxxxxxxxxxx را با شماره تلفن جایگزین کنید تا تماس برقرار شود
  updateSerial();
  delay(20000); // ۲۰ ثانیه صبر می‌کند...
  mySerial.println("ATH"); // قطع تماس
  updateSerial();

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

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

#include <SoftwareSerial.h>

// ایجاد شیء سریال نرم‌افزاری برای ارتباط با SIM800L
SoftwareSerial mySerial(3, 2); // پایه‌های Tx و Rx ماژول SIM800L به پایه‌های ۳ و ۲ آردوینو متصل هستند

void setup()
{
  // شروع ارتباط سریال با آردوینو و محیط توسعه آردوینو (Serial Monitor)
  Serial.begin(9600);
  
  // شروع ارتباط سریال با آردوینو و SIM800L
  mySerial.begin(9600);

  Serial.println("در حال راه‌اندازی...");
  delay(1000);
  mySerial.println("AT"); // وقتی تست ارتباط موفقیت‌آمیز بود، پاسخ OK برمی‌گردد
}

void loop()
{
  updateSerial();
}

void updateSerial()
{
  delay(500); // تاخیر ۵۰۰ میلی‌ثانیه
  while (Serial.available()) 
  {
    mySerial.write(Serial.read()); // ارسال داده‌های دریافت شده از Serial به پورت سریال نرم‌افزاری
  }
  while(mySerial.available()) 
  {
    Serial.write(mySerial.read()); // ارسال داده‌های دریافت شده از پورت سریال نرم‌افزاری به Serial
  }
}

خروجی زیر روی مانیتور سریال، تماس‌های دریافتی توسط ماژول SIM800L رو نشون می‌ده.

همون‌طور که می‌بینین، تماس‌های ورودی معمولاً با کلمه‌ی ‘RING’ روی مانیتور سریال نمایش داده می‌شن و بعد از اون شماره تلفن و شناسه‌ی تماس‌گیرنده رو می‌بینین. دستورات AT زیر برای پاسخ دادن یا قطع کردن تماس استفاده می‌شن:

ATA – تماس ورودی رو قبول می‌کنه.

ATH – تماس رو قطع می‌کنه. وقتی تماس ورودی رو قطع می‌کنیم، پیام NO CARRIER روی مانیتور سریال نمایش داده می‌شه که نشون می‌ده تماس وصل نشده.

بسیار خب؛ به پایان این قسمت از سری آموزش ماژول Sim800l رسیدیم. توی این قسمت، اتصال ماژول SIM800L به آردوینو، ارسال و دریافت پیامک و برقراری، دریافت تماس با استفاده ماژول sim800l و Arduino و همینطور افزایش اندازه بافر SoftwareSerial در آردوینو رو یاد گرفتیم.
این سری آموزشی کماکان ادامه داره و در قسمت بعدی به سراغ مباحث پیشرفته تر و انجام پروژه با این ماژول پرکاربرد خواهیم رفت. در صورتی که سوالی داشتید در بخش کامنت‌ها بپرسید. همینطور خوشحال میشم پیشنهادات و انتقادات شما درمورد این سری آموزش‌ها رو بدونم 🙂

لبخند بزنید و شاد باشید 😉
تا قسمت بعدی شما رو به خدا میسپارم. خدانگهدار

0 0 رای
رأی دهی به مقاله