#include <TinyGPS++.h> // Library TinyGPS++
#include <SoftwareSerial.h> // Library SoftwareSerial
// Define pins for GPS
int GPS_RXPin = 8; // Connect to TX of GPS
int GPS_TXPin = 9; // Connect to RX of GPS
int GPSBaud = 9600; // Default baud rate for GPS
// Create TinyGPS++ object
TinyGPSPlus gps;
// Create SoftwareSerial object for GPS
SoftwareSerial gpsSerial(GPS_RXPin, GPS_TXPin);
// Define pins for SIM800L
#define SIM800L_RX 3
#define SIM800L_TX 2
SoftwareSerial sim800L(SIM800L_RX, SIM800L_TX);
// URL to send data to server
String serverURL = "http://tesgpslakatan.000webhostapp.com";
void setup() {
Serial.begin(9600); // Start serial communication at 9600 baud rate
gpsSerial.begin(GPSBaud); // Start serial communication with GPS
sim800L.begin(9600); // Start serial communication with SIM800L
Serial.println("Initializing SIM800L...");
delay(10000); // Wait for SIM800L to be ready
if (sendATcommand("AT", "OK", 2000)) {
Serial.println("SIM800L is ready");
} else {
Serial.println("Failed to communicate with SIM800L");
while (true); // Halt execution if SIM800L fails
}
}
void loop() {
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}
if (gps.location.isValid()) {
String lat = String(gps.location.lat(), 6);
String lng = String(gps.location.lng(), 6);
String altitude = String(gps.altitude.meters());
String date = String(gps.date.value());
String time = String(gps.time.value());
Serial.println("GPS signal acquired");
Serial.print("Latitude: "); Serial.println(lat);
Serial.print("Longitude: "); Serial.println(lng);
Serial.print("Altitude: "); Serial.println(altitude);
Serial.print("Date: "); Serial.println(date);
Serial.print("Time: "); Serial.println(time);
sendGpsToServer(lat, lng, altitude, date, time);
delay(60000); // Wait 60 seconds before sending data again
} else {
Serial.println("Waiting for GPS signal...");
delay(1000); // Wait 1 second before checking again
}
}
void sendGpsToServer(String lat, String lng, String altitude, String date, String time) {
String data = "lat=" + lat + "&lng=" + lng + "&alt=" + altitude + "&date=" + date + "&time=" + time;
if (sendATcommand("AT+CGATT=1", "OK", 2000) &&
sendATcommand("AT+SAPBR=3,1,\"Contype\",\"GPRS\"", "OK", 2000) &&
sendATcommand("AT+SAPBR=3,1,\"APN\",\"internet\"", "OK", 2000) &&
sendATcommand("AT+SAPBR=1,1", "OK", 2000)) {
sendATcommand("AT+HTTPINIT", "OK", 2000);
sendATcommand("AT+HTTPPARA=\"CID\",1", "OK", 2000);
sim800L.print("AT+HTTPPARA=\"URL\",\"");
sim800L.print(serverURL);
sim800L.println("\"");
sendATcommand("", "OK", 2000);
sendATcommand("AT+HTTPPARA=\"CONTENT\",\"application/x-www-form-urlencoded\"", "OK", 2000);
sim800L.print("AT+HTTPDATA=");
sim800L.print(data.length());
sim800L.println(",10000");
delay(100);
sim800L.println(data);
delay(10000);
sendATcommand("AT+HTTPACTION=1", "200", 30000);
sendATcommand("AT+HTTPTERM", "OK", 2000);
} else {
Serial.println("Failed to configure GPRS connection");
}
}
bool sendATcommand(const char* ATcommand, const char* expected_response, unsigned int timeout) {
sim800L.println(ATcommand);
unsigned long startTime = millis();
String response = "";
while (millis() - startTime < timeout) {
if (sim800L.available()) {
response += sim800L.readStringUntil('\n');
if (response.indexOf(expected_response) != -1) {
return true;
}
}
}
Serial.print("Timeout waiting for response: ");
Serial.println(response);
return false;
}