#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