در سری آموزشهای قبلی شیلد sim800c آردوینو Arduino به آموزش اسکن شبکه، ارسال و دریافت پیامک پرداختیم که می توانید در لینکهای زیر به تفکیک مشاهده کنید.
آموزش اسکن شبکه شیلد sim800c آردوینو
آموزش دریافت sms شیلد sim800c آردوینو
آموزش ارسال sms شیلد sim800c آردوینو
در این پست به آموزش برقراری تماس صوتی خواهیم پرداخت پس در ادامه آموزش با مرجع تخصصی آردوینو، دیجی اسپارک همراه باشید.
شیلد sim800c آردوینو
شیلد Sim800c یک شیلد GSM/GPRS با قابلیت پشتیبانی از ۴ کانال ۸۵۰/۹۰۰/۱۸۰۰/۱۹۰۰ MHz برای ارسال دیتا ، SMS,MMS و برقرای تماس صوتی میباشد. این ماژول مخابراتی را میتوان به عنوان یک تلفن همراه هوشمند در نظر گرفت که کاربران به وسیلهی آن میتوانند دیتا را به درستی ارسال و دریافت کنند. این ماژول قابلیت پشتیبانی از تمام اپراتورهای مخابراتی را دارا میباشد.ارتباط سریال در سطح TTL قابلیت راهاندازی این ماژول را با آردوینو و سایر سیستمهای ۵ , ۳٫۳ , ۲٫۸۵ ولت DC را امکانپذیر میکند. به وسیله تغییر وضعیت جامپر (D1 D0) میتوان ماژول را در وضعیت ارتباط سریال سخت افزاری و یا با تغییر جامپر (D8 D7) میتوان ماژول را در وضعیت ارتباط سریال نرمافزاری قرار داد. این شیلد قابلیت بروز شدن فریم ور را توسط پورت USB و پورت سریال دارا میباشد.از ویژگیهای این شیلد میتوان به موراد زیر اشاره نمود:
- پشتیبانی از چهار باند ۸۵۰/۹۰۰/۱۸۰۰/۱۹۰۰ مگاهرتز
- پروتکل ارتباطی سریال (UART)
- کنترل از طریق AT Command و لایبرری
- دارای جک هدست
- اسلات سیمکارت میکرو
- تغذیه ۵ ولت DC
- جربان مصرفی حداکثر ۲ آمپر
- دمای کاری منفی ۴۰ الی ۸۵ درجه سانتیگراد
توابع مربوط به بر قراری تماس صوتی شیلد sim800c
کتابخانهای که توسط تیم فنی دانشجوکیت آماده شده است را از لینک زیر دانلود کنید و توسط آموزش زیر آن را به نرمافزار آردوینو خود اضافه کنید.
*توجه داشته باشید در صورتی کتابخانه دیگری به نام GSM درون پوشهی libraries نرمافزار آردینو وجود داشت حتما آن را حذف کنید و بعد از آن اقدام به نصب این کتابخانه کنید.
دانلود کتابخانه شیلد Sim800c برای آردوینو
آموزش نصب کتابخانه در نرمافزار آردوینو
این کتابخانه از پین ۷ و ۸ آردوینو به منظور برقراری ارتباط سریال نرمافزار با آردوینو استفاده میکند. همچنین از پین ۶ آردوینو به منظور ریست شیلد استفاده میشود . که میتوانید با اتصال پین ۶ به یک کلید و GND ، امکان ریست کردن را به شیلد sim800c خود اضافه کنید. در ابتدای کار قبل از هر کاری میبایست کتابخانه GSM را به برنامه خود فراخوانی کنیم:
#include <GSM.h>
این کتابخانه پایه و در برگیرندهی تمامی کلاسها و توابعی میباشد که برای راهاندازی یک ماژول یا شیلد GSM مورد نیاز است.شیلد sim800c دارای یک عدد مودم داخلی میباشد که به وسیلهی پورت سریال و AT command ها میتوان آن را به سامانهی جهانی ارتباطات همراه متصل نمود. این کتابخانه دستورات و کدنویسیهای سطح پایین بین سیم کارت و مودم داخلی sim800 را از بین میبرد و کدنویسی پیشرفته و سطح بالا را در اختیار شما قرار میدهد.کتابخانه GSM از ارتباط سریال نرمافزاری با پینهای شماره ۷ و ۸ آردوینو به منظور برقرای ارتباط بین شیلد (مودم ) و آردوینو استفاده میکند. ممکن است سیمکارت شما دارای پین باشد (pin number) برای این منظور یک Preprocessor به نام
PINNUMBER
معرفی میکنیم و اگر سیمکارت دارای پین بود ، شماره پین آن را داخل کوتیشن مینویسم و اگر هم دارای شماره پین نبود داخل کوتیشن چیزی نمینویسیم و داخل آن را خالی میزاریم:
#define PINNUMBER ""
برای دسترسی به توابع راهانداز شیلد sim800c و برقراری تماس باید از دو کلاس GSM و GSMVoiceCall دو آبجکت با نامهای دلخواه بسازیم( ما از gsmAccess برای کلاس مربوط به راهاندازی شیلد و از نام vcsبرای کلاس مربوط به GSMVoiceCall استفاده میکنیم).
GSM gsmAccess; GSMVoiceCall vcs;
تعدادی متغیر برای ذخیره شمارهای که قصد داریم با آن تماس برقرار کنیم را تعریف میکنیم:
String remoteNumber = ""; char charbuffer[20];
در Setup برنامه به منظور نمایش دادهها و وضعیت ماژول پورت سریال را باز میکنیم:
void setup(){ Serial.begin(9600); Serial.println("Make Voice Call");
سپس یک متغیر از جنس boolean به نام notConnected به منظور قرار دادن وضعیت اتصال درست شیلد به آردوینو ایجاد میکنیم و مقدار پیشفرض آن را برابر true قرار میدهیم.تا زمانی که اتصال بین مودم و آردوینو به درستی برقرار نشده باشد این متغیر دارای مقدار true است و پس از برقراری اربتاط و شناختن سیم کارت و مودم توسط آردوینو مقدار آن را به false تغییر میدهیم:
boolean notConnected = true;
اکنون با فراخوانی gsmAccess.begin() و با وارد کردن PINNUMBER به عنوان آرگمان ورودی به شکل gsmAccess.begin(PINNUMBER) به شبکه متصل میشویم.
تابع begin پس از فراخوانی مقادیر ERROR, IDLE, CONNECTING,GSM_READY, GPRS_READY,TRANSPARENT_CONNECTED را برمیگرداند.برای اصولی تر شدن کد نویسی و جلوگیری از خطاهای احتمالی درون برنامه تابع gsmAccess.begin(PINNUMBER) را درون یک while مینویسیم و مرتبا ارتباط بین مودم و آردوینو را تا زمانی که تابع begin مقدار GSM_READY را برنگردانده باشد چک میکنیم:
while(notConnected) { if(gsmAccess.begin(PINNUMBER)==GSM_READY) notConnected = false; else { Serial.println("Not connected"); delay(1000); } }
بعد از برقرای ارتباط صحیح بین ماژول و سیمکارت ییغام زیر را بر روی سریال مانیتور نرمافزار آردوینو نمایش میدهیم و به کاربر اطلاع میدهیم که اکنون باید شماره که قصد برقراری تماس با آن را وارد کند:
Serial.println("GSM initialized."); Serial.println("Enter phone number to call."); }
در loop برنامه چک میکنیم اگر دادهای در بافر سریال وجود داشته باشد آن را دریافت کنیم و درون متغیری به نام inChar ذخیره کنیم.
void loop() { while (Serial.available() > 0) { char inChar = Serial.read();
حال باید کدی بنویسیم که در صورتی که ENTER فشرده شد ، برنامه تشخیص دهد که کاربر کامل شماره را وارد کرده است و باید وارد مرحلهی بعدی شود. هنگامی که شما دکمه ENTER را فشار میدهید ، کاراکتر ‘n’ ارسال میشود.پس باید برنامه را به گونهای بنویسیم که پس از ارسال ‘n’ ،برنامه از حلقه دریافت شماره یا متن پیام خارج شود و وارد مرحلهی بعدی شود، پس کد زیر را مینویسیم:
if (inChar == 'n') { if (remoteNumber.length() < 20) {
شمارهای که قصد تماس با آن را داریم بر روی سریال مانیتور نرم افزار آردوینو نمایش میدهیم:
Serial.print("Calling to : "); Serial.println(remoteNumber); Serial.println();
شمارهای که قصد تماس با آن را داریم در متغیری از جنس String به نام remoteNumber ذخیره میشود.برای برقرای تماس باید از تابع voiceCall() که ورودی آن شمارهی مورد نظر میباشد که باید حتما به صورت آرایهای جنس char باشد.بنابراین باید remoteNumber که از جنس String میباشد به آرایهای از جنس char تبدیل شود برای این منظور از تابعی به نام toCharArray استفاده میکنیم.
remoteNumber.toCharArray(charbuffer, 20);
تابع vcs.voiceCall() پس از فراخوانی در صورتی که اتصالات به درستی برقرار شده باشد مدار ۱ را برمیگرداند. ما میتوانیم با استفاده از تابع getvoiceCallStatus() وضعیت تماس فعلی را بدست بیاوریم. این تابع پس از فراخوانی مقادیر IDLE_CALL, CALLING, RECEIVINGCALL, TALKING را برمیگرداند.ما قصد داریم هنگامی که تماس برقرار است با زدن دکمهی enter به تماس خاتمه بخشیم .بنابر این یک حلقه بینهایتی مینویسیم که درصورتی که کاراکتر ‘n’ دریافت نشده باشد و تماس برقرار میباشد ادامه پیدا کند و در صورتی که یکی از این دو مورد نقض شد ، تماس پایان یابد.
if(vcs.voiceCall(charbuffer)) { Serial.println("Call Established. Enter line to end"); while(Serial.read()!='n' && (vcs.getvoiceCallStatus()==TALKING)); vcs.hangCall(); }
هنگامی که تماس تکمیل شد متغیری که درون آن شماره تلفن ذخیره میشد را پاک میکنیم و دوباره پیام Enter phone number to call را برای وارد کردن دوبارهی شماره بر روی سریال مانیتور نرمافزار نمایش میدهیم.
Serial.println("Call Finished"); remoteNumber=""; Serial.println("Enter phone number to call."); }
اگر شماره تلفن وارد شده بیشتر از ۲۰ عدد کاراکتر بود ، مقدار شماره تلفن قبلی از بین میرود و دوباره شماره تلفن از شخص گرفته میشود:
else { Serial.println("That's too long for a phone number. I'm forgetting it"); remoteNumber = ""; } }
هنگامی که درر حال خواندن بافر سریال میباشیم ، اگر کاراکتر دریافتی برابر enter نبود ( ‘n’) ، آن را به متغیر remoteNumber اضافه میکنیم و در نهایت loop برنامه را میبندیم.
else { // add the latest character to the message to send: if(inChar!='r') remoteNumber += inChar; } } }
آموزش توابع مربوط به برقراری تماس صوتی به پایان رسید اکنون میخواهیم با استفاده از اطلاعاتی که تا کنون بدست آوردید مثال برقرای تماس را بر روی آردوینو خود آپلود کنید. کدهای قرار گرفته در پایان این صفحه را بر روی آردوینو خود آپلود کنید و سپس تمام عملیات زیر را به ترتیب انجام دهید.بعد از آپلود کدها بر روی آردینو ، کلید نمایش داده شده در تصویر زیر را به مدت ۵ ثانیه نگه دارید.
بعد از فشردن کلید نشان داده در تصویر فوق ، باید LED نشان داده در تصویر زیر روشن شود.
اکنون سریال مانیتور نرم افزار را باز کنید و آن را بر روی Newline تنظیم کنید. سپس منتظر بمانید نا بر روی سریال مانیتور عبارت Enter a mobile number نمایش داده شود.شماره را وراد کنید و enter را بزنید. بعد از وارد کردن شماره عبارت Calling to نمایش داده میشود و بدین معنی است که تماس در حال انجام است. کمی منتظر بمانید تا گوشی شما صه صدا در آید. بعد از برقراری تماس اگر کلید enter را فشار دهید ، تماس شما قطع میشود . و در صورت قطع شدن تماس چه از طرف شما و چه از طرف مقابل ، پیام Call Finished بر روی سریال مانیتور نرم افزار نمایش داده میشود.
برنامه آردوینو
/* Make Voice Call */ // libraries #include <GSM.h> // PIN Number #define PINNUMBER "" // initialize the library instance GSM gsmAccess; // include a 'true' parameter for debug enabled GSMVoiceCall vcs; String remoteNumber = ""; // the number you will call char charbuffer[20]; void setup() { // initialize serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } Serial.println("Make Voice Call"); // connection state boolean notConnected = true; // Start GSM shield // If your SIM has PIN, pass it as a parameter of begin() in quotes while (notConnected) { if (gsmAccess.begin(PINNUMBER) == GSM_READY) notConnected = false; else { Serial.println("Not connected"); delay(1000); } } Serial.println("GSM initialized."); Serial.println("Enter phone number to call."); } void loop() { // add any incoming characters to the String: while (Serial.available() > 0) { char inChar = Serial.read(); // if it's a newline, that means you should make the call: if (inChar == 'n') { // make sure the phone number is not too long: if (remoteNumber.length() < 20) { // let the user know you're calling: Serial.print("Calling to : "); Serial.println(remoteNumber); Serial.println(); // Call the remote number remoteNumber.toCharArray(charbuffer, 20); // Check if the receiving end has picked up the call if (vcs.voiceCall(charbuffer)) { Serial.println("Call Established. Enter line to end"); // Wait for some input from the line while (Serial.read() != 'n' && (vcs.getvoiceCallStatus() == TALKING)); // And hang up vcs.hangCall(); } Serial.println("Call Finished"); remoteNumber = ""; Serial.println("Enter phone number to call."); } else { Serial.println("That's too long for a phone number. I'm forgetting it"); remoteNumber = ""; } } else { // add the latest character to the message to send: if (inChar != 'r') remoteNumber += inChar; } } }
این کد برای ایجاد یک تماس تلفنی با استفاده از ماژول GSM و شیلد ماژول GSM نوشته شده است. با استفاده از این کد، میتوانید از طریق پورت سریال، یک شماره تلفن را وارد کرده و سپس با زدن دکمه ‘n’ یا اینتر، تماس تلفنی با آن شماره را برقرار کنید. هنگامی که تماس برقرار میشود، میتوانید برای پایان تماس از طریق خط تلفن یک نویز را وارد کنید و تماس قطع میشود.
#include <GSM.h>: این دستور، کتابخانه GSM را به برنامه اضافه میکند تا از توابع مربوط به ماژول GSM استفاده کنیم.
#define PINNUMBER “”: این دستور یک متغیر تعریف میکند که ممکن است برای ماژول SIM کارت پین مورد نیاز را داشته باشد.
GSM gsmAccess;: این دستور یک شیء از کلاس GSM را میسازد که برای مدیریت ماژول GSM استفاده میشود.
GSMVoiceCall vcs;: این دستور یک شیء از کلاس GSMVoiceCall میسازد که برای مدیریت تماسهای صوتی استفاده میشود.
تابع setup(): در این تابع، ابتدا ارتباط سریال را با سرعت ۹۶۰۰ بیت بر ثانیه تنظیم میکند و سپس ماژول GSM را راهاندازی میکند. اگر ماژول آماده برای ارتباط باشد، وضعیت اتصال را نمایش میدهد. سپس پیام “Enter phone number to call.” را چاپ میکند و منتظر ورود شماره تلفن برای تماس میشود.
تابع loop(): در این تابع، شماره تلفن وارد شده از طریق پورت سریال خوانده میشود و اگر کاربر دکمه ‘n’ یا اینتر را زده باشد، تماس تلفنی با شماره وارد شده برقرار میشود. پس از برقراری تماس، اگر وضعیت تماس در حال صحبت (TALKING) باشد، منتظر ورود نویز توسط کاربر میماند و در صورتی که نویز اضافی وارد شود، تماس قطع میشود. پس از قطع تماس، دوباره منتظر ورود شماره تلفن جدید برای تماس میشود.
اگر قصد استفاده از این کد را دارید، باید اطمینان حاصل کنید که ماژول GSM به درستی به میکروکنترلر وصل شده است و از کارت SIM معتبر و بدون پین استفاده میشود. همچنین بهتر است قبل از اجرای این کد، از تنظیمات ماژول GSM و ماژول SIM کارت اطمینان حاصل کنید تا بدون مشکل عمل کند.
سختافزار مورد نیاز
شیلد sim800c (خرید از فروشگاه)
سیمکارت میکرو
باسلام
ممنون بابت آموزشهایی که در سایتتون قرارمیدید.
لطفا اگر امکانش هست، آموزش کامل کار با ماژول جی پی اس NEO-6M را هم در سایت قرار بدید. با تشکر
با سلام آیا میشه این رو به رزبری پای وصل کرد؟لطفا زود جواب بدید که لازمش دارم
سلام امکانش هست اموزش ارسال و در یافت اس ام اس رو برای این کیت بر روی رزبری پای که دارین تو فروشگاه خودتون میفروشید رو بگذارید
سلام
کتابخانه ی شیلد قابل دانلود نیست
لطفا یک لینک دیگه قرار بدید
ممنون
با سلام
ضمن تشکر از توجه شما، لینک دانلود اصلاح شد. به صفحه محصول در دانشجو کیت هدایت میشوید و از آنجا انتهای صفحه لینک دانلود قرار دارد.
سلام.چه طوری میشه همزمان دو یا چند تا از این سنسور nlh رو راه اندازی کرد؟؟؟ با این کتابخونه ها میشه؟؟
nlh= دما…..:-)
با سلام
لطفا سوالتان را کامل و دقیق مطرح بفرمایید. منظورتان از NLH دقیقا چیست؟