Modem addon to give Call Display
Usefull: USR AT COMMANDS
Adapter Used: RS232
The following code, will grab the caller ID and put it in to a veriable to be used later.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////// Arduino Caller ID //////// Author: Jim A //////// Date: 2/28/2014 //////// Version: 1.00 //////// Platform: Arduino Mega 2560 //////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////byte buffer[30]; //This will be filled with the information returned in caller ID. int counter = 0; //Used to step through the bufferint counter2 = 0; //User to dump the buffer in to the veriableboolean CaptureDate = 0; //Capture Date mode, used to enter the correct IF statement.boolean CaptureTime = 0; //Capture Time mode, used to enter the correct IF statement.boolean CaptureName = 0; //Capture Name mode, used to enter the correct IF statement.boolean CaptureNMBR = 0; //Capture Number mode, used to enter the correct IF statement.byte c; //Current byte returned from serial1byte w1; //Sliding window, last possistion before the 7 character window drops the characterbyte w2; //Sliding windowbyte w3; //Sliding windowbyte w4; //Sliding windowbyte w5; //Sliding windowbyte w6; //Sliding windowbyte w7; //Sliding window, first slot in the windowvoid setup() { Serial1.begin(38400); //The Modem I am using is a 33.6 USR Sportster and needed 38400BAUD Serial.begin(38400); //This is the comunication with the local serial port, Felt no reason to have a baud miss match. ModemInit(); //Function that sets all the veriables for the modem. See http://jim.akesons.com for more info. delay(100); Serial.println("Done Modem init"); //Just used for Diagnostics.}void loop(){ while(Serial1.available() > 0) //If serial data from the modem is available { c = Serial1.read(); //Read that data in to the veriable. w1 = w2; //Sliding window, drops what was window 1 and updates it with that is in window 2. w2 = w3; //sliding window w3 = w4; //sliding window w4 = w5; //sliding window w5 = w6; //sliding window w6 = w7; //sliding window w7 = c; //sliding window updating with the most recent information. if (CaptureDate == 1) { //Flag turned on meaning Date data has been detected. if(c==13){ //If end of line then dump to screen Serial.print("Date: "); //Just for diagnostics. counter2 = 0; while (counter2 <= counter) { Serial.write(buffer[counter2]); //write the content of the buffer to serial, this is for diagnostics. counter2++; } Serial.println(" "); //Just to dump a charage return at the end of the line, again diagnostics. CaptureDate = 0; //Reset the veriables as this operation is completed. counter = 0; } else { //If not end of line buffer[counter] = w7; counter++; } } if (CaptureTime == 1) { //Flag turned on meaning Date data has been detected. if(c==13){ //If end of line then dump to screen Serial.print("Time: "); counter2 = 0; while (counter2 <= counter) { Serial.write(buffer[counter2]); counter2++; } Serial.println(" "); CaptureTime = 0; counter = 0; } else { //If not end of line buffer[counter] = w7; counter++; } } if (CaptureName == 1) { //Flag turned on meaning Date data has been detected. if(c==13){ //If end of line then dump to screen Serial.print("Name: "); counter2 = 0; while (counter2 <= counter) { Serial.write(buffer[counter2]); counter2++; } Serial.println(" "); CaptureName = 0; counter = 0; } else { //If not end of line buffer[counter] = w7; counter++; } } if (CaptureNMBR == 1) { //Flag turned on meaning Date data has been detected. if(c==13){ //If end of line then dump to screen Serial.print("NMBR: "); counter2 = 0; while (counter2 <= counter) { Serial.write(buffer[counter2]); counter2++; } Serial.println(" "); CaptureNMBR = 0; counter = 0; } else { //If not end of line buffer[counter] = w7; counter++; } } else if(w1==68 and w2==65 and w3==84 and w4==69 and w5==32 and w6==61 and w7==32) {CaptureDate = 1;} //If "DATE = " is detected.... else if(w1==84 and w2==73 and w3==77 and w4==69 and w5==32 and w6==61 and w7==32) {CaptureTime = 1;} //If "TIME = " is detected.... else if(w1==78 and w2==65 and w3==77 and w4==69 and w5==32 and w6==61 and w7==32) {CaptureName = 1;} //IF "NAME = " is detected.... else if(w1==78 and w2==77 and w3==66 and w4==82 and w5==32 and w6==61 and w7==32) {CaptureNMBR = 1;} //IF "NMBR = " is detected.... }}void ModemInit() { Serial1.println("AT&D0"); // Ignore DTR delay(500); Serial1.println("ATH0"); //Hangup delay(500); Serial1.println("ATZ0"); // Reset Modem delay(500); Serial1.println("AT&C0"); // Ignore Carier Detect delay(500); Serial1.println("at#cid=1"); // Enable CALLER ID delay(500);}//Sample Code just to talk back and forth to the modem, through the RS232 adapter.//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////// MDM Test Code //////// Author: Jim A & Mark M //////// Date: 2/28/2014 //////// Version: 1.00 //////// Platform: Arduino Mega 2560 //////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////SERIAL PASS THOUGH, FOR MODEM TESTING.//THIS IS ALL BASED ON A USR SPORTSTER 33.6 FaxModem 0413void setup() { Serial1.begin(38400); Serial.begin(38400); ModemInit(); delay(100); DialModem("4037309927");}void loop() {byte c;if (Serial1.available() > 0) { while(Serial1.available() > 0) { c = Serial1.read(); Serial.write(c); } } if (Serial.available() > 0) { while(Serial.available() > 0) { c = Serial.read(); Serial1.write(c); } } }void DialModem(String PNum) { Serial1.print("ATDT"); Serial1.println(PNum);}void ModemInit() { Serial1.println("AT&D0"); // Ignore DTR delay(2000); Serial1.println("ATH0"); //Hangup delay(2000); Serial1.println("ATZ0"); // Reset Modem delay(2000); Serial1.println("AT&C0"); // Ignore Carier Detect delay(2000); Serial1.println("at#cid=1"); // Enable CALLER ID delay(2000);//ATDT//2505734220 ////CALLER ID EXAMPLE RECIEVED FROM MODEM://RING////DATE = 0228//TIME = 2330//NAME = Alberta//NMBR = 4034639546}