آردوینومتوسط۸ دقیقه مطالعهArduino IDE 2.x / Uno R3

ماژول GSM با SIM800L

کار با ماژول GSM سیم‌کام SIM800L؛ تغذیهٔ درست با جریان پیک، پین‌ها و سطح ولتاژ منطقی، دستورهای AT برای ثبت‌شده‌شدن در شبکه و ارسال پیامک با SoftwareSerial و عیب‌یابی رایج‌ترین خطاها.

آنچه در این درس می‌آموزید

  • تغذیهٔ درست SIM800L را با جریان پیک آن توضیح دهید و بدانید چرا تغذیه از آردوینو ممنوع است
  • پین‌های ماژول و رفتار LED وضعیت NETLIGHT را بشناسید
  • با دستورهای AT وضعیت شبکه را بخوانید و پیامک بفرستید
  • مشکلات بی‌پاسخی، ریست‌شدن هنگام ارسال و خطای سیم‌کارت را عیب‌یابی کنید
نویسنده: تیم داکنامه · بازبینی: ۲۰۲۶-۱۰-۳۱
فهرست مطالب

تا این‌جا ارتباط پروژه‌های شما با کابل USB یا برد کوتاه بلوتوث بود. ماژول SIM800L از شرکت SIMCom این مرز را برمی‌دارد: با یک سیم‌کارت معمولی از شبکهٔ موبایل GSM پیامک می‌فرستد، تماس می‌گیرد و با GPRS داده جابه‌جا می‌کند؛ بدون وای‌فای و بدون اینترنت خانگی. دزدگیر پیامک‌فرست و گزارش وضعیت از محل دور، کاربردهای کلاسیک آن‌اند.

GSM و سیم‌کارت

GSM استاندارد نسل دوم موبایل (2G) است؛ همان شبکه‌ای که تماس و پیامک کلاسیک روی آن کار می‌کند. SIM800L به یک سیم‌کارت فعال نیاز دارد؛ روی اکثر بردهای رایج سوکت micro-SIM است و سیم‌کارت را با فنر فلزی جا می‌زنید. آنتن هم اجباری است: بدون آنتنِ لحیم‌شده یا سوکت‌دار، ماژول در شبکه ثبت نمی‌شود. در ایران هر اپراتوری با پوشش 2G کار می‌کند؛ اگر سیم‌کارت پین‌کد دارد، اول پین‌کد را از داخل گوشی بردارید.

جدول پین‌ها

پین نام کارکرد
۱–۲ VCC تغذیهٔ ۳٫۴ تا ۴٫۴ ولت؛ از باتری یا مبدل کاهنده
۳–۴ GND زمین؛ مشترک با آردوینو
۵ TXD خروجی سریال ماژول؛ به پین ورودی آردوینو می‌رود
۶ RXD ورودی سریال ماژول؛ از پین خروجی آردوینو می‌آید
۷ RST ریست ماژول؛ در کار مقدماتی رها می‌شود
۸ NETLIGHT LED وضعیت شبکه

رفتار NETLIGHT را حفظ کنید، چون ابزار عیب‌یابی بدون رایانهٔ شماست: چشمک تندِ منظم (روشن‌شدن کوتاه هر حدود ۰٫۸ ثانیه) یعنی جست‌وجوی شبکه؛ چشمک کند (هر حدود ۳ ثانیه) یعنی ماژول در شبکه ثبت شده و آمادهٔ کار است.

سطح ولتاژ منطقی

مدار داخلی SIM800L با حدود ۲٫۸ ولت کار می‌کند، در حالی که خروجی پین‌های آردوینو ۵ ولت است؛ ورودی RXD ماژول برای تحمل ۵ ولت طراحی نشده است. راه‌حل پرکاربرد: روی مسیر TX آردوینو به RXD ماژول یک مقاومت سری بگذارید (رایج: ۱۰ کیلواهم) تا جریان ورودی محدود شود. جهت مقابل، یعنی TXD ماژول به RX آردوینو، مستقیم وصل می‌شود چون خروجی ماژول ولتاژ کمتری دارد و برای آردوینو قابل‌خواندن است.

گفت‌وگو با دستورهای AT

ماژول با دستورهای متنی AT کنترل می‌شود؛ همان سبکی که در درس Serial دیدید. برای گفت‌وگو با ماژول از SoftwareSerial روی دو پین دیجیتال استفاده می‌کنیم تا پین‌های ۰ و ۱ برای آپلود آزاد بمانند. جدول دستورهای اصلی این درس:

دستور کار پاسخ مورد انتظار
AT تست خط OK
AT+CSQ کیفیت سیگنال +CSQ: 20,0 و سپس OK؛ عدد اول بین ۰ تا ۳۱ است و ۹۹ یعنی ناشناخته
AT+CREG? ثبت در شبکه +CREG: 0,1 و سپس OK؛ عدد ۱ یعنی ثبت‌شده در شبکهٔ خانه
AT+CMGF=1 حالت متنی پیامک OK
AT+CMGS="+989120000000" شروع پیامک؛ ماژول علامت > می‌دهد، متن را می‌نویسید و با Ctrl+Z (بایت 0x1A) می‌فرستید بعد از ارسال: +CMGS: 12 و سپس OK؛ عدد شمارهٔ پیامک است و فرق می‌کند
ATD+989120000000; تماس صوتی OK؛ قطع تماس با ATH

نکتهٔ باودریت: ماژول به‌صورت پیش‌فرض باودریت را خودکار تشخیص می‌دهد؛ اگر پاسخ نگرفتید، چند بار AT بفرستید. ۹۶۰۰ عدد رایج در اکثر بردهاست.

اسکچ ارسال پیامک

sim800l-sms.ino
#include <SoftwareSerial.h>

const byte RX_PIN = 10;  // Arduino receives on 10 (module TXD)
const byte TX_PIN = 11;  // Arduino transmits on 11 (module RXI)

SoftwareSerial sim800l(RX_PIN, TX_PIN);

void setup() {
  Serial.begin(9600);
  sim800l.begin(9600);
  delay(10000);  // let the module register on the network

  sim800l.println("AT+CMGF=1");  // SMS text mode
  delay(1000);
  sim800l.println("AT+CMGS=\"+989120000000\"");  // recipient number
  delay(1000);
  sim800l.print("Hello from Arduino!");  // message body
  sim800l.write(26);  // Ctrl+Z (0x1A) sends the message
  delay(5000);

  while (sim800l.available()) {   // show module responses
    Serial.write(sim800l.read());
  }
}

void loop() {}

توضیح خط‌به‌خط:

  1. SoftwareSerial sim800l(10, 11) — پین ۱۰ ورودی (به TXD ماژول) و پین ۱۱ خروجی (به RXD ماژول با مقاومت سری) است.
  2. delay(10000) — ماژول بعد از روشن‌شدن چند ثانیه‌ای در شبکه ثبت می‌شود؛ فرستادن پیامک قبل از آن بی‌نتیجه است.
  3. AT+CMGF=1 — پیامک را به حالت متنی می‌برد تا به‌جای بایت‌های PDU متن ساده بنویسید.
  4. AT+CMGS="..." — شمارهٔ گیرنده در گیومه؛ ماژول در پاسخ علامت > چاپ می‌کند.
  5. sim800l.write(26) — کد ۲۶ همان Ctrl+Z است؛ پایان متن و فرمان ارسال.
  6. حلقهٔ پایانی پاسخ ماژول را به Serial Monitor می‌برد؛ ارسال موفق دو سطر +CMGS: <شماره> و OK می‌دهد.

رفتار قابل مشاهده: پس از حدود ده ثانیه روی گوشی گیرنده پیام Hello from Arduino! می‌رسد و در Serial Monitor هم پاسخ‌های ماژول دیده می‌شود.

خطاهای رایج و عیب‌یابی

نشانه علت رایج راه‌حل
ماژول به AT جواب نمی‌دهد تغذیهٔ ناکافی؛ رایج‌ترین علت حدود ۴ ولت با منبعِ ۲ آمپر بدهید؛ خازن کنار VCC؛ زمین مشترک را چک کنید
ریست‌شدن هنگام ارسال پیامک افت ولتاژ در جریان پیک منبع قوی‌تر و سیم‌های تغذیهٔ کوتاه‌تر
NETLIGHT تند می‌زند و کند نمی‌شود ثبت‌نشدن در شبکه آنتن، سیم‌کارت فعال بدون پین‌کد و پوشش 2G را ببینید
پاسخ +CME ERROR: SIM not inserted سیم‌کارت جا نیفتاده یا جهتش غلط است خاموش کنید و سیم‌کارت را کامل جا بزنید
حروف خراب در Serial Monitor باود ناهمسان یا ناپایداری SoftwareSerial باود ۹۶۰۰ را ثابت نگه دارید؛ در صورت لزوم AltSoftSerial
پیامک می‌رود ولی نمی‌رسد قالب شماره اشتباه است شماره را با کد کشور و فرم +98... بدهید

تمرین‌ها

تمرین

تمرین ۱ — خواندن کیفیت سیگنال

اسکچی بنویسید که ده ثانیه پس از روشن‌شدن، دستور AT+CSQ را بفرستد و پاسخ ماژول را در Serial Monitor چاپ کند. چه پاسخی انتظار دارید و عدد اول چه معنایی دارد؟

نمایش راه‌حل

ساختار اسکچ ارسال پیامک را ساده‌تر می‌کنیم:

cpp
#include <SoftwareSerial.h>

SoftwareSerial sim800l(10, 11);  // RX, TX

void setup() {
  Serial.begin(9600);
  sim800l.begin(9600);
  delay(10000);              // wait for network registration
  sim800l.println("AT+CSQ"); // signal quality
  delay(1000);
  while (sim800l.available()) {
    Serial.write(sim800l.read());
  }
}

void loop() {}

در Serial Monitor سطرهای AT+CSQ، سپس +CSQ: 20,0 و بعد OK دیده می‌شوند. عدد اول (اینجا ۲۰) کیفیت سیگنال است: بین ۰ تا ۳۱، و مقادیر حدود ۱۰ تا ۲۵ برای کار معمول کافی‌اند؛ عدد ۹۹ یعنی سیگنال شناخته نشده و معمولاً یعنی مشکل آنتن یا ثبت در شبکه.

:::

خلاصه

  • SIM800L ماژول GSM نسل دوم است؛ با سیم‌کارت فعال و آنتن، پیامک و تماس و GPRS می‌دهد.
  • تغذیه باید ۳٫۴ تا ۴٫۴ ولت با تحمل پیک حدود ۲ آمپر باشد؛ پین‌های آردوینو هرگز کافی نیستند.
  • روی مسیر آردوینو به ماژول مقاومت سری بگذارید؛ منطق ماژول حدود ۲٫۸ ولت است.
  • چشمک تند NETLIGHT یعنی جست‌وجوی شبکه و چشمک کند یعنی ثبت‌شده.
  • پیامک با AT+CMGF=1 و AT+CMGS و پایان‌دادن با Ctrl+Z فرستاده می‌شود؛ پاسخ موفق +CMGS: n و OK است.

با SIM800L پروژه‌های شما حرف می‌زنند؛ در درس بعدی با ESP32 به دنیای برد همه‌کارهٔ بی‌سیم می‌رویم.

منابع و ارجاع‌ها

درس‌های مرتبط