#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ================= UNDERGROUND CABLE FAULT =================
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Relay pins
const int line1RelayPin = 18;
const int line2RelayPin = 4;
// Fault check points
const int r1Pin = 12;
const int r2Pin = 26;
const int g1Pin = 25;
const int g2Pin = 14;
const int v1Pin = 33;
const int v2Pin = 27;
// Latitude and Longitude (example values)
float latR1 = 19.031124, lonR1 = 72.841415;
float latR2 = 19.031924, lonR2 = 72.859415;
float latG1 = 19.021224, lonG1 = 72.842415;
float latG2 = 19.021924, lonG2 = 72.849415;
float latV1 = 19.111146, lonV1 = 72.861736;
float latV2 = 19.113646, lonV2 = 72.869736;
// Distance definitions
const int distanceR = 1;
const int distanceG = 2;
const int distanceV = 3;
// Variables
String lastLineNumber;
int lastDistance = 0;
float lastLat = 0.0, lastLon = 0.0;
int faultFlag = 0;
// Track what’s currently displayed
String currentScreen = "";
// Timing for LCD switching
unsigned long lastSwitchTime = 0;
bool showFirstScreen = true;
// ================= SETUP =================
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
pinMode(line1RelayPin, OUTPUT);
pinMode(line2RelayPin, OUTPUT);
pinMode(r1Pin, INPUT_PULLUP);
pinMode(r2Pin, INPUT_PULLUP);
pinMode(g1Pin, INPUT_PULLUP);
pinMode(g2Pin, INPUT_PULLUP);
pinMode(v1Pin, INPUT_PULLUP);
pinMode(v2Pin, INPUT_PULLUP);
Serial.println("System Initialized");
showHomeScreen();
delay(1000);
}
// ================= LOOP =================
void loop() {
int r1State = digitalRead(r1Pin);
int g1State = digitalRead(g1Pin);
int v1State = digitalRead(v1Pin);
int r2State = digitalRead(r2Pin);
int g2State = digitalRead(g2Pin);
int v2State = digitalRead(v2Pin);
faultFlag = 0;
if (r1State == HIGH) {
updateFault("1", distanceR, latR1, lonR1, line1RelayPin);
} else if (g1State == HIGH) {
updateFault("1", distanceG, latG1, lonG1, line1RelayPin);
} else if (v1State == HIGH) {
updateFault("1", distanceV, latV1, lonV1, line1RelayPin);
}
if (r2State == HIGH) {
updateFault("2", distanceR, latR2, lonR2, line2RelayPin);
} else if (g2State == HIGH) {
updateFault("2", distanceG, latG2, lonG2, line2RelayPin);
} else if (v2State == HIGH) {
updateFault("2", distanceV, latV2, lonV2, line2RelayPin);
}
if (faultFlag == 1) {
printLastFault();
} else {
digitalWrite(line1RelayPin, LOW);
digitalWrite(line2RelayPin, LOW);
showHomeScreen();
}
delay(500);
}
// ================= FUNCTIONS =================
void showHomeScreen() {
String newScreen = "Underground Cable\nNo Fault Found";
if (newScreen != currentScreen) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Underground Cable");
lcd.setCursor(0, 1);
lcd.print("No Fault Found");
currentScreen = newScreen;
}
}
void updateFault(const String& line, int distance, float lat, float lon, int relayPin) {
lastLineNumber = line;
lastDistance = distance;
lastLat = lat;
lastLon = lon;
faultFlag = 1;
digitalWrite(relayPin, HIGH);
}
void printLastFault() {
// Switch screen every 2 seconds
if (millis() - lastSwitchTime > 2000) {
lastSwitchTime = millis();
showFirstScreen = !showFirstScreen;
}
if (showFirstScreen) {
// Show Line and Distance
String newScreen = "Line " + lastLineNumber + " Dist:" + String(lastDistance) + "km";
if (newScreen != currentScreen) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Fault on Line ");
lcd.print(lastLineNumber);
lcd.setCursor(0, 1);
lcd.print("Dist: ");
lcd.print(lastDistance);
lcd.print(" km");
currentScreen = newScreen;
}
} else {
// Show full Latitude and Longitude
String newScreen = "Lat:" + String(lastLat, 6) + " Lon:" + String(lastLon, 6);
if (newScreen != currentScreen) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Lat:");
lcd.print(lastLat, 6);
lcd.setCursor(0, 1);
lcd.print("Lon:");
lcd.print(lastLon, 6);
currentScreen = newScreen;
}
}
// Serial monitor (always print complete info)
Serial.println("===== LAST FAULT DETAILS =====");
Serial.print("Line: "); Serial.println(lastLineNumber);
Serial.print("Distance: "); Serial.print(lastDistance); Serial.println(" km");
Serial.print("Latitude: "); Serial.print(lastLat, 6);
Serial.print(" | Longitude: "); Serial.println(lastLon, 6);
Serial.println("================================");
}