extern "C" int lwip_hook_ip6_input(void *p) { return 0; }
#include <TinyGPS++.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <time.h>
// ---------------- WiFi Configuration ----------------
const char* ssid = "Wokwi-GUEST"; // For Wokwi simulation
const char* password = "";
// ---------------- ThingSpeak Configuration ----------------
String writeAPIKey = "6WOBZ5TINVQKCQGK"; // Replace with your ThingSpeak write API key
const char* server = "http://api.thingspeak.com/update";
// ---------------- GPS Config ----------------
#define GPS_BAUDRATE 9600
TinyGPSPlus gps;
// Simulated XBee on Serial1
#define XBEE_BAUDRATE 9600
String DEVICE_ID = "ESP32_4A:7F:2C:9D:1B:6E"; // Unique ID
bool onTollRoad = false;
bool xbee = false;
float startLat = 12.971600;
float startLon = 77.594600;
float totalDistance = 0.0;
// Simulated movement
float latStep = 0.00045;
float lonStep = 0.00045;
float curLat = startLat;
float curLon = startLon;
// ---------------- Helper Functions ----------------
// Haversine formula to calculate distance in meters
float haversine(float lat1, float lon1, float lat2, float lon2) {
const float R = 6371000; // Earth radius in meters
float dLat = (lat2 - lat1) * PI / 180.0;
float dLon = (lon2 - lon1) * PI / 180.0;
float a = sin(dLat/2)*sin(dLat/2) + cos(lat1*PI/180.0)*cos(lat2*PI/180.0)*sin(dLon/2)*sin(dLon/2);
float c = 2*atan2(sqrt(a), sqrt(1-a));
return R * c;
}
// Get current date & time
String getDateTime() {
time_t now;
struct tm timeinfo;
time(&now);
localtime_r(&now, &timeinfo);
char buffer[32];
sprintf(buffer, "%02d:%02d:%02d|%02d:%02d:%02d",
timeinfo.tm_year % 100,
timeinfo.tm_mon + 1,
timeinfo.tm_mday,
timeinfo.tm_hour,
timeinfo.tm_min,
timeinfo.tm_sec);
return String(buffer);
}
// ---------------- Setup ----------------
void setup() {
Serial.begin(115200);
Serial2.begin(GPS_BAUDRATE, SERIAL_8N1, 16, 17);
Serial1.begin(XBEE_BAUDRATE);
Serial.println(F("--------------------------------------"));
Serial.println(F("ESP32 GPS + XBee Simulation"));
Serial.println(F("--------------------------------------"));
// Initialize WiFi
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n✅ WiFi Connected!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
// Initialize NTP time (GMT+5:30)
configTime(5 * 3600 + 1800, 0, "pool.ntp.org", "time.nist.gov");
delay(1000);
Serial.println("--------------------------------------\n");
}
// ---------------- Loop ----------------
void loop() {
// Simulate GPS data reading
while (Serial2.available() > 0) {
gps.encode(Serial2.read());
}
// Simulated handshake commands via Serial monitor
while (Serial.available() > 0) {
String xbeeMsg = Serial.readStringUntil('\n');
xbeeMsg.trim();
if (xbeeMsg == "TOLL_ENTRY") {
onTollRoad = true;
totalDistance = 0.0;
curLat = startLat;
curLon = startLon;
Serial.println("Toll entry detected!");
}
if (xbeeMsg == "Digi_Handshake") {
xbee = true;
Serial.println("Transmission...");
delay(1000);
}
if (xbeeMsg == "TOLL_EXIT") {
onTollRoad = false;
Serial.println("Toll Road Exited!");
}
}
// Simulate linear GPS movement
curLat += latStep;
curLon += lonStep;
// Calculate distance if on toll road
if (onTollRoad) {
static float prevLat = startLat;
static float prevLon = startLon;
totalDistance += haversine(prevLat, prevLon, curLat, curLon);
prevLat = curLat;
prevLon = curLon;
}
// When handshake occurs → transmit + send to ThingSpeak
if (xbee) {
float distanceKm = totalDistance / 1000.0;
String timestamp = getDateTime();
String payload = DEVICE_ID + "|" + String(distanceKm, 3) + "km|" +
String(curLat, 6) + "|" + String(curLon, 6) + "|" + timestamp;
Serial.println("\n--------------------------------------");
Serial.println("ESP32 GPS + XBee Simulation");
Serial.println("--------------------------------------");
Serial.println("Toll entry detected!");
Serial.println("Transmission...");
delay(800);
Serial.println("Payload sent:");
Serial.println(payload);
Serial.println("Transmitted!");
Serial.println("Toll Road Exited!");
Serial.println("--------------------------------------\n");
// Send via XBee (simulated)
Serial1.println(payload);
// ---------------- Send to ThingSpeak ----------------
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = String(server) + "?api_key=" + writeAPIKey +
"&field1=" + String(distanceKm, 3) +
"&field2=" + String(curLat, 6) +
"&field3=" + String(curLon, 6) +
"&field4=" + timestamp +
"&field5=" + DEVICE_ID;
Serial.println("[ThingSpeak] Sending data...");
http.begin(url);
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
Serial.println("✅ ThingSpeak Response Code: " + String(httpResponseCode));
} else {
Serial.println("❌ Error sending data: " + String(httpResponseCode));
}
http.end();
} else {
Serial.println("⚠️ WiFi not connected, skipping ThingSpeak upload!");
}
// Reset for next transmission
totalDistance = 0.0;
startLat = curLat;
startLon = curLon;
xbee = false;
delay(3000);
}
delay(500);
}
Loading
esp32-devkit-v1
esp32-devkit-v1