#include <ZMPT101B.h>
// #define timer_value 300000 // FOR SIMULATION - 5 minutes
#define timer_value 300 // FOR SIMULATION - very short timeout
#define SENSITIVITY 500.0f
#define Relay 4

#define seg_a 5
#define seg_b 6
#define seg_c 7
#define seg_d 8
#define seg_e 9
#define seg_f 10
#define seg_g 11
#define dot 12
#define com1 13
#define com2 14
#define com3 15
#define com4 16
ZMPT101B voltageSensor(A5, 50.0);
unsigned long int last_cheked_millis = 0;
bool time_passed = false;
float values[] = {220.0, 220.0, 220.0, 220.0, 220.0};
int counter = 0;
float voltage = 0.0;
float value = 0.0;
void setup() {
  Serial.begin(115200);
  voltageSensor.setSensitivity(SENSITIVITY);
  pinMode(Relay, OUTPUT);
  digitalWrite(Relay, LOW);
  dislplay_init();
}

void loop() {
  // display_value(123.4);
  // delay(5);
  value = sensor_read();
  display_value(value);
  main_job(value); // FOR SIMULATION - removed comment //
}

short int mode_display = 0;
void dislplay_init() {
  pinMode(seg_a, OUTPUT);
  pinMode(seg_b, OUTPUT);
  pinMode(seg_c, OUTPUT);
  pinMode(seg_d, OUTPUT);
  pinMode(seg_e, OUTPUT);
  pinMode(seg_f, OUTPUT);
  pinMode(seg_g, OUTPUT);
  pinMode(dot, OUTPUT);
  pinMode(com1, OUTPUT);
  pinMode(com2, OUTPUT);
  pinMode(com3, OUTPUT);
  pinMode(com4, OUTPUT);
  digitalWrite(seg_a, HIGH);
  digitalWrite(seg_b, HIGH);
  digitalWrite(seg_c, HIGH);
  digitalWrite(seg_d, HIGH);
  digitalWrite(seg_e, HIGH);
  digitalWrite(seg_f, HIGH);
  digitalWrite(seg_g, HIGH);
  digitalWrite(dot, HIGH);
  digitalWrite(com1, LOW);
  digitalWrite(com2, LOW);
  digitalWrite(com3, LOW);
  digitalWrite(com4, LOW);

}
void display_single_com_Anode(int character) {
  //common positive
  switch (character) {
    case 0:
      digitalWrite(seg_a, LOW);
      digitalWrite(seg_b, LOW);
      digitalWrite(seg_c, LOW);
      digitalWrite(seg_d, LOW);
      digitalWrite(seg_e, LOW);
      digitalWrite(seg_f, LOW);
      digitalWrite(seg_g, HIGH);
      break;
    case 1:
      digitalWrite(seg_a, HIGH);
      digitalWrite(seg_b, LOW);
      digitalWrite(seg_c, LOW);
      digitalWrite(seg_d, HIGH);
      digitalWrite(seg_e, HIGH);
      digitalWrite(seg_f, HIGH);
      digitalWrite(seg_g, HIGH);
      break;
    case 2:
      digitalWrite(seg_a, LOW);
      digitalWrite(seg_b, LOW);
      digitalWrite(seg_c, HIGH);
      digitalWrite(seg_d, LOW);
      digitalWrite(seg_e, LOW);
      digitalWrite(seg_f, HIGH);
      digitalWrite(seg_g, LOW);
      break;
    case 3:
      digitalWrite(seg_a, LOW);
      digitalWrite(seg_b, LOW);
      digitalWrite(seg_c, LOW);
      digitalWrite(seg_d, LOW);
      digitalWrite(seg_e, HIGH);
      digitalWrite(seg_f, HIGH);
      digitalWrite(seg_g, LOW);
      break;
    case 4:
      digitalWrite(seg_a, HIGH);
      digitalWrite(seg_b, LOW);
      digitalWrite(seg_c, LOW);
      digitalWrite(seg_d, HIGH);
      digitalWrite(seg_e, HIGH);
      digitalWrite(seg_f, LOW);
      digitalWrite(seg_g, LOW);
      break;
    case 5:
      digitalWrite(seg_a, LOW);
      digitalWrite(seg_b, HIGH);
      digitalWrite(seg_c, LOW);
      digitalWrite(seg_d, LOW);
      digitalWrite(seg_e, HIGH);
      digitalWrite(seg_f, LOW);
      digitalWrite(seg_g, LOW);
      break;
    case 6:
      digitalWrite(seg_a, LOW);
      digitalWrite(seg_b, HIGH);
      digitalWrite(seg_c, LOW);
      digitalWrite(seg_d, LOW);
      digitalWrite(seg_e, LOW);
      digitalWrite(seg_f, LOW);
      digitalWrite(seg_g, LOW);
      break;
    case 7:
      digitalWrite(seg_a, LOW);
      digitalWrite(seg_b, LOW);
      digitalWrite(seg_c, LOW);
      digitalWrite(seg_d, HIGH);
      digitalWrite(seg_e, HIGH);
      digitalWrite(seg_f, HIGH);
      digitalWrite(seg_g, HIGH);
      break;
    case 8:
      digitalWrite(seg_a, LOW);
      digitalWrite(seg_b, LOW);
      digitalWrite(seg_c, LOW);
      digitalWrite(seg_d, LOW);
      digitalWrite(seg_e, LOW);
      digitalWrite(seg_f, LOW);
      digitalWrite(seg_g, LOW);
      break;
    case 9:
      digitalWrite(seg_a, LOW);
      digitalWrite(seg_b, LOW);
      digitalWrite(seg_c, LOW);
      digitalWrite(seg_d, LOW);
      digitalWrite(seg_e, HIGH);
      digitalWrite(seg_f, LOW);
      digitalWrite(seg_g, LOW);
      break;
  }
}
void display_value(float number) {
  //  display_number((int(number / 100 ) ) ,(int(number) / 10) % 10, int(number) % 10, int(number * 10) % 10);
  switch (mode_display) {
    case 0:
      //display_single(int(number / 100), 0);
      digitalWrite(com4, LOW);
      display_single_com_Anode(number / 100);
      digitalWrite(com1, HIGH);
      mode_display++;
      break;
    case 1:
      //display_single( (int(number)/10) % 10, 1);
      digitalWrite(com1, LOW);
      display_single_com_Anode( (int(number) / 10) % 10 );
      digitalWrite(com2, HIGH);
      mode_display++;
      break;
    case 2:
      //display_single( (int(number) % 10) + 1, 2);
      digitalWrite(com2, LOW);
      display_single_com_Anode( int(number) % 10 );
      digitalWrite(dot, LOW);
      digitalWrite(com3, HIGH);
      mode_display++;
      break;
    case 3:
      //display_single(int(number * 10) % 10, 3);
      digitalWrite(com3, LOW);
      digitalWrite(dot, HIGH);
      display_single_com_Anode( int(number * 10) % 10 );
      digitalWrite(com4, HIGH);
      mode_display = 0;
      break;
  }
}
float sensor_read() {
  // float voltage = voltageSensor.getRmsVoltage(); // FOR SIMULATION
  float voltage = map(analogRead(A5), 0, 1023, 150, 300); //  FOR SIMULATION - substituted for ZMPT101B

  values[counter] = voltage;
  counter++;
  if (counter >= 6) {
    counter = 0;
  }
  int sum = 0;
  for (int i = 0; i < 6; i++) {
    sum += values[i];
  }
  return sum / 6;
}

void main_job(float voltage) {
  if (time_passed) {
    if ( (voltage < 180) || (voltage > 240) ) {
      digitalWrite(Relay, LOW);
      last_cheked_millis = millis();
      time_passed = false;
    } else {
      digitalWrite(Relay, HIGH);
    }
  } else {
    if ( millis() >= (timer_value + last_cheked_millis) ) {
      time_passed = true;
    }
  }
}
ZMPT101B
NOCOMNCVCCGNDINLED1PWRRelay Module