এই টিউটোরিয়ালে আমরা দেখব কিভাবে এসএমএস পাঠিয়ে একটি বাল্বকে অন-অফ করা যায়। এই প্রজেক্টের বাস্তব প্রয়োগ হতে পারে বাইরে যাবার আগে ঘরের ফ্যান-লাইট অফ করতে ভুলে গেলেও পরে এসএমএস পাঠিয়ে অফ করা। বাসায় না থাকলেও পানির মোটর চালু করা, বাসায় বসেই অফিসের কোনো লাইট বা ডিসপ্লে নিয়ন্ত্রন ইত্যাদি আরও অনেককিছু।
প্রয়োজনীয় যন্ত্রপাতিঃপ্রয়োজনীয় যন্ত্রপাতি | পরিমান |
ATmega16 | 1 |
SIM900A kit | 1 |
Digital AC voltage dimmer | 1 |
Light bulb with holder | 1 |
Power cable | 1 |
Female to female jumpers | 8 |
Male header | 1 |
Mobile Sim | 1 |
প্রোগ্রামিং এবং সার্কিট সেটআপের জন্য আমরা ব্যবহার করেছি AVR Trainer kit. আপনারা যেকোনো প্রোগ্রামার ব্যবহার করে ব্রেডবোর্ডেও সার্কিট সেটআপ করতে পারেন।
কার্যপ্রনালীঃএক্সপেরিমেন্টটি শুরু করার আগে বেশকিছু বিষয় জানা প্রয়োজন। SIM900A এর ডেটাশিট এবং AT command গুলো সম্পর্কে ভালোভাবে জানতে হবে। বেসিক AT commandগুলো নিয়ে আমরা ইতোমধ্যে আমাদের মাইক্রোকন্ট্রোলারের সাথে জিএসএম মডেম সংযুক্ত করা-পর্ব ১ টিউটোরিয়ালে আলোচনা করা হয়েছে। SIM900A কিট এর পিনআউট সম্পর্কে বিশদভাবে আলোচনা করা হয়েছে উল্লেখিত টিউটোরিয়ালের ২য় পর্বে।
SIM900A এর একটি পিনের নাম RI. এই পিনটি বাই ডিফল্ট হাই থাকে। যখন মডেমটি কোনো এসএমএস রিসিভ করে তখন পিনটি ১২০ মিলিসেকেন্ডের জন্য লো হয়, তারপর আবার হাই হয়। কাজেই আমরা মাইক্রোকন্ট্রোলারের কোনো একটি ইন্টারাপ্ট পিনের সাথে যদি এই RI পিনকে কানেক্ট করে রাখি তাহলে পিনটি হাই থেকে লো হওয়ামাত্রই একটি ইন্টারাপ্ট জেনারেট হবে। এবং আমরা বুঝতে পারব যে একটি নতুন এসএমএস এসেছে।RI পিনটি SIM900A kit -এ খুব ছোট করে ring নামে চিহ্নিত করা আছে। এই পিনটি ব্যবহার করতে হলে আমাদেরকে এই পিনে একটি মেল কানেকটর সল্ডার করে নিতে হবে। তারপর আমরা এই ring পিনকে কানেক্ট করব মাইক্রোকন্ট্রোলারের PD2 তথা INT এর সাথে।
এসএমএস পড়তে যে কমান্ডটি ব্যবহার করা হয় যেটি হল AT+CMGR। এসএমএস রিড করার সময় বিশেষভাবে একটি কথা মনে রাখা প্রয়োজন। সিম মেমোরি বেশকিছু সেগমেন্টে বিভক্ত। যখন নতুন কোনো এসএমএস আসে তখন সেটা যে সিমের কোন সেগমেন্টে গিয়ে জমা হবে তা জানার কোনো উপায় নেই।
AT+CMGR=1,0 লিখলে সিমের এক নাম্বার লোকেশনে থাকা মেসেজটি রিড হবে।
AT+CMGDA=\”DEL ALL\” কমান্ডের মাধ্যমে সকল এসএমএস ডিলিট করে দেওয়া হয়। এই এক্সপেরিমেন্টের জন্য যে সিমটি ব্যবহার করা হবে সেই সিমের মেমোরিতে কোনো মেসেজ থাকা চলবে না। নতুন কোনো মেসেজ আসলে সেটি 1 নং লোকেশনে জমা হবে। মেসেজে on লেখা থাকলে মাইক্রোকন্ট্রোলারের PC7 পিনটি হাই হবে এবং এর সাথে ডিমার দ্বারা সংযুক্ত বাতি জ্বলবে। মেসেজে Off লেখা থাকলে PC7 পিনটি লো হবে এবং বাতিটি নিভে যাবে। মেসেজ অনুযায়ী কাজ সম্পন্ন করার পর মেসেজটি ডিলিট হয়ে যাবে। যাতে করে পরবর্তীতে আসা মেসেজটিও 1 নং লোকেশনেই জমা হয়। মাইক্রোকন্ট্রোলারের PC0 পিনকে আমরা এই এক্সপেরিমেন্টে ব্যবহার করেছি ইন্ডিকেটর পিন হিসেবে। ইন্ডিকেটর পিনের সাথে সংযুক্ত এলইডি নতুন এসএমএস আসামাত্রই টোগল (অন থেকে অফ কিংবা অফ থেকে অন হবে।) এক্সপেরিমেন্টটি সফলভাবে করার জন্য অবশ্যই মোবাইলের নেটওয়ার্ক ভালো থাকতে হবে।
সার্কিট কানেকশনঃ
ATmega16 মাইক্রোকন্ট্রোলারকে ট্রেনার কিটের জিফ সকেটে বসাই। SIm900A কিটের সিম সকেটে সিম বসাই।
SIM900A এবং ATmega16 এর মধ্যে নিচের কানেকশনটি সম্পন্ন করি।
ATmega16 | SIM900A |
VCC | VCC |
GND | GND |
Tx | Rx |
Rx | Tx |
PD2 | RING |
Arduino Uno R3 | Digital AC voltage dimmer |
VCC | 5V |
GND | GND |
Relay | PC7 |
কোড লিখতে ব্যবহার করা হয়েছে MIKroC pro for AVR. ইউজার্ট এবং স্ট্রিং এর জন্য মাইক্রোসির ইন বিল্ট লাইব্রেরি থাকায় কোড তুলনামূলকভাবে ছোট এবং সহজবোধ্য হয়েছে। নিচের কোডটি মাইক্রোসিতে কপি-পেস্ট করুন এবং কম্পাইল করে হেক্স ফাইলটি মাইক্রোকন্ট্রোলারে আপলোড করুন।
একটি সুখবর দিই, আপনি চাইলে টাকা বাঁচানোর জন্য এসএমএসের বদলে মিসড কলের মাধ্যমেও লোড অন-অফ করতে পারেন এই একই পদ্ধতিতে। SIM900A কিটের ring পিন কল আসলেও লো হয়।
char output[100]; //Received message will be stored here void main() { Delay_ms(1000); //Time needed for the modem for initialization UART1_Init(9600); //Baud rate 9600 UART1_Write_Text("AT"); //AT command mode started UART_Write(0x0D); //CR UART_Write(0x0A); //LF Delay_ms(1000); UART1_Write_Text("AT+CMGF=1"); //select text format of sms UART_Write(0x0D); //CR UART_Write(0x0A); //LF Delay_ms(100); DDD2_bit = 0; //PD2=INT0 in as input DDC0_bit = 1; //PC0 pin as output. Indicator LED attached with this pin. DDC7_bit = 1; // PC7 as output. Load will be conencted to this pin via prorammable AC dimmer ISC01_bit = 1; // Set INT0 for falling edge INT0_bit = 1; // INT0 interrupt enable SREG_I_bit =1; // Enable Global Interrupt PORTC0_bit = 0; //PC0 pin puller down by default while(1){} // infinite loop } void EX_INT0_ISR() iv IVT_ADDR_INT0 //Interrupt function { PORTC0_bit =~ PORTC0_bit; //Toggle the indicator LED Delay_ms(2000); //delay UART1_Write_Text("AT+CMGR=1,0"); //Read sms at sim location 1 UART_Write(0x0D); //CR UART_Write(0x0A); //LF if (UART1_Data_Ready() == 1) { // if data is received UART1_Read_Text(output, "OK", 200); // reads text until 'OK' is found Delay_ms(100); //delay if(strstr(output,"On")!=0) //Check if there is ON written in the message { PORTC7_bit = 1; //Turn on the load } else if(strstr(output,"Off")!=0 ) // Check if there is OFF written in the message { PORTC7_bit = 0; //Turn off the load } } UART1_Write_Text("AT+CMGDA=\"DEL ALL\""); //Delete all messages UART_Write(0x0D); //CR UART_Write(0x0A); //LF Delay_ms(1000); //Delay INTF0_bit = 1; // Interrupt flag bit cleared. }]]>