ZGR64SMS.TXT - โปรแกรมตัวอย่างการใช้ AT Command เพื่อรับ-ส่งSMS กับโมดูล GR-64 (พฤศจิกายน 2550 โดย ปฏิคม คนเก่ง) โปรแกรมตัวอย่างงนี้เป็นโปรแกรมสำหรับส่งข้อความ (SMS) และอ่านข้อความที่ได้รับเข้ามาเพื่อนำไปประยุกต์สำหรับงานควบคุม ต่าง ๆ อย่างง่าย โดยอันดับแรกท่านต้องทำความรู้จักกับ AT Command อย่างคร่าว ๆ ก่อน เพราะตัวโมดูล GR-64 จะทำงานโดยการสั่งงาน ผ่าน RS-232 ด้วยชุดคำสั่งที่เรียกว่า "AT Command" โดยศึกษาได้จากไฟล์ "GX64ATCommand Manual" ในแผ่น CD ที่ให้ไปกับตัว โมดูล หลังจากท่านได้ทำความรู้จักกับ AT Command แล้ว หลัก ๆ ของซอร์สโปรแกรมนี้จะเป็นเรื่องเกี่ยวกับการรับ - ส่ง SMS ก็ให้ท่านข้ามไปศึกษา เรื่อง Short Message Services ก่อนได้เลยครับ (เนื่องจากเนื้อหาของตัว GR-64 มีเยอะ และทำอะไรได้หลายอย่าง) เมื่อศึกษาเรื่อง AT Command ในเรื่องของการรับ - ส่ง SMS มาบ้างแล้ว ทีนี้ลองมาศึกษาซอร์สโค้ดตัวอย่างโปรแกรมนี้กันบ้าง การทำงาน คร่าว ๆ ของโปรแกรมนี้จะเป็นการเช็คว่าถ้ามีการกดสวิตช์ก็จะให้ไมโครคอนโทรลเลอร์สั่งให้ตัวโมดูล GR-64 ส่ง SMS ไป การสั่งงานให้ตัวโมดูล GR-64 ทำการส่ง SMS ออกไปจะต้องมีการสั่ง AT Command ด้วยสี่คำสั่งดังนี้ void send_cmgf(void){ // set sms text mode printf("AT+CMGF=1"); // เป็นการเซ็ตการรับส่ง SMS ในแบบ Text mode printf("\r"); } void send_csmp(void){ // set parameter printf("AT+CSMP=17,167,0,0"); // เซ็ตค่าพารามิเตอร์ printf("\r"); } void send_cmgs(void){ // set telephone number printf("AT+CMGS=\"0817279123\""); // หมายเลขโทรศัพท์ปลายทางที่จะส่ง SMS printf("\r"); } void send_text(void){ // send text printf("TEST SEND SMS FROM GR64 MODULE"); // ข้อความที่จะส่งออกไป putchar(0x1A); // keyboard = Ctrl + z } และถ้าหากไม่มีการกดสวิตช์ ตัวโปรแกรมก็จะทำการส่งคำสั่งเพื่ออ่านข้อความที่เข้ามาใหม่ทุก ๆ 1 วินาที ด้วยคำสั่ง AT+CMGL="REC UNREAD" ซึ่งคำสั่งนี้ก็หมายถึงให้อ่านข้อความ จากตัวโมดูลโดยมีเงื่อนไขว่าต้องเป็นข้อความที่ยังไม่เคยเปิดอ่านมาก่อน (หรือก็คือข้อความที่เข้ามาใหม่นั่นเอง) และได้มีการกำหนดบิตแฟลกจากตัวแปรที่ชื่อว่า NEWSMSF ไว้เพื่อกำหนดให้รู้ว่ามีข้อความเข้ามาใหม่หรือไม่ โดยหากมีข้อความเข้ามาใหม่ if (RXOK) โดยบิต RXOK จะเป็นจริง (TRUE) ก็ต่อเมื่อได้รับข้อมูล จาก Serial port ตรงตามเงื่อนไขแล้ว (ให้ศึกษาในส่วนของการรับข้อมูลจาก Serial port ซึ่งได้แก่ส่วน void serial (void) interrupt 4 และในส่วน ของ void inputcom (unsigned char a) อีกที) รูปแบบ (Format) ของ SMS ที่จะทำให้โปรแกรมทำงานต่อไปได้ก็คือ จะต้องส่งข้อความดังนี้ :P0 หรือ :P1 (ท่านสามารถกำหนดรูปแบบ ของการรับ - ส่ง SMS เป็นในรูปแบบอื่นก็ได้) โดยอักษรนำตัวแรกคือ : (colon) และตัวอักษรถัดมาก็คือตัว P ซึ่งหลังจากโปรแกรมทำงานผ่านเงื่อนไข if (RXOK) แล้ว ถัดมาจะเป็นการเช็คว่าตัวอักษรตัวต่อไปเป็นตัว "P" ใช่หรือไม่ ถ้าหากใช่เราก็กำหนดบิตแฟลก NEWSMSF = 1 ซึ่งหมายความว่ามีข้อความ (SMS) เข้ามาใหม่ แล้วก็ให้ไปทำในลูป doevents(); อีกทีหนึ่ง void doevents(void){ if (COMBUF[1] == '0') P10 = 1; // LED OFF สั่งพอร์ต 1.0 ให้เป็น high if (COMBUF[1] == '1') P10 = 0; // LED ON สั่งพอร์ต 1.0 ให้เป็น Low if (NEWSMSF){ send_cmgd(); NEWSMSF = 0; } } ในลูป doevents(void) จะมีการเช็คตัวอักษรที่เข้ามาต่อจากตัวอักษร "P" ว่าเป็น "0" หรือ "1" โดยถ้าเป็น 0 ก็สั่งให้พอร์ต 1.0 เป็น 1 (High) หรือถ้าเป็น 1 ก็สั่งให้พอร์ต 1.0 เป็น 0 (Low) และในลูป doevents นี้ยังมีการทำงานอีกอย่างหนึ่งก็คือ ถ้ามีข้อความใหม่เข้ามา if(NEWSMSF) ก็มีการเรียก ฟังก์ชั่น send_cmgd(); ให้ทำงาน void send_cmgd(void){ // delete sms printf("AT+CMGD=1"); // delete message index = 1 printf("\r"); } คำสั่ง printf("AT+CMGD=1\r") จะเป็นการส่งคอมมานนี้ออกทาง Serial port สั่งให้ตัวโมดูล GR-64 ทำการลบข้อความ ที่มีค่าอินเด็กส์ = 1 เนื่องจากหากใช้งานไปเรื่อย ๆ ข้อความที่รับเข้ามาก็จะถูกเก็บไว้เรื่อย ๆ เราจึงต้องมีการลบข้อความทุกครั้งที่เข้ามาใหม่ด้วย และข้อความที่เข้ามาใหม่ จะได้เข้ามาแทนที่โดยมีค่าอินเด็กส์เป็น 1 และง่ายต่อการทำงานของโปรแกรมด้วย เป็นงัยบ้างล่ะครับไม่ยากเลยใช่ไหมครับ ทดลองทำดูนะครับ ตัวโมดูล GR-64 นี้สามารถประยุกต์ใช้งานได้หลากหลายมากเลยนะครับ ลองประยุกต์จากซอร์ดโค้ดนี้ดูก็ได้ อาจเป็นแนวทางพัฒนางานได้นะครับ หรืออาจจะประยุกต์จาก LED ติดหรือดับโดยเปลี่ยนไปเป็นสั่งงาน ให้ Output ที่เป็น Relay ให้ ON / OFF เพื่อไปเปิด - ปิดอุปกรณ์ไฟฟ้า โดยเป็นการส่ง SMS จากโทรศัพท์มือถือ เพื่อเปิด - ปิดอุปกรณ์ไฟฟ้าได้แล้วครับ