آردوینو سیم کارت GSM - GPRS پروژه های آردوینو

پروژه رله تایمر کنترلی با پیامک Sim800c پرومیک Promake و آردوینو

create-relay-timer-sms-control-arduino-and-promake-shield-easy-iot-digispark

رله تایمر کنترلی با پیامک یکی از مهم ترین و پرکاربردترین ابزارها در زمینه کنترل توان مصرفی وسایل برقی به شمار می‌رود. به کمک این ابزار می‌توانید مدت زمان فعال و غیر فعال بودن وسیله برقی را تعیین کنید. رله تایمر کنترلی با پیامک در گلخانه ها، کارگاه ها و… مورد استفاده بسیاری دارد. در این آموزش به طراحی و پیاده سازی یک رله تایمر دار پیامکی می‌پردازیم. این رله تایمر از طریق پیامک و از راه دور قابل کنترل است. جهت پیاده سازی این پروژه، از شیلدهای PROMAKE آردوینو استفاده می‌کنیم. به کمک این شیلدها می‌توان به سادگی و بدون نیاز به سیم کشی، پروژه‌های خود را اجرا کنید. مزیت شیلدهای PROMAKE، این است که به سادگی بر روی بردهای آردوینو قرار می‌گیرند. بدین ترتیب شما دارای یک مدار منظم و البته سریع در اجرا، خواهید بود. البته جهت اجرای پروژه، از آنجاییکه قصد داریم تا دو رله را به صورت همزمان زمانبندی کنیم، از سیستم عامل FreeRTOS استفاده می کنیم. در ادامه آموزش ساخت رله تایمر کنترلی با پیامک و شیلد ProMake با مرجع تخصصی ماژول سیم کارت به زبان فارسی، دیجی اسپارک همراه باشید.

 


شیلد PROMAKE برد آردوینو


در پست‌های قبلی به وفور در خصوص این شیلدها صحبت کرده‌ایم. اما اگر هنوز با شیلدهای پرومیک آشنایی ندارید. شیلدهای ProMake یکسری از شیلدهای مخصوص آردوینو بوده که کار طراحی نمونه اولیه و حتی در بعضی موارد محصولات خاص را بسیار بسیار ساده می‌کند. شیلدهای پرومیک که ساخت ایران هستند، برای انواع مختلفی از بردهای آردوینو طراحی و توسعه داده‌اند. به کمک این شیلدها می توان به سادگی و بدون نیاز به هیچ سیم کشی اضافه، ارتباط بین بردهای آردوینو و ماژول های مختلف را برقرار نمود. این شیلد که به سادگی روی برد آردوینو UNO قرار می گیرد، دارای امکانات جانبی بسیاری است. به عنوان مثال دارای پورت USB از نوع TYPEC یا تقسیم بندی انواع پروتکل‌ها، و افزودن پروتکل QWIIC است. در کنار این، وجود LED ها و کلید، به عنوان خروجی و ورودی تعبیه شده است. به تصویر زیر دقت کنید.

شیلد ProMake آردوینو uno - دیجی اسپارک

 

شیلد PROMAKE مخصوص آردوینو، دارای دو اسلات جداگانه است. هر اسلات دارای پایه هایی جهت اتصال شیلدهاست. بر روی این اسلات ها می‌توان شیلدهای مختلف PROMAKE نظیر GSM، GPS، رله و….. را قرار داد. در این آموزش هم ما قصد داریم تا از شیلد GSM جهت دریافت فرامین پیامک استفاده کنیم. پس بدون هیچ نگرانی کافیست ماژول‌ها را در محل مشخص شده قرار دهید و پروژه را راه اندازی کنید.

 


ماژول SIM800C سیم کارت پرومیک


در ابتدای آموزش، به بررسی شیلد سیم کارت SIM800C ساخت PROMAKE می پردازیم. این شیلد به سادگی هر چه تمام تر، و بدون نیاز به سیم کشی، روی شیلد آردوینو UNO ساخت PROMAKE قرار می گیرد. بدین ترتیب جهت راه اندازی و کار با این شیلد، بدون نگرانی، می توانید ماژول سیم کارت را راه اندازی کنید. توسط ماژول Sim800C میتوانید پروژه را به شبکه مخابراتی سیم کارتی متصل کنید. این امر توسط یک سیم کارت قابل انجام است. با توجه به اینکه از محصولات پرومیک استفاده می‌کنید، دردسرهای سیم کشی و مشکلات تغذیه‌ای برای سیم کارت را نخواهید داشت. در تصویر زیر این ماژول سیم کارتی را مشاهده می‌کنید.

ماژول سیم کارت Sim800C ساخت پرومیک - دیجی اسپارک

 

شیلد سیم کارت ماژول SIM800C، می تواند به سادگی به شبکه موبایلی کشور متصل شود. با اتصال این شیلد به شبکه، شما می توانید عینا یک تلفن همراه، به ارسال و دریافت پیامک، برقراری تماس صوتی دو طرفه و حتی اتصال اینترنت بپردازید. شیلد ماژول SIM800C ساخت PROMAKE، باید در اسلات شماره ۱ شیلد آردوینو UNO قرار می گیرد. جهت اتصال، باید شیلد سیم کارت را در قسمت Promake Module1 قرار دهیم. دقت داشته باشید که پایه های متناظر شیلد سیم کارت، به شیلد آردوینو UNO باید متصل شود.

 


ماژول رله کنترل دو کاناله پرومیک


شیلد ماژول رله دو کانال PROMAKE، یک شیلد بسیار کلیدی و کاربردی است. به کمک این شیلد شما می توانید دو کانال رله را بدون نیاز به سیم کشی، به آردوینو UNO خود متصل کنید. این شیلد دارای دو رله بوده که هر کدام دارای خروجی ولتاژ قابل تحمل تا ۲۵۰ ولت AC و جریان ۵ آمپر است. خروجی آن هم دارای ترمینال پیچی MX301 است. که به سادگی میتوانید برای کنترل هر وسیله برقی از آن‌ها استفاده کنید. در تصویر زیر این ماژول رله دو کاناله کوچک را مشاهده می‌کنید.

ماژول رله دو کانال پرومیک Promake در رله تایمر پیامکی - دیجی اسپارک

 

شیلد ماژول رله دو کانال، باید در اسلات شماره ۲ شیلد آردوینو قرار گیرد. این اسلات با عبارت Promake Module2 قرار گیرد. جهت قرار گیری، باید شیلد رله با پایه RLY1 به پایه D6 متصل گردد.

 


نصب کتابخانه FreeRTOS


همانطور که اطلاع دارید، کتابخانه ها یکی از ابزارهای کلیدی و کاربردی در برنامه نویسی به شمار می روند. به کمک این ابزار، می توانیم توابع نوشته شده در فایلهایی به نام کتابخانه ذخیره کرده و سپس در پروژه های متعدد از آن استفاده کنیم.  همانطور که پیشتر گفته شد، برای راه اندازی و کار با سیستم عامل، کتابخانه توسعه داده شده است. برای استفاده از این کتابخانه، ابتدا باید آن را نصب کنیم. برای نصب کتابخانه در محیط آردویینو، ابتدا مطابق تصویر زیر بر روی گزینه Tools و سپس Manage Libraries کلیک کنید. در اینجا، در کادر جستجو می بایست عبارت freertos را تایپ کرده و کتابخانه مشخص شده در تصویر زیر را نصب کنید.

نصب کتابخانه FreeRTOS در آردوینو - دیجی اسپارک

 


کدهای پروژه رله تایمر کنترلی با پیامک


پس از نصب کتابخانه، نوبت به آپلود کدهای رله تایمر کنترلی با پیامک می رسد. جهت آپلود کدها، باید سوییچ S1 روی شیلد آردوینو UNO در حالت PROGRAM قرار گیرد. در خصوص این کلید دقت داشته باشید که بردهای آردوینو دارای رابط سریال هستند. بنابراین اگر این رابط در یک پروژه درگیر باشد، امکان آپلود کدها فراهم نیست. مگر اینکه ارتباط سریالی را قطع کنید. در شیلدهای پرومیک توسط کلید پروگرام، این قابلیت فراهم شده است و بدون نیاز به جدا سازی ماژول‌ها میتوانید روند پروگرام کردن را اجرا کنید. همچنین کدهای پروژه را با کلیک بر روی این لینک می توانید دانلود کنید. کدهای زیر را کپی کرده و به محیط آردوینو منتقل کنید.

#include  //فراخوانی کتاب خانه ها
//توابع task و تعریف آن ها
void relay1( void *pvParameters );
void relay2( void *pvParameters );
void gsm( void *pvParameters );
int on1 = 1000, off1 = 1000; //متغیر برای خواندن حداکثر و کحداقل دمای تنظیم شده از سوی کاربر
int on = 1000, off = 1000;
String data = ""; //متغیر جهت خواندن پیامک
void setup()
{
Serial.begin(115200); //تنظیم باودریت ریت
Serial.print("AT\r\n");
delay(500);
check_connect(); //کنترل اتصال به شبکه GSM
Serial.print("AT+CMGF=1\r\n"); //به کمک این دستور ارسال پیامک در حالت متن قرار می گیرد.
delay(1000);
Serial.print("AT+CMGD=1,4\r\n"); //به کمک این دستور حافظه پیامک ها را خالی می کنیم.
delay(1000);
Serial.print("AT+CSMP=17,167,0,0\r\n"); //به کمک این دستور تنظیمات ارسال پیامک را انجام می دهیم. این دستور برای سیم کارت ایرانسل الزامی است.
delay(1000);
Serial.print("ATE0\r\n"); //فعا سازی مد اکو ماژول سیم کارت
delay(700);
xTaskCreate( //توجه: به کمک تابع xtaskCreate توابعی که سیستم عامل باید به صورت همزمان اجرا کند، به سیستم عامل معرفی می شود.
relay //نام تابع
, "relay" // یک نام دلخواه جهت اختصاص دادن به تابع
, ۱۲۸ // // میزان حافظه به بایت که تابع نیاز دارد
, NULL //در صورتیکه تابع ورودی داشته باشد در این قسمت درج می شود اما از آنجاییکه ورودی ندارد NULL تعیین می گردد.
, ۲ // //تععین شماره اولویت اجرا، در سیستم عامل FreeRTOS توابع یا Task ها از لحاظ اولیت اجرا بین ۰ الی ۳ شماره گذاری می شوند. هرچه عدد بیشتر شود اولویت بالاتر خواهد بود.
, NULL ); //در صورتیکه handler تعریف شده باشد، در این جا آدرس تابع handler مشخص می شود. تابع handler تابعی خارج از تابع Task بوده که به اجرای آن در مواقع خاص کمک می کند. چون در

xTaskCreate(
relay2
, "relay2"
, ۱۲۸
, NULL
, ۲
, NULL );
xTaskCreate(
gsm
, "gsm"
, ۱۲۸
, NULL
, ۲
, NULL );
}
void loop()
{

}

//******************************************************************************************************
void check_connect() {
char ccalr[] = {"+CCALR: 1"};
Serial.println("WAITING TO CONNECT TO NETWORK");
Serial.flush();
while (true) {
Serial.print("AT+CCALR?\r\n"); // ارسال دستور AT+CCALR به ماژول، در صورتیکه ماژول به شبکه متصل گردد ماژول عبارت CCALR: 1 را بر میگرداند
if (Serial.find(ccalr) == true) // نتیجه تابع find در صورتی true می شود که عبارت مورد نظر یافت شده باشد، در غیر اینصورت درون حلقه تا زمانیکه نتیجه مورد نظر یافت نشود، باقی خواهد ماند
break; // خروج از حلقه با یافتن پیام مورد نظر
}
Serial.println("CONNECTED TO NETWORK");
Serial.flush();
}
//******************************************************************************************************
void get_sms() {
unsigned long tm = 0;
char cmti[] = {"+CMTI"}; //زمانیکه پیامکی دریافت شود، ماژول عبارت CMTI را بر می گرداند.
if (Serial.find(cmti) == true ) { //به کمک تابع find می توانیم به دنبال عبارت CMTI باشیم این تابع هر گاه این عبارت را در بافر سریال یافت نماید، خروجی آن برابر true می شود.
if (Serial.available() > 0) //پاک کردن بافر سریال از داده های احتمالی پیشین
Serial.readString();
tm = millis();
Serial.print("AT+CMGR=1\r\n"); //به کمک این دستور می توانیم پیام ها را از حافظه سیم کارت بخوانیم. عبارت ۱به معنای خواندن پیام از حافظه شماره ۱ است.
// vTaskDelay(5000 / portTICK_PERIOD_MS);
while (Serial.available() == 0 && ((millis() - tm > 7000))) {
vTaskDelay(10 / portTICK_PERIOD_MS);

} // منتظر می مانیم تا داده ای دریافت شود و بافر پر شود

data = Serial.readString(); // خواندن داده های موجود در بافر به صورت رشته
// data = data.substring(data.indexOf("!") + 1, data.indexOf("#")); //فرمت ارسال زمان از سوی کاربر بدین صورت است که زمان و تاریخ بین یک علامت تعجب و یک هشتگ قرار می گیرد. /// به کمک تابع index موقعیت کاراکتر علامت تعجب و هشتگ تعیین می شود. تابع substring نیز دو ورودی به عنوان شروع و پایان گرفته و رشتهdata را //با شروع از موقعیت کاراکتر علامت تعجب تا موقعیت علامت هشتگ، در خروجی خود قرار می دهد. این خروجی را ما مجددا در رشته data قرار می دهیم.
Serial.print("AT+CMGD=1,4\r\n"); //پاک کردن کلیه پیامک ها از حافظه، در این برنامه پس از دریافت پیامک و پردازش رشته ای، حافظه سیم کارت را از کلیه پیام ها پاک می کنیم. بنابراین هموارهبا دریافت پیامک
//متن پیام در خانه شماره ۱ سیم کارت ذخیره می گردد.
}
}

//******************************************************************************************************
void send_sms() {
if (Serial.available() > 0)
Serial.readString();
vTaskDelay(100 / portTICK_PERIOD_MS);
Serial.print("AT+CMGS=\"+989****************\"\r\n"); //به جای ستاره ها شماره کاربر گیرنده پیام را وارد کنید.
delay(1500);
Serial.println("RELAYS SET!");
delay(1000);
Serial.write(0x1a); //کااراکتر CTRL+Z جهت ارسال پیامک
delay(1000);
Serial.print("AT+CMGD=1,4\r\n"); //پاک کردن حافظه از پیام های قبلی
delay(1000);
}
//******************************************************************************************************

void relay(void *pvParameters) //تابع رله
{
(void) pvParameters;

// پایه شماره ۳ به عنوان اتصال به رله تعیین شده که شما می توانید مدت زمان خاموش و روشن بودن آن را تعیین کنید.
pinMode(6, OUTPUT);

for (;;) //یک تسک همانند تابع void loop دائما اجرا می شود.
{
digitalWrite(6, HIGH); // فعال شدن خروجی پایه شماره ۱۳ که LED داخلی آردوینو نیز به آن متصل هم هست
vTaskDelay( on / portTICK_PERIOD_MS ); // روشن ماندن به مدت زمان on که از سوی کاربرد تعیین شده
digitalWrite(6, LOW);
vTaskDelay( off / portTICK_PERIOD_MS ); // خاموش ماندن برای مدت زمان تعیین شده توسط کاربر

}
}
//******************************************************************************************************

void relay2(void *pvParameters) // تابع کنترل دما
{
(void) pvParameters;
pinMode(9, OUTPUT); //پایه رله دوم
for (;;)
{
digitalWrite(9, HIGH); // فعال شدن خروجی پایه شماره ۱۳ که LED داخلی آردوینو نیز به آن متصل هم هست
vTaskDelay( on1 / portTICK_PERIOD_MS ); // روشن ماندن به مدت زمان on که از سوی کاربرد تعیین شده
digitalWrite(9, LOW);
vTaskDelay( off1 / portTICK_PERIOD_MS ); // خاموش ماندن برای مدت زمان تعیین شده توسط کاربر

}
}
//******************************************************************************************************

void gsm(void *pvParameters) // تابع دریافت تنظیمات از طریق پیامک
{
(void) pvParameters;
delay(500);
for (;;)
{
//مطابق فرمت، دستور در فرمت {} برای رله دوم و در فرمت <> برای رله اول است.
get_sms();
Serial.println("data: ");
Serial.flush();
Serial.println(data);
vTaskDelay(100 / portTICK_PERIOD_MS);
if (data.indexOf("{") >= 0 && data.indexOf("}") > 0) { //خواندن و جدا سازی دما
data = (data.substring(data.indexOf("{") + 1, data.indexOf("}")));
on1 = data.substring(0, data.indexOf(",")).toInt();
off1 = data.substring(data.indexOf(",") + 1).toInt();
Serial.println(on1);
Serial.println(off1);
}
else if (data.indexOf("<") >= 0 && data.indexOf(">") > 0) { //خواندن مدت زمان فعال ماندن رله
data = (data.substring(data.indexOf("<") + 1, data.indexOf(">")));
on = data.substring(0, data.indexOf(",")).toInt();
off = data.substring(data.indexOf(",") + 1).toInt();
Serial.println(on);
Serial.println(off);
}
}
}

 


اجرای پروژه رله تایمر کنترلی با پیامک


پس از آپلود کدها، نوبت به اجرای پروژه می‌رسد. اجرای پروژه مرحله‌ای است که همه چیز آماده شده و بایست تغذیه برقرار شود. با توجه به اینکه پروژه را با تجهیزات پرومیک Promake که با عنوان Easy IoT در بازار ایران یافت می‌شوند، اجرا شده است. بسیار سریع و بدون نگرانی از خطاهای اتصالاتی آن را اجرا کنید. جهت اجرای پروژه، موارد زیر را باید رعایت کنید.

۱-کلید S1 در وضعیت UART باشد.

۲-برد آردوینو حتما با یک آداپتور ۱۲ ولت با حداقل جریان ۲ آمپر تغذیه شود.

۳-جهت راه اندازی، کلید PWRKEY شیلد SIM800C را برای مدت سه ثانیه نگه داشته و سپس رها کنید.

ماژول سیم کارت SIM800C برای اتصال به شبکه، چند ثانیه ای زمان نیاز دارد. پس از اتصال به شبکه، چشمک زن هر سه ثانیه یکبار خواهد شد. جهت اجرای پروژه، می بایست فرمت ارسال پیامک را رعایت کنیم. همانطور که اطلاع دارید، ما دو رله داریم. فرض کنید قصد داریم تا رله شماره یک را برای سه ثانیه فعال و برای ۵ ثانیه غیر فعال کنیم. بنابراین، ساختار پیامک بایستی به صورت <3000,5000> باشد. مطابق این ساختار، اگر بخواهیم رله شماره ۱ را کنترل کنیم، باید زمان فعال و غیر فعال سازی با عبارت < شروع و با عبارت > تمام شود.  عدد اول زمان فعال سازی و عدد دوم زمان خاموش بودن رله است. همچنین زمان بین شروع و پایان با ویرگول از هم جدا می شود. توجه داشته باشید که زمان به میلی ثانیه تنظیم می شود. جهت تنظیم رله دوم، فرمان با { شروع و با } پایان می یابد. فرض کنید برای ۷ ثانیه رله دوم را می خواهیم روشن کنیم و سپس برای ۳ ثانیه آن را خاموش نماییم. بنابراین، به شکل زیر عمل می کنیم.

{۷۰۰۰,۳۰۰۰}

 


لوازم مورد نیاز


لینک خرید برد آردوینو، کلیک کنید

لینک خرید شیلد آردوینو PROMAKE، کلیک کنید

لینک خرید شیلد رله دو کانال PROMAKE، کلیک کنید

 


جمع بندی


در مجموعه پروژه های شیلدهای PROMAKE، این قسمت را به اجرای یک پروژه بسیار کاربردی اختصاص دادیم. به کمک این پروژه شما می توانید از راه دور و با کمک پیامک، رله ها را کنترل کنید. با ارسال فرمان پیامک، می توانید زمان فعال و غیر فعال بودن رله ها را تنظیم نمایید. جهت اجرای این پروژه از سه شیلد آردوینو، GSM و رله دو کانال PROMAKE استفاده کردیم. به کمک این شیلدها بدون نیاز به سیم کشی، می توانید پروژه را اجرا کنید. بدین ترتیب پروژه را بسیار منظم و در کمترین زمان ممکن، به خروجی می رسانید. همچنین جهت زمانبندی همزمان رله ها، از سیستم عامل FreeRTOS استفاده نمودیم.

 

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

معین صابری

کارشناسی ارشد رشته معماری سیستم های کامپیوتری

مالي که ز تو کس نستاند، علم است
حرزي که تو را به حق رساند، علم است
جز علم طلب مکن تو اندر عالم
چيزي که تو را ز غم رهاند، علم است
(شیخ بهایی)

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

اروند طباطبایی

بنیانگذار دیجی اسپارک: اولین مرجع تخصصی امبدد سیستم به زبان فارسی / کارشناس سئو و تولید محتوا

هرچه می آموزم میبینم که خیلی کم آموختم. علاقه به رباتیک و تکنولوژی دارم. امیدوارم بتونم دانشی را که آموخته‌ام، به روش‌های مختلفی به کاربران علاقمند منتقل کنم.

تبادل نظر و رفع عیب با ثبت دیدگاه