SIM900 GPRS
#include <BlynkSimpleUserDefined.h> #include <SoftwareSerial.h> // SIM900 Shield Serial Pins SoftwareSerial SIM900(7, 8); // You should get Auth Token in the Blynk App. // Go to the Project Settings (nut icon). char auth[] = "4fadeMYTOKENee6cc96eded52d"; #define ip_address "AT+CIPSTART=\"TCP\",\"8.8.8.8\",\"8442\"" bool connected = false; // This function is used by Blynk to receive data size_t BlynkStreamRead(void* buf, size_t len) { return Serial.readBytes((byte*)buf, len); } // This function is used by Blynk to send data size_t BlynkStreamWrite(const void* buf, size_t len) { return Serial.write((byte*)buf, len); } void setup() { // Setup your connection here. pinMode(9, OUTPUT); Serial.begin(19200); // for serial monitor Serial.println("Powering on GPRS Shield."); SIM900.begin(19200); // Serial for GSM shield SIM900poweron(); // turn on shield sendCommand("AT", "OK", 1000); //Wake up modem with an AT command if(sendCommand("AT", "OK", 1000) == 1){ Serial.println("SIM900 started"); } gprs(); Blynk.begin(auth); do { connected = Blynk.connect(); } while (!connected); } void loop() { Blynk.run(); // Make sure that Blynk.run() is called // only when the connection is established if (connected) { // Okay, handle Blynk protocol bool hasIncomingData = (Serial.available() > 0); // Tell Blynk if it has incoming data // (this allows to skip unneeded BlynkStreamRead calls) if (!Blynk.run(hasIncomingData)) { // Error happened. No action for serial. } } } void gprs() { //Wake up modem with two AT commands sendCommand("AT", "OK", 1000); sendCommand("AT", "OK", 2000); sendCommand("AT+CIPSHUT", "SHUT OK", 2000); // Check if it's currently registered network if(sendCommand("AT+CREG?","+CREG: 0,1",2000)){ Serial.println("Connected to the home cell network"); } else{ Serial.println("Not connected to home cell network"); delay(10000); } Serial.println("Attaching to Packet Service"); if(sendCommand("AT+CGATT=1","OK",3000)){ Serial.println("Attached to Packet Service"); } else{ Serial.println("Unable to attach to Packet Service"); delay(10000); } Serial.println("Setting APN"); if(sendCommand("AT+CSTT=\"epc.tmobile.com\"","OK",3000)){ Serial.println("APN Set"); } else{ Serial.println("Unable to set APN"); delay(10000); } Serial.println("Starting GPRS Connection"); if(sendCommand("AT+CIICR","OK",5000)){ Serial.println("GPRS Connection Established"); delay(1000); sendCommand("AT+CIFSR", "OK", 1000); } else{ Serial.println("Unable to start GPRS connection"); delay(10000); } Serial.println("Establishing TCP Connection"); SIM900.println(ip_address); delay(1000); Serial.println("Connected to server"); } void SIM900poweron() // Software equivalent of pressing the GSM shield "power" button { //Wake up modem with an AT command sendCommand("AT", "OK", 1000); if(sendCommand("AT", "OK", 2000) == 0){ digitalWrite(9, HIGH); delay(1000); digitalWrite(9, LOW); delay(7000); } } int sendCommand(char* ATcommand, char* expected_answer, unsigned int timeout){ int answer=0; int responsePos=0; char response[100]; unsigned long previous; memset(response, '\0', 100); // Clears array delay(100); while( SIM900.available() > 0) SIM900.read(); // Clean the input buffer SIM900.println(ATcommand); // Send the AT command responsePos = 0; previous = millis(); // this loop waits for the answer do{ // if there are data in the UART input buffer, reads it and checks for the asnwer if(SIM900.available() != 0){ response[responsePos] = SIM900.read(); responsePos++; // check if the desired answer is in the response of the module if (strstr(response, expected_answer) != NULL) { answer = 1; } } // Waits for the asnwer with time out }while((answer == 0) && ((millis() - previous) < timeout)); return answer; }