I am working on my University Project. It's a DMT and IDMT relay. The following code runs fine the first time but it gets stuck after the first run as void loop() runs for the second time. it just keep on printing the IDMT Mode and DMT Mode again and again.
#include <Arduino.h>
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2);
#define relayPin1 9
#define relayPin2 10
#define timerPin 7
const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {31,33, 35, 37};
byte colPins[COLS] = {39,41, 43, 45};
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void begin();
void input_Value();
void dmt_Mode();
void idmt_Mode();
void input_Delay();
char key_IN();
void common_Function1();
void common_Function2();
float inputNumber = 0;
float act_Voltage = 2000;
int inputState = 0;
int inputDigit = 0;
int inputState_D = 0;
int inputDigit_D = 0;
float inputNumber_D = 0;
char flag = 0; //This controls loops.
void setup(){
pinMode(timerPin,OUTPUT);
digitalWrite(timerPin,LOW);
lcd.init();
lcd.clear();
lcd.backlight();
lcd.setCursor(0,0);
lcd.println("Welcome");
lcd.setCursor(0, 1);
lcd.print("Intializing.....");
pinMode(relayPin1,OUTPUT);
pinMode(relayPin2,OUTPUT);
digitalWrite(relayPin1,HIGH);
digitalWrite(relayPin2,HIGH);
delay(100);
}
void loop(){
begin();
}
void begin(){
char mode;
lcd.setCursor(0, 0);
lcd.print("A.DMT Operation");
lcd.setCursor(0,1);
lcd.print("B.IDMT Operation");
delay(200);
mode = key_IN();
if (mode == 'A'){
lcd.setCursor(0,1);
lcd.println(mode);
dmt_Mode();
}
else if(mode == 'B'){
lcd.setCursor(0,1);
lcd.println(mode);
idmt_Mode();
}
}
char key_IN(){
char key_ = customKeypad.getKey();
return key_;
}
void common_Function1(){
char dmtFlag = 0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Set Voltage:");
flag = 1;
inputNumber = 0;
inputState = 0;
inputDigit = 0;
input_Value();
{
dmtFlag =1;
while(dmtFlag !=0){
char mode;
mode = key_IN();
if (mode == 'A'){
lcd.clear();
lcd.setCursor(0,0);
lcd.println("Enter Again");
inputNumber = 0;
inputState = 0;
inputDigit = 0;
input_Value();
}
else if(mode == 'B'){
lcd.clear();
lcd.setCursor(0,0);
lcd.println("Proceed");
delay(200);
dmtFlag = 0;
}
}
}
delay(500);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Set Time:");
input_Delay();
{
dmtFlag =1;
while(dmtFlag !=0){
char mode;
mode = key_IN();
if (mode == 'A'){
lcd.clear();
lcd.setCursor(0,0);
lcd.println("Enter Again");
inputNumber_D = 0;
inputState_D = 0;
inputDigit_D = 0;
input_Delay();
}
else if(mode == 'B'){
lcd.clear();
lcd.setCursor(0,0);
lcd.println("Proceed");
delay(200);
dmtFlag = 0;
}
}
}
}
void common_Function2(){
lcd.setCursor(0, 0);
lcd.print("A.Overvoltage ");
lcd.setCursor(0, 1);
lcd.print("B.Undervoltage ");
}
void common_Function3(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("No Fault:");
lcd.setCursor(0,1);
lcd.print("Normal Voltage");
}
void dmt_Mode(){
lcd.clear();
while(flag == 0){
common_Function2();
char mode_D = key_IN();
if (mode_D == 'A'){
common_Function1();
delay(1000);
{
char check_Flag = 1;
while(check_Flag != 0){
if(inputNumber<act_Voltage){
digitalWrite(relayPin1,LOW);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Fault Detected:");
lcd.setCursor(0,1);
lcd.print("Overvoltage");
digitalWrite(timerPin,HIGH);
delay(inputNumber_D*1000);
digitalWrite(relayPin2,LOW);
digitalWrite(timerPin,LOW);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Relay Tripped:");
lcd.setCursor(0,1);
lcd.print(inputNumber_D);
lcd.print(" sec");
delay(1000);
check_Flag = 0;
}
else{
common_Function3();
}
}
}
}
else if(mode_D == 'B'){
common_Function1();
delay(1000);
{
char check_Flag = 1;
while(check_Flag != 0){
if(inputNumber>act_Voltage){
digitalWrite(relayPin1,LOW);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Fault Detected:");
lcd.setCursor(0,1);
lcd.print("Undervoltage");
digitalWrite(timerPin,HIGH);
delay(inputNumber_D*1000);
digitalWrite(relayPin2,LOW);
digitalWrite(timerPin,LOW);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Relay Tripped:");
lcd.setCursor(0,1);
lcd.print(inputNumber_D);
lcd.print(" sec");
delay(1000);
check_Flag = 0;
}
else{
common_Function3();
}
}
}
}
}
}
void idmt_Mode(){
lcd.clear();
while(flag == 0){
common_Function2();
char mode_D = key_IN();
if (mode_D == 'A'){
common_Function1();
delay(1000);
{
char check_Flag = 1;
while(check_Flag != 0){
if(inputNumber<act_Voltage){
digitalWrite(relayPin1,LOW);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Fault Detected:");
lcd.setCursor(0,1);
lcd.print("Overvoltage");
digitalWrite(timerPin,HIGH);
delay(inputNumber_D*1000);
digitalWrite(relayPin2,LOW);
digitalWrite(timerPin,LOW);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Relay Tripped:");
lcd.setCursor(0,1);
lcd.print(inputNumber_D);
lcd.print(" sec");
delay(1000);
check_Flag = 0;
}
else{
common_Function3();
delay(1000);
}
}
}
}
else if(mode_D == 'B'){
common_Function1();
delay(1000);
{
char check_Flag = 1;
while(check_Flag != 0){
if(inputNumber>act_Voltage){
digitalWrite(relayPin1,LOW);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Fault Detected:");
lcd.setCursor(0,1);
lcd.print("Undervoltage");
digitalWrite(timerPin,HIGH);
delay(inputNumber_D*1000);
digitalWrite(relayPin2,LOW);
digitalWrite(timerPin,LOW);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Relay Tripped:");
lcd.setCursor(0,1);
lcd.print(inputNumber_D);
lcd.print(" sec");
delay(1000);
check_Flag = 0;
}
else{
common_Function3();
delay(1000);
}
}
}
}
}
}
void input_Value(){
if (inputState == 0) {
lcd.setCursor(inputState,1);
lcd.print("_");
delay(50);
lcd.setCursor(inputState,1);
lcd.print(" ");
delay(50);
lcd.setCursor(inputState,1);
lcd.print("_");
delay(50);
lcd.setCursor(inputState,1);
lcd.print(" ");
}
while(inputState<5){
char key = customKeypad.getKey();
if (key != NO_KEY){
if (inputState == 0){
inputNumber = (key - '0') * 100;
inputState = 1;
inputDigit = key - '0';
lcd.setCursor(0,1);
lcd.print(inputDigit);
}
else if (inputState == 1){
inputNumber += (key - '0') * 10;
inputState = 2;
inputDigit = key - '0';
lcd.setCursor(1,1);
lcd.print(inputDigit);
}
else if (inputState == 2){
inputNumber += key - '0';
inputState = 3;
inputDigit = key - '0';
lcd.setCursor(2,1);
lcd.print(inputDigit);
lcd.setCursor(3,1);
lcd.print(".");
}
else if (inputState == 3){
inputNumber += (key - '0') * 0.1;
inputState = 4;
inputDigit = key - '0';
lcd.setCursor(4,1);
lcd.print(inputDigit);
}
else if (inputState == 4){
inputNumber += (key - '0') * 0.01;
inputState = 5;
inputDigit = key - '0';
lcd.setCursor(5,1);
lcd.print(inputDigit);
lcd.setCursor(7, 1);
lcd.print("V");
}
if (inputState == 5){
Serial.println(inputNumber);
lcd.setCursor(0,1);
if(inputNumber<80){
inputNumber = 080.00;
}
else if(inputNumber >260){
inputNumber = 260;
}
lcd.print(inputNumber);
lcd.setCursor(7, 1);
lcd.print("V");
}
if (inputState <3) {
lcd.setCursor(inputState,1);
lcd.print("_");
delay(50);
lcd.setCursor(inputState,1);
lcd.print(" ");
delay(50);
lcd.setCursor(inputState,1);
lcd.print("_");
delay(50);
lcd.setCursor(inputState,1);
lcd.print(" ");
}
else if(inputState == 3){
lcd.setCursor(inputState+1,1);
lcd.print("_");
delay(50);
lcd.setCursor(inputState+1,1);
lcd.print(" ");
delay(50);
lcd.setCursor(inputState+1,1);
lcd.print("_");
delay(50);
lcd.setCursor(inputState+1,1);
lcd.print(" ");
}
else if(inputState == 4){
lcd.setCursor(inputState+1,1);
lcd.print("_");
delay(50);
lcd.setCursor(inputState+1,1);
lcd.print(" ");
delay(50);
lcd.setCursor(inputState+1,1);
lcd.print("_");
delay(50);
lcd.setCursor(inputState+1,1);
lcd.print(" ");
}
delay(50);
}
}
}
void input_Delay(){
if (inputState_D == 0) {
lcd.setCursor(inputState_D,1);
lcd.print("_");
delay(50);
lcd.setCursor(inputState_D,1);
lcd.print(" ");
delay(50);
lcd.setCursor(inputState_D,1);
lcd.print("_");
delay(50);
lcd.setCursor(inputState_D,1);
lcd.print(" ");
}
while(inputState_D<4){
char key = customKeypad.getKey();
if (key != NO_KEY){
if (inputState_D == 0){
inputNumber_D += (key - '0') * 10;
inputState_D = 1;
inputDigit_D = key - '0';
lcd.setCursor(0,1);
lcd.print(inputDigit_D);
}
else if (inputState_D == 1){
inputNumber_D += key - '0';
inputState_D = 2;
inputDigit_D = key - '0';
lcd.setCursor(1,1);
lcd.print(inputDigit_D);
lcd.setCursor(2,1);
lcd.print(".");
}
else if (inputState_D == 2){
inputNumber_D += (key - '0') * 0.1;
inputState_D = 3;
inputDigit_D = key - '0';
lcd.setCursor(3,1);
lcd.print(inputDigit_D);
}
else if (inputState_D == 3){
inputNumber_D += (key - '0') * 0.01;
inputState_D = 4;
inputDigit_D = key - '0';
if(inputNumber_D>50){
inputNumber_D = 50;
}
lcd.setCursor(4,1);
lcd.print(inputDigit_D);
lcd.setCursor(6, 1);
lcd.print("sec");
}
if (inputState_D == 4){
Serial.println(inputNumber_D);
lcd.setCursor(0,1);
lcd.print(inputNumber_D);
lcd.setCursor(6, 1);
lcd.print("sec");
}
if (inputState_D <2) {
lcd.setCursor(inputState_D,1);
lcd.print("_");
delay(50);
lcd.setCursor(inputState_D,1);
lcd.print(" ");
delay(50);
lcd.setCursor(inputState_D,1);
lcd.print("_");
delay(50);
lcd.setCursor(inputState_D,1);
lcd.print(" ");
}
else if(inputState_D == 2){
lcd.setCursor(inputState_D+1,1);
lcd.print("_");
delay(50);
lcd.setCursor(inputState_D+1,1);
lcd.print(" ");
delay(50);
lcd.setCursor(inputState_D+1,1);
lcd.print("_");
delay(50);
lcd.setCursor(inputState_D+1,1);
lcd.print(" ");
}
else if(inputState_D == 3){
lcd.setCursor(inputState_D+1,1);
lcd.print("_");
delay(50);
lcd.setCursor(inputState_D+1,1);
lcd.print(" ");
delay(50);
lcd.setCursor(inputState_D+1,1);
lcd.print("_");
delay(50);
lcd.setCursor(inputState_D+1,1);
lcd.print(" ");
}
}
}
}