ماژولهای GSM با توجه به قابلیتی که در ارسال و دریافت ریموت دادهها دارند، در سیستمها و پروژههای IoT به صورت مکرر مورد استفاده قرار میگیرند. خوبی این ماژولها این است که برخلاف ماژولهای WiFi، محدودیتها و بستگیهای چندانی در استفاده ندارند و در حالیکه ماژولهایی مانند Wi-Fi و Zigbee معایبی مانند برد کوتاه و قیمت بالا دارند، ماژولهای GSM هم برد بلندتری دارند و هم قابلیت اطمینان بیشتری و برای استفاده از آنها تنها کافیست که یک سیمکارت در اختیار داشته باشیم. البته نقطه ضعف این ماژولها نیز این است که قابلیت ارسال و دریافت دادههای وسیعی که مثلا از طریق سنسورها جمعآوری میشوند را ندارند و تنها برای استفاده در مواردی مناسب هستند که با مبادلهی دادههای کوچک سر و کار داریم.
در این جلسه میخواهیم یکی از ماژولهای GSM را به میکروکنترلر STM32F103C8 ARM متصل کنیم و با استفاده از یک خط تلفن همراه پیامک ارسال کنیم. برای نمایش دادن پیام ارسال و دریافت شده هم از یک LCD 16×2 در پروژه استفاده میکنیم. از دو کلید فشاری هم برای initialize کردن بعد از هر ارسال و دریافت استفاده میکنیم.
تجهیزات مورد نیاز برای اجرای پروژه
- میکروکنترلر STM32F103C8 Cortex-M3
- ماژول GSM SIM800-C
- LCD 16×2
- دو عدد کلید فشاری
- پتانسیومتر 10K
- برد بورد
- سیم رابط برد بوردی
آشنایی با ماژول SIM800C
SIM800-C یکی از ماژولهای معروف و پرکاربرد GSM است که اینترفیس سریال دارد و ولتاژ کاری آن بین ۳.۴ تا ۴.۴ ولت است. این ماژول در حقیقت یک ماژول GSM/GPRS چهار بانده (Quad-band) است که در کاربردهای امبددی که به جابهجایی ریموت دادهها نیاز دارند مورد استفاده قرار میگیرد. SIM800C در فرکانسهای ۸۵۰، ۹۰۰، ۱۸۰۰ و ۱۹۰۰ مگاهرتز کار میکند. این ماژول قادر است تماس صوتی و پیامک را با مصرف توان پایینی ارسال و دریافت کند. کار کردن با آن به وسیلهی AT Commandها صورت میگیرد. یک عدد سیمکارت میخورد و از پروتکلهای UART و RS-232 پشتیبانی میکند. به این ترتیب میتواند با میکروکنترلرهای مختلف اینترفیس داشته باشد.
تغذیهی ماژول SIM800C
تغذیهی این ماژول با یک آداپتور ۱۲ ولتی DC تامین میشود.
قرار دادن سیمکارت در درون ماژول
محل قرار گرفتن سیمکارت در پشت ماژول SIM800C است. فقط توجه داشته باشید که این ماژول از سیمکارتهای 4G پشتیبانی نمیکند بنابراین نباید از این سیمکارتها استفاده کنید.
متصل کردن SIM800C به میکروکنترلر STM32F103C8
برای اتصال این ماژول به میکروکنترلر STM32، از پورت سریال UART آن استفاده میکنیم. پینهای UART میکروکنترلر هم A9 و A10 هستند که در شکل زیر نشان داده شدهاند.
این میکروکنترلر دارای سه اینترفیس UART است که میتوان همزمان سه دستگاه جانبی را با این پروتکل به آن متصل کرد.
AT Commandها
از این دستورات برای ارتباط برقرار کردن و دسترسی به عملکردهای مختلف ماژول مانند ارسال و دریافت پیامهای متنی و صوتی استفاده میکنیم. برخی از این دستورات را که مهم و کاربردی هستند و در پروژهی این آموزش هم از آنها استفاده میشود را در جدول زیر با هم میبینیم.
دیاگرام مدار
برای اتصال ماژول SIM800C به میکروکنترلر STM32 از مدار زیر استفاده میکنیم.
اتصالات بین SIM800C و میکروکنترلر
اتصالات بین میکروکنترلر و LCD 16×2
دو کلید فشاری با مقاومتهای پول داون 10K به پایههای PA0 و PA1 میکروکنترلر متصل میشوند و ست آپ کلی مدار چیزی شبیه شکل زیر خواهد شد.
نوشتن کد میکروکنترلر برای ارتباط با SIM800C
این میکروکنترلر را میتوان با استفاده از Arduino IDE هم پروگرم کرد. به این ترتیب دیگر به پروگرمر FTDI و یا ST-link نیازی نداریم. برای پروگرم کردن کافی است بعد از نوشتن کد در IDE، پورت میکرو USB کابل USB را به میکرو، و پورت USB آن را به PC وصل کنیم. در صورتی که در این رابطه سوال داشتید، به آموزش مفصلی که قبلا برای پروگرم کردن میکروی STM32 با استفاده از Arduino IDE داشتهایم مراجعه کنید.
قبل از شروع توضیح دادن بخشهای مختلف کد، یادآوری میکنیم که مثل همیشه، کد کامل پروژه و فیلم آموزشی اجرای آن را در انتهای آموزش در دسترستان قرار دادهایم.
پینهای LCD را تنظیم میکنیم و کتابخانههای مورد نیاز را اضافه میکنیم.
#include <LiquidCrystal.h> const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
LCD را با استفاده از تابع ;(lcd.begin(16,2 مقداردهی اولیه میکنیم. منظور از (16,2) در این دستور، نوع LCD مورد استفاده است که 2×16 میباشد.
یک پیام را پرینت میکنیم صرفا برای اینکه تست کنیم که اتصالات LCD به درستی برقرار شده و کار میکنند.
lcd.begin(16,2); lcd.print("STM32 WITH GSM"); lcd.setCursor(0,1); lcd.print("SIM800C");
جهت دادهی کلید فشاری که ورودی یا خروجی هستند و پایهی مربوط به آن را تنظیم میکنیم.
pinMode(PA0,INPUT); pinMode(PA1,INPUT);
بادریت ارتباط سریال را هم مشخص میکنیم.
Serial1.begin(9600);
برای ارسال و دریافت پیامها از دو تابع مختلف استفاده میکنیم که کدهای آنها را به صورت جداگانه در ادامه میبینیم.
تابع SendMessage
از این تابع برای ارسال SMS به یک شمارهی مخصوص استفاده میکنیم. AT Commandهایی که باید ارسال کنیم مربوط به ارسال و تعیین شمارهی مقصد و نیز تنظیم مود پیام ارسالی است.
با دستور زیر، مود پیام را روی حالت پیام متنی قرار میدهیم.
Serial1.println("AT+CMGF=1"); //Sets the GSM Module in Text Mode
بعد از آن دستور مربوط به ارسال را قرار میدهیم و شمارهی مقصد را نیز در آن ذکر میکنیم. ارسال را از طریق پورت سریال ۱ انجام میدهیم.
Serial1.println("AT+CMGS=\"+91XXXXXXXXXX\"\r"); // Replace x with mobile number
پیامها را با یک وقفهی یک ثانیهای ارسال میکنیم و همانطور که گفتیم برای ارسال باید از کلیدهای CTRL+Z استفاده کنیم. به این منظور ASCII این دستور (CTRL+Z) را وارد کنیم.
delay(1000); Serial1.println("Hi Circuit Digest from GSM Module"); // The SMS text you want to send Serial1.println((char)26);// ASCII code of CTRL+Z
پس از آن میبینیم که SMS ارسال شده بر روی LCD نشان داده میشود.
lcd.print("SMS SENT");
تابع ReceiveMessage
با استفاده از این تابع، پیامها را توسط ماژول دریافت کرده و بر روی LCD نمایش میدهیم.
Serial1.println("AT+CNMI=2,2,0,0,0");
AT Command فوق برای دریافت پیامها استفاده میشود.
هر پیامی که بر روی پورت سریال ۱ دریافت شود، به صورت یک رشته (string) است که علاوه بر پیام، شامل اطلاعات دیگری مانند تاریخ و زمان و … نیز هست. اصل متن پیام دریافتی، در ششمین “” موجود در رشتهی دریافت شده قرار دارد. پس تمام اطلاعات دیگر به غیر از آن را حذف کرده و فقط همین قسمت را بر روی LCD نمایش میدهیم.
while(1) { if(Serial1.available()) { do { while ( !Serial1.available() ); } while ( '"' != Serial1.read() ); do { while ( !Serial1.available() ); } while ( '"' != Serial1.read() ); do { while ( !Serial1.available() ); } while ( '"' != Serial1.read() ); do { while ( !Serial1.available() ); } while ( '"' != Serial1.read() ); do { while ( !Serial1.available() ); } while ( '"' != Serial1.read() ); do { while ( !Serial1.available() ); } while ( '"' != Serial1.read() ); while ( !Serial1.available() ); receive = Serial1.read(); while ( !Serial1.available() ); receive = Serial1.read(); lcd.clear(); while(1) { while ( !Serial1.available() ); receive = Serial1.read(); if ( receive == '\r' ) break; else lcd.write(receive); } } }
دموی ارسال و دریافت داده با استفاده از میکروکنترلر STM32
- برای ارسال پیام متنی: کافیست که کلید فشاری سمت چپ را بزنید. پیام به شمارهای که در کد درج کرده باشید ارسال خواهد شد.
- برای دریافت پیام متنی: کلید فشاری سمت راست را بزنید تا پیام دریافت شده و بر روی LCD نشان داده شود.
به پایان این آموزش رسیدیم. ارتباط بین ماژول SIM800C و میکروکنترلر STM32 به همین سادگی قابل برقراری است. اگر هر سوال دیگری در مورد این پروژه داشتید، حتما در قسمت کامنتهای همین مطلب برایمان ارسال کنید.
کد
#include <LiquidCrystal.h> //Library for LCD display const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //Pins that are connected between LCD and STM32 LiquidCrystal lcd(rs, en, d4, d5, d6, d7); int receive = 0; void setup() { lcd.begin(16,2); //LCD set at 16x2 mode pinMode(PA0,INPUT); //Push buttons as INPUT pins pinMode(PA1,INPUT); lcd.print("STM32 WITH GSM"); //Display Welcome message lcd.setCursor(0,1); lcd.print("SIM800C"); Serial1.begin(9600); // Setting the baud rate of GSM Module delay(1000); lcd.clear(); } void loop() { lcd.clear(); lcd.setCursor(0,0); lcd.print("S to Send sms"); lcd.setCursor(0,1); lcd.print("R to Receive sms"); delay(100); int a = digitalRead(PA0); //Read status of the push buttons int b = digitalRead(PA1); if (a == 1) // Depeding upon which push button is pressed the respected function is called { SendMessage(); } else if( b == 1) { RecieveMessage(); } } void SendMessage() //Function to Send Message { lcd.clear(); lcd.print("Sending sms"); delay(1000); Serial1.println("AT+CMGF=1"); //Sets the GSM Module in Text Mode delay(1000); Serial1.println("AT+CMGS=\"+91XXXXXXXXXX\"\r"); // Replace x with mobile number delay(1000); Serial1.println("Hi Circuit Digest from GSM Module"); // The SMS text you want to send delay(100); Serial1.println((char)26);// ASCII code of CTRL+Z delay(1000); lcd.clear(); lcd.print("SMS SENT"); delay(1000); } void RecieveMessage() //Function to Receive Message { lcd.clear(); lcd.print("Receiving sms"); Serial1.println("AT+CNMI=2,2,0,0,0"); // AT Command to recieve a live SMS delay(1000); while(1) { if(Serial1.available()) { do { while ( !Serial1.available() ); } while ( '"' != Serial1.read() ); do { while ( !Serial1.available() ); } while ( '"' != Serial1.read() ); do { while ( !Serial1.available() ); } while ( '"' != Serial1.read() ); do { while ( !Serial1.available() ); } while ( '"' != Serial1.read() ); do { while ( !Serial1.available() ); } while ( '"' != Serial1.read() ); do { while ( !Serial1.available() ); } while ( '"' != Serial1.read() ); while ( !Serial1.available() ); receive = Serial1.read(); while ( !Serial1.available() ); receive = Serial1.read(); lcd.clear(); while(1) { while ( !Serial1.available() ); receive = Serial1.read(); if ( receive == '\r' ) break; else lcd.write(receive); } } } }
ویدئو
- منبع: ترجمه از سایت circuitdigest.com
امیدواریم آموزش «ارسال و دریافت SMS با STM32 و ماژول SIM800c» برایتان مفید واقع شده باشد. در ادامه پیشنهاد میکنیم دیگر آموزشهای STM32 را نیز مطالعه کنید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
الان این شد اموزش؟
رفتی از سایت خارجی کپی کردی گذاشتی اینجا یه مقدار از خوت خلاقیت به خرج میدادی کد کامل می کردی فرمان رله رو هم اضافه می کردی
هر جا تو وب سایتها می گردی همینو گذاشتن.
زکات علم نشر ان است.
نه کپی