/* GSM Module With PIR Sensor Coded By Motheeb Alkhashram * this code will check the motion around the sensor and make a call to your phone to take an action. * also, you can SMS the device to activate and turn on or off an LED * التحكم بواسطة قطعة الجوال وح حساس الحركة* يقوم الكود التالي باستشعار الحركة حول الجهاز والاتصال بهاتفك للتأكد من خطورة المحيط* ايضا يوفر لك ارسال رسالة قصيرة بامكانك التحكم بضوء الليد* * * ************** Some Code was used from: ***************************************** * making sense of the Parallax PIR sensor's output * @author: Kristian Gohlke @date: 3. September 2006 * released under a creative commons "Attribution-NonCommercial-ShareAlike 2.0" license * Also GSM Manufacturer. * ************** Some Code was used from: ***************************************** */ // Software Serial Library //ارفاق مكتبة السوفتوير سيريال #include // Setup pin 2 and 3 as RX, TX for Software Serial //وضع منفذ 2 و 3 كمدخل و مخرج للتواصل بقطعة شبكة الجوال SoftwareSerial GSerial(2, 3); // RX, TX //Defining Variables // تحديد المتغيرات //the time we give the sensor to calibrate (10-60 secs according to the datasheet) // الوقت المسموح لحساس الحركة لتجهيز الاعدادات الذاتية int calibrationTime = 10; //the time when the sensor outputs a low impulse // تعريف حاوية لحفظ الوقت عند انعدام الحركة long unsigned int lowIn; //the amount of milliseconds the sensor has to be low //before we assume all motion has stopped // تحديد الوقت اللازم لأنتظار الحركة القدامة قبل الجزم بإنعدام الحركة long unsigned int pause = 5000; // the use for these variables will be defined in the LOOP Function //سيتم تعريف فوائد المتغيرين في الدالة الاساسية boolean lockLow = true; boolean takeLowTime; //the digital pin connected to the PIR sensor's output // تحديد منفذ 7 لأستقبال اشارات حساس الحركة int pirPin = 7; // This is the pin for the connected pir LED //تحديد منفذ 9 باسم pirled int pirled = 9; // This is the pin for the connected SMS LED //تحديد منفذ 10 باسم txtled int txtled = 10; //************** WARNING: put value = 0 if you don't want the GSM to delete any msgs from SIM Card********************* //**************تحذير: ضع القيمة التالية 0 اذا لم ترد مسج اي رسالة نصية متواجدة في الذاكرة ****************** // the number of msgs deleted after recieving your control SMS this is to not max your SIM memory // تحديد عدد الرسائل الممسوحة عند استلام رسالة تحكم لكي لا تمتلئ ذاكرة الشريحة #define NUM_MSGS_DELETE 5 //recive buffer max number of char //تحديد حجم حاوية القراءة لقطعة الجوال #define MAXCHAR 200 //recive gsm module back signal // تعريف حاوية القراءة بالحجم المعطى سابقا char buff[MAXCHAR]; //recive index // متغير يساعد في ترقيم حاوية القراءة int j = 0; //track time for the GSM to response // متغير يساعد في وضع مؤقت للأجابة int g_timeout = 0; // AT COMMANDS // بعض الاوامر من لغة AT //////////////////////////////// Insert your Data ////////////////////////////////////////////// ////////////////////////////////////////////// ضع معطياتك هنا //////////////////////////////// char CPIN[] = "AT+CPIN=\"0000\""; // pin code if required اذا وجد الرقم السري #define SEND_MSG_NUM "AT+CMGS=\"0503000000\"\r\n" // Phone Number to Receive SMS MSG رقم المستقبل للرسالة النصية #define SEND_MSG_TXT "Motheebotonics ! GSM is Working" // SMS TEXT DATA محتوى الرسالة النصية #define CALL_NUM "ATD0503000000;\r\n" // Emergency Call Number For Motion رقم الاتصال عند حدوث حركة //////////////////////////////// Insert your Data ////////////////////////////////////////////// ////////////////////////////////////////////// ضع معطياتك هنا //////////////////////////////// // clean buffer // دالة تعمل على مسح البيانات القديمة من جاوية القراءة void clearBuff(void) { for (j = 0; j <= MAXCHAR; j++) { buff[j] = 0x00; } j = 0; } // reads the input from GSM and saves it to buffer //تعمل هذه الدالة لقراءة المعطايات من قطعة الجوال و تخزين البيانات في حاوية القراءة int readSerial(char result[]) { int i = 0; //delay(200); while (GSerial.available() > 0) { char inChar = GSerial.read(); Serial.write(inChar); if (inChar != '\r') { result[i] = inChar; i++; } if (i >= MAXCHAR - 1 ) { result[i] = '\0'; GSerial.flush(); return 0; } } result[i] = '\0'; GSerial.flush(); return 0; } // handles the wait for a response from GSM that exactly match the provided String // هذه الدالة تعمل على انتظار قطعة الجوال للتزويدها ببيانات مطابقة للكلمة المرفقة عند النداء للدالة int Hand(char *s) { clearBuff(); //delay(300); readSerial(buff); if (strstr(buff, s) != NULL) { g_timeout = 0; clearBuff(); return 1;// in case of a match return 1 في حال المطابقة جاوب بالرقم 1 } if (g_timeout > 50) { g_timeout = 0; return -1; // in case of a time out return -1 في حال مضي الوقت من دون العثور على مطابقة ارجع الرقم } g_timeout++; return 0; // in case of a not match add 1 to the time out and return 0 في حال عدم التطابق اضف 1 لعدد المحاولات و ارجع الرقم 0 } // setup for GSM using AT Commands // تعمل الدالة على تجهيز قطعة شبكة الجوال باستغدام اوامر ال AT void AT(void) { clearBuff(); GSerial.println("ATE0"); //check if connected to GSM تاكد من اتصالك بالقطعة GSerial.flush(); Serial.println("ATE0"); delay(500); readSerial(buff); while (strstr(buff, "OK") == NULL) { clearBuff(); GSerial.println("ATE0"); GSerial.flush(); Serial.println("ATE0"); delay(500); readSerial(buff); } Serial.println("Module is Working"); ////////////////////////////UNCOMMENT BELOW IF SIM Require PIN Number///////////////////////// ///////////////////////استخدم الكود بالاسفل عند وجود رقم سري للشريحة///////////////////////////// /* clearBuff(); GSerial.println(CPIN); // put pin number ضع الرقم السري GSerial.flush(); Serial.println(CPIN); delay(500); readSerial(buff); while(strstr(buff,"OK")==NULL) { clearBuff(); GSerial.println(CPIN); GSerial.flush(); Serial.println(CPIN); delay(500); readSerial(buff); } Serial.println("PIN Done"); */ ////////////////////////////////////////////////////////////////////////////////////////// while (1) { clearBuff(); GSerial.println("AT+CREG?"); // Network registration الاتصال بالشبكة GSerial.flush(); delay(500); readSerial(buff); // check if 1 (home network) or 5 (roaming) تاكد اذا كان متصل بالشبكة داخلي او تجوال if ((strstr(buff, "0,1") != NULL) || (strstr(buff, "0,5") != NULL)) { clearBuff(); break; } else { delay(1000); } } clearBuff(); GSerial.println("AT+CMGF=1\r");// set SMS to TEXT MODE ضع خدمة الرسائل بوضع الرسائل النصية delay(500); while (Hand("OK") == 0); Serial.println("SMS TEXT MODE Done"); clearBuff(); GSerial.println("AT+CPMS=\"SM\"\r\n");// set memory to SIM card حدد ذاكرة الشريحة كموضع التخزين للرسائل delay(500); while (Hand("OK") == 0); return; } // this function is an extra, you can use it if needed لم استخدم هذه الدالة ولكن هي متواجده اذا اردت استخدامها // sends your text msg to the specified phone number above // تعمل الدالة على ارسال رسالة نصية الى الجوال المحدد في البيانات المزودة بالاعلى void send_txt() { clearBuff(); GSerial.println("AT+CMGF=1\r"); delay(500); while (Hand("OK") == 0); clearBuff(); GSerial.println(SEND_MSG_NUM); delay(500); while (Hand(">") == 0); GSerial.println(SEND_MSG_TXT); delay(1000); while (Hand("OK") == 0); return; } // calls your phone provided above in case of a detected motion // تقوم هذه الدالة بالاتصال بهاتفك الجوال المزود بالاعلى عند حدوث اي حركة بجانب الجهاز void send_call() { clearBuff(); GSerial.println("AT+CPAS\r");// check phone status before calling twice تاكد من عدم وجود مكالمة GSerial.flush(); delay(500); if (Hand("0") != 1) { Serial.println("Already calling"); return; } GSerial.println(CALL_NUM); delay(2000); while (Hand("OK") == 0); delay(3000); return; } // reads your text and checks if it contains ON or OFF to control LED // تقوم هذه الدالة بقراءة رسالتك عند تواجدها و معرفة وجود امر للتحكم في ضوء الليد void read_txt(void) { clearBuff(); GSerial.println("AT+CMGL=\"REC UNREAD\"\r"); // an AT command to show all unread msgs and convert them to read امر يقوم بجمع كل الرسائل غير المقروءة وعرضها GSerial.flush(); delay(500); clearBuff(); readSerial(buff); if ((strstr(buff, "ON") != NULL)) { // is there ON in SMS? هل يوجد امر تشغيل بالرسالة؟ digitalWrite(txtled, HIGH); // if yes then turn ON اذا وجد امر التشغيل اضئ الليد delete_msgs(); // delete all msgs مسح جميع الرسائل return; } if ((strstr(buff, "OFF") != NULL)) { // is there OFF in SMS? هل يوجد امر اطفاء بالرسالة؟ digitalWrite(txtled, LOW); // if yes then turn LED OFF ان وجد اذا اطفئ الليد delete_msgs(); // delete all msgs مسح جميع الرسائل return; } return; } // delete number of msgs specified earlier // تقوم هذه الدالة بمسح العدد المحدد سابقا من الرسائل void delete_msgs() { int i; Serial.println("Deleting ALL MSGs"); for (i = 1; i < NUM_MSGS_DELETE + 1; i++) { GSerial.print("AT+CMGD="); GSerial.print(i); GSerial.print("\r\n"); delay(10); } } //******************** SETUP Arduino **************** //***************** تجهيز الاردوينو********************** void setup() { Serial.begin(9600); //Set BaudRate to default baud rate 9600 for both computer and GSM GSerial.begin(9600); // وضع سرعة نقل البيانات الى 9600 للكمبيوتر وقطعة الجوال GSerial.setTimeout(5000);// set Serial timeout تحديد وقت محدد لمنفذ الاتصال pinMode(pirPin, INPUT); pinMode(pirled, OUTPUT); pinMode(txtled, OUTPUT); digitalWrite(pirPin, LOW); digitalWrite(txtled, LOW); digitalWrite(pirled, LOW); //give the sensor some time to calibrate // وضع وقت لمعايرة حساس الحركة Serial.print("calibrating sensor "); for (int i = 0; i < calibrationTime; i++) { Serial.print("."); delay(1000); } Serial.println("SENSOR ACTIVE"); delay(50); AT(); Serial.println("GSM ACTIVE"); } //******************** Main LOOP **************** //***************** الدالة الرئيسية ******************* void loop() { // check if GSM receive any SMS, if so, then read it تأكد من استلام اي رسالة وأقراها if (GSerial.available() > 0) { Serial.println("check available"); delay(2000); clearBuff(); GSerial.println("AT+CPAS\r");// check phone status before calling twice تاكد من عدم وجود مكالمة GSerial.flush(); delay(500); if (Hand("0") != 1) { Serial.println("Already calling"); } else{ read_txt(); } } if (digitalRead(pirPin) == HIGH) { digitalWrite(pirled, HIGH); //motion detected, turn on LED حدثت حركة انر الليد if (lockLow) { //makes sure we wait for a transition to LOW before any further output is made: // تأكد من انعدام الحركة وليست مستمرة قبل الاتصال اكثر من مره في نفس الوقت lockLow = false; Serial.println("---"); Serial.print("motion detected at "); Serial.print(millis() / 1000); Serial.println(" sec"); delay(100); send_call(); // calling for emergency الاتصال عند وجود الحركة } takeLowTime = true; } if (digitalRead(pirPin) == LOW) { if (takeLowTime) { lowIn = millis(); //save the time of the transition from high to LOW احسب وقت انعدام الحركة takeLowTime = false; } //if the sensor is low for more than the given pause, عند انعدام الحركة لمدة محددة بالاعلى //we assume that no more motion is going to happen بإمكاننا الجزم بانعدام الحركة if (!lockLow && millis() - lowIn > pause) { //makes sure this block of code is only executed again after يتأكد الاردوينو هنا من عدم تشغيل الكود التالي الا عند انتهاء الحركة كليا //a new motion sequence has been detected lockLow = true; Serial.print("motion ended at "); Serial.print((millis() - pause) / 1000); Serial.println(" sec"); delay(100); digitalWrite(pirled, LOW);//turn off led اطفئ الليد عند انعدام الحركة } } delay(1000); }