مقدمه
تقریبا میتوان گفت اسم شرکت کویکتل و ماژولهای قدرتمند این شرکت بهوفور به گوش علاقمندان فعال در حوزه الکترونیک رسیده، بالاخص برای دوستانی که در زمینه راهاندازی GSM کار میکنند. در این آموزش قصد داریم که ماژول قدرتمند MC60 شرکت کویکتل را توسط آردوینو راهاندازی کنیم. توصیهمیکنم حتما مقاله ماژولهای کوئکتل–کویکتل و قابلیت خارقالعاده OpenCPU را بخوانید تا با ماژولهای قدرتمند شرکت کویکتل بیشتر آشنا شوید. برای راهاندازی این ماژول حداقل باید موارد زیر دردسترس باشند تا بتوان آن را را راهاندازی کرد:
- برد آموزشی آردوینو (از هر نوعی بود فرقی نداره)
- برد آموزشی ماژول MC60
- کدنویسی برای برقراری ارتباط با این ماژول
البته ممکناست خیلیاز علاقمندان مورد دوم را نداشتهباشند که در این مورد هم فکرشده و قصد داریم یک شماتیک برای این برد طراحیکنیم و درنهایت بتوانیم از آن استفادهکنیم. البته در این آموزش برای راهاندازی ماژول MC60 از برد آموزشی که در شکل مشاهده میکنید، استفادهشدهاست.
برای خرید این ماژول و دیگر ماژولهای این شرکت میتوانید وارد فروشگاه ما شوید.
گام اول: کدنویسی
در این آموزش قصد داریم که ماژول قدرتمند MC60 شرکت کویکتل را توسط آردوینو راهاندازی کنیم. در این بخش قصد داریم کدی ساده برای برقراری ارتباط آردوینو با ماژول MC60 بنویسیم که شامل موارد زیر میشود:
- ارسال پیام
- دریافت پیام
- اعلام موجودی سیم کارت
- شناسایی اپراتور
- معرفی تابع فیلتر حروف
- تنظیمات فعالسازی
کدنویسی بخش ارسال پیام در ماژول MC60
int Send_Message(String phone , String text){ mySerial.print("AT+CMGF=1"); delay(1000); mySerial.print("AT+CMGS="); mySerial.print("\"") ; mySerial.print(phone); mySerial.print("\"") ; mySerial.print("\r\n"); delay(100); mySerial.print(text); delay(100); mySerial.print(char(26)); delay(100); return 1; } // به طور مثال Send_Message("0938866****" , "Welcome to MC60");
تابعی که نوشته شده دارای دو ورودی شماره تلفن و متن است بهطوریکه شما میتوانید با واردکردن شماره تلفن و متن دلخواهتان بهصورت دستور از آن استفادهکنید.
کدنویسی بخش دریافت پیام در ماژول MC60
String receive message(){ if(mySerial.find("CNMI")>=0){ mySerial.println("AT+CMGR=1") ; delay(10); mySerial.setTimeout(2000) ; String input = mySerial.readString(); delay(500); String number ="0"; String firstword = "\",\""; String lastword = "\",\"\",\""; int n1 = input.indexOf(firstword) + firstword.length() ; int n2 = input.lastIndexOf(lastword); if(n1>-1 and n2>-1){ number = input.substring(n1 , n2); } if(number=="0"){ return "0"; }else{ mySerial.println("AT+CMGD=1,4") ; return input; } } }
این قسمت از تابع هم بهمنظور دریافت پیامهای دریافتی بههمراه حذف آنها از حافظه ماژول MC60 میباشد که این قسمت از برنامه حتما باید در قسمت LOOP برنامه باشد.
کدنویسی بخش اعلام موجودی سیم کارت در ماژول MC60
این بخش شامل سه زیر مجموعه میباشد:
- بخش اول: شناسایی اپراتور
- بخش دوم: تغییر زبان اپراتور به زبان انگلیسی
- بخش سوم: دریافت موجودی
کدنویسی بخش شناسایی اپراتور در ماژول MC60
String Operator(){ delay(50); mySerial.println("AT+COPS?"); mySerial.setTimeout(100) ; String input = mySerial.readString(); mySerial.setTimeout(10) ; input = word_filter(input,"\"","\""); input.trim(); delay(10); if(input=="MTN Irancell"){ return "Irancell"; }else{ return "Not Recognized"; } }
این تابع اپراتور را شناسایی میکند و دقت کنید که صرفا برای سیمکارت ایرانسل نیست بلکه از همین طریق شما قادر خواهید بود که انواع اپراتور ها را شناسایی کنید از قبیل همراه اول، رایتل و … فقط نکته ای را باید در نظر بگیرید، در قسمت ورودی کدی را که برمیگرداند را باید از قبل شناسایی کنید.
کدنویسی بخش تغییر زبان اپراتور به زبانانگلیسی در ماژول MC60
void Operator_Setting(String Operator) { String oprator = service(); if(oprator == "Irancell"){ mySerial.println("AT+CUSD=1,\"*555*4*3*2#\""); } delay(3000); mySerial.println("AT+CUSD=2"); }
این تابع زبان اپراتور را پساز شناسایی تبدیل به زبانانگلیسی میکند.
کدنویسی بخش دریافت موجودی در ماژول MC60
String Balance(String Operator){ if(Operator=="Irancell"){ mySerial.println("AT+CUSD=1,\"*141*1#\""); mySerial.setTimeout(6000); String Balance_Read = mySerial.readString(); delay(100); mySerial.println(input ); String firsword = "Credit"; String lastword = "WOW"; int Word1 = Balance_Read.indexOf(firsword) + firsword.length() ; int Word2 = Balance_Read.lastIndexOf(lastword); if(Word1 ==-1 or Word2==-1){ return "0" ; }else{ Balance_Read = Balance_Read.substring(Word1 , Word2); } delay(100); Balance_Read.replace("Rial", ""); Balance_Read.replace(".", ""); Balance_Read.replace("IRR", ""); Balance_Read.trim(); return Balance_Read; } }
خب پساز اینکه زبان اپراتور تبدیل به زبانانگلیسی شد حال توسط تابعبالا قادر هستیم مقدار موجودی سیمکارت را دریافت کنیم.
کدنویسی بخش معرفی تابع فیلتر حروف در ماژول MC60
String word_filter( String input_word,String word1,String word2 ){ int Word1 = input_word.indexOf(word1) + word1.length() ; int Word2 = word1.lastIndexOf(word2); if(Word1 ==-1 or Word2==-1){ return "0" ; delay(100); }else{ return input_word.substring(Word1 , Word2); delay(100); } }
این تابع کار فیلترکردن حروف را بهعهده دارد که توسط این تابع میتوانیم هر رشتهای را بنویسیم و آنرا توسط تابع بالا دریافتکنیم.
کدنویسی بخش دریافت شماره تلفن در ماژول MC60
String Get_PhoneNumber(String Number){ String word1 = "+98"; String word2 = "\",\"\",\""; int Word1 = Number.indexOf(word1) + word1.length() ; int Word2 = Number.lastIndexOf(word2); if(Word1 ==-1 or Word2==-1){ return "0" ; }else{ Number = "0" + Number.substring(Word1 , Word2 ); } return Number; }
کاری که این تابع انجام میدهد دریافت شماره تلفن میباشد که طبق همین تابع میتوانیم شمارهتلفنها را محدود کنیم و اصطلاحا چندین کاربر و مدیر در برنامه خود تعریفکنیم.
کدنویسی بخش تنظیمات اولیه در ماژول MC60
void GSM_Initilaize() { boolean gsm_Init = 1; while (gsm_Init > 0) { mySerial.println("AT"); while (mySerial.available()) { if (mySerial.find("OK") > 0) gsm_Init = 0; } delay(100); } boolean Ready = 1; while (Ready > 0) { mySerial.println("AT+CPIN?"); while (mySerial.available()) { if (mySerial.find("+CPIN: READY") > 0) Ready = 0; } delay(1000); } mySerial.write("AT+CMGF=1\r\n"); delay(1000); }
این تابع درواقع کار ماژول GSM را چک میکند که آیا امادهبهکار است یا خیر؟ درصورتیکه همهچیز درست باشد، باید OK را از ماژول دریافتکنیم. خب حالا وقت استفادهاز توابع رسیده، که باید از این توابع در قسمت اصلی کد استفادهکنیم.
String Phone = "xxxxxxxxxxxx"; // like a 09388669075 String Operator,Balance; void setup() { Serial.begin(9600); mySerial.begin(9600); mySerial.println("AT&F"); delay(100); mySerial.println("AT+CMGF=1"); mySerial.setTimeout(100); while(1){ Operator= Ooperator(); if(Operator=="nothing"){ Serial.println(Operator); }// end if operator else{ Serial.println(Operator); Operator_Setting(Operator); GSM_Initilaize(); Balance=balance(Ooperator()); // Send_Message(Phone, Balance); Send_Message(Phone, "Welcome to MC60"); Serial.println(Balance); return; } }// end while } // end of Main void loop() { String Read_Message = receive_message(); if(Read_Message != "0"){ String phones = Get_PhoneNumber(Read_Message); String FILTER_WORD = word_filter(Read_Message,"BLOOM","bloom"); delay(100); if(FILTER_WORD=="OUTPUT1"){ Serial.println("OutPut1 is On"); //Send_Message(Phone, "OutPut1 is On"); }else if(FILTER_WORD=="OUTPUT2"){ Serial.println("OutPut2 is On"); //Send_Message(Phone, "OutPut2 is On"); } } }
نکته
String FILTER_WORD = word_filter(Read_Message,"BLOOM","bloom");
این خط به اینمعنیاست که اگر، بین BLOOM و bloom، هر رشتهای که نوشتیم آنرا تشخیصدهد. بهعبارتدیگر اصلا به عبارت مابین رشته ربطی ندارد بلکه تصور میکروکنترلر این است که، هر چیزی بین BLOOM و bloom بود آن را فیلتر کند و درنهایت مورد آنالیز قراردهد که رشته فیلترشده مربوطبه کدام قسمت میباشد(بسیار باعث خوانایی کد میشود) بهطورمثال اگر پیامی با متن BLOOM OUTPUT1 bloom بنویسیم. روندی که میکروکنترلر درپیش خواهدگرفت شامل موارد زیر میباشد:
- شناسایی رشته بین BLOOM و bloom
- تحلیل رشته OUTPUT1
- اجرای دستورات رشته تحلیلشده
که اگر این متن را ارسال کنید. باید به شما یک پیام حاوی OutPut2 is On را ارسال کند. برای دریافت دیتاشیت این ماژول اینجا کلیک کنید.
گام دوم: طراحی شماتیک برد MC60
خب با این شماتیک بهراحتی میتوانید برای خود یک برد توسعه MC60 طراحی کنید که قابلیت اتصال به هرنوع میکروکنترلی را داشتهباشد. امیدوارم که این آموزش برای شما مفید واقع شده باشد. با ما همراه باشید.
منبع: سیسوگ