#define TINY_GSM_MODEM_SIM800
#include <WiFi.h>
#include "ThingSpeak.h"
#include <TinyGPS++.h>
#include <TinyGSM.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WebServer.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SDA_PIN 21
#define SCL_PIN 22
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
TinyGPSPlus gps;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Optional: Use Static IP (Uncomment if needed)
/*
IPAddress local_IP(192, 168, 1, 100);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress primaryDNS(8, 8, 8, 8);
IPAddress secondaryDNS(8, 8, 4, 4);
*/
WiFiClient client;
WebServer server(80);
unsigned long channelNumber = 2842883;
const char* writeAPIKey = "L1C5GZXEZHOL8IDX";
#define GPS_RX_PIN 16
#define GPS_TX_PIN 17
HardwareSerial gpsSerial(2);
#define GSM_RX_PIN 26
#define GSM_TX_PIN 27
HardwareSerial gsmSerial(1);
TinyGsm modem(gsmSerial);
unsigned long previousMillis = 0;
const long interval = 15000; // 15 seconds for ThingSpeak free account
void connectWiFi() {
Serial.println("Connecting to WiFi...");
WiFi.disconnect(true); // Reset WiFi to clear previous failures
delay(1000);
// Uncomment if using Static IP
// WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS);
WiFi.begin(ssid, password);
unsigned long startAttemptTime = millis();
const unsigned long timeout = 10000; // 10-second timeout
while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < timeout) {
delay(500);
Serial.print(".");
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nConnected to WiFi");
} else {
Serial.println("\nFailed to connect to WiFi. Restarting...");
ESP.restart(); // Restart ESP if WiFi fails
}
}
void setup() {
Serial.begin(115200);
gpsSerial.begin(9600, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
gsmSerial.begin(9600, SERIAL_8N1, GSM_RX_PIN, GSM_TX_PIN);
connectWiFi();
ThingSpeak.begin(client);
Serial.println("Initializing GSM module...");
modem.init();
delay(3000);
if (!modem.restart()) {
Serial.println("Failed to initialize GSM modem");
} else {
Serial.println("GSM modem ready");
}
Wire.begin(SDA_PIN, SCL_PIN);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("SSD1306 allocation failed");
for (;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(10, 10);
display.println("GPS Tracker Ready");
display.display();
server.on("/", handleRoot);
server.on("/location", sendLocation);
server.begin();
Serial.println("Web server started.");
}
void loop() {
server.handleClient();
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (gps.location.isValid()) {
float latitude = gps.location.lat();
float longitude = gps.location.lng();
Serial.print("Latitude: ");
Serial.println(latitude);
Serial.print("Longitude: ");
Serial.println(longitude);
display.clearDisplay();
display.setCursor(10, 10);
display.println("GPS Location:");
display.setCursor(10, 30);
display.print("Lat: ");
display.println(latitude, 6);
display.setCursor(10, 45);
display.print("Lon: ");
display.println(longitude, 6);
display.display();
if (WiFi.status() == WL_CONNECTED) {
ThingSpeak.setField(1, latitude);
ThingSpeak.setField(2, longitude);
int result = ThingSpeak.writeFields(channelNumber, writeAPIKey);
if (result == 200) {
Serial.println("Data sent to ThingSpeak successfully");
} else {
Serial.print("Error sending data to ThingSpeak: ");
Serial.println(result);
}
} else {
Serial.println("WiFi disconnected! Reconnecting...");
connectWiFi(); // Reconnect WiFi if lost
}
} else {
Serial.println("Waiting for valid GPS signal...");
}
}
}
void handleRoot() {
server.send(200, "text/html", "<html><body><h1>ESP32 GPS Tracker</h1><p>View real-time location <a href='/location'>here</a>.</p></body></html>");
}
void sendLocation() {
if (gps.location.isValid()) {
String json = "{";
json += "\"latitude\": " + String(gps.location.lat(), 6) + ",";
json += "\"longitude\": " + String(gps.location.lng(), 6);
json += "}";
server.send(200, "application/json", json);
} else {
server.send(200, "application/json", "{\"error\": \"No valid GPS signal\"}");
}
}
Loading
esp32-devkit-v1
esp32-devkit-v1