//STATE PROGRAMMING IS WHAT I DID HERE
#include <LiquidCrystal.h>
#include <Keypad.h>
#define LINE_R 1
#define LINE_Y 6
#define LINE_B 13
#define MAX_KM 4000
float LINE_R_CURRENT = MAX_KM;
float LINE_Y_CURRENT = MAX_KM;
float LINE_B_CURRENT = MAX_KM;
const int rs = 12, en = 11, d4 = 10, d5 = 9, d6 = 8, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
char getterR[4] = {'1', '4', '7', '*'};
char getterY[4] = {'2', '5', '8', '0'};
char getterB[4] = {'3', '6', '9', '#'};
byte rowPins[ROWS] = {5, 4, 3, 2}; // connect to the row pinouts of the kpd
byte colPins[COLS] = {A3, A2, A1, A0}; // connect to the column pinouts of the kpd
Keypad kpd = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
bool isR = false, isY = false, isB = false;
void setup() {
lcd.begin(16, 2);
pinMode(LINE_R, OUTPUT);
pinMode(LINE_Y, OUTPUT);
pinMode(LINE_B, OUTPUT);
digitalWrite(LINE_R, HIGH);
digitalWrite(LINE_Y, HIGH);
digitalWrite(LINE_B, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Underground ");
lcd.setCursor(0, 1);
lcd.print("Fault ");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Detection System");
lcd.setCursor(0, 1);
lcd.print("By Samuel Dintui");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bitrus Reg Numb:");
lcd.setCursor(0, 1);
lcd.print("16/05/05/181");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Supervised By ");
lcd.setCursor(0, 1);
lcd.print("Engr. Dr. Jafaru");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Usman ");
lcd.setCursor(0, 1);
lcd.print(" ");
delay(2000);
kpd.addEventListener(keypadEvent);
}
void loop() {
char key = kpd.getKey();
if (key) {//STATES LOGICS
for (int i = 0; i < 4; i++) {
if (key == getterR[i]) {
isR = true;
isY = false;
isB = false;
LINE_Y_CURRENT = MAX_KM;
LINE_B_CURRENT = MAX_KM;
handleKeyPress(i, LINE_R_CURRENT);
} else if (key == getterY[i]) {
isY = true;
isR = false;
isB = false;
LINE_R_CURRENT = MAX_KM;
LINE_B_CURRENT = MAX_KM;
handleKeyPress(i, LINE_Y_CURRENT);
} else if (key == getterB[i]) {
isB = true;
isY = false;
isR = false;
LINE_Y_CURRENT = MAX_KM;
LINE_R_CURRENT = MAX_KM;
handleKeyPress(i, LINE_B_CURRENT);
}
}
}
displayRYB(LINE_R_CURRENT, LINE_Y_CURRENT, LINE_B_CURRENT, isR, isY, isB);//STATE DEPENDER
digitalWrite(LINE_R, isR ? LOW : HIGH);
digitalWrite(LINE_Y, isY ? LOW : HIGH);
digitalWrite(LINE_B, isB ? LOW : HIGH);
delay(200);
}
void handleKeyPress(int index, float &lineCurrent) {
lineCurrent -= 1000 * (index + 1);
if (lineCurrent < 0) lineCurrent = 0;
}
void displayRYB(float r, float y, float b, bool isR, bool isY, bool isB) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("R:" + String(int(r)) + ", Y:" + String(int(y)) + ", B:" + String(int(b)) + " ");
lcd.setCursor(0, 1);
lcd.print(String((isR && isY && isB) ? "FaultSystem:OFF" : isR ? "R-line Fault:OFF" : isY ? "Y-line Fault:OFF" : isB ? "B-line Fault:OFF" : "All working:ON"));
}
// Taking care of some special events.
void keypadEvent(KeypadEvent key) {//STATES LOGICS
switch (kpd.getState()) {
case HOLD:
for (int i = 0; i < 4; i++) {
if (key == getterR[i] || key == getterY[i] || key == getterB[i]) {
isR = true;
isY = true;
isB = true;
}
}
break;
}
}