// Timing and sensor constants
#define TIMER_VALUE 300 // Short timeout for simulation
#define SENSITIVITY 500.0f
#define RELAY 4
// 7-segment display pin definitions (Common Anode)
#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
// Voltage sensor setup
ZMPT101B voltageSensor(34, 50.0); // GPIO34 (ADC1) for ESP32
unsigned long last_checked_millis = 0;
bool time_passed = false;
float values[6] = {220.0, 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);
// Relay setup
pinMode(RELAY, OUTPUT);
digitalWrite(RELAY, LOW);
// 7-segment display setup
display_init();
}
void loop() {
value = sensor_read();
display_value(value);
main_job(value);
}
// 7-segment display initialization
void display_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);
}
// Function to display digits on 7-segment (common anode)
void display_single_com_Anode(int character) {
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;
}
}
short int mode_display = 0;
void display_value(float number) {
switch (mode_display) {
case 0: digitalWrite(COM4, LOW);
display_single_com_Anode(number / 100);
digitalWrite(COM1, HIGH);
mode_display++;
break;
case 1: digitalWrite(COM1, LOW);
display_single_com_Anode((int(number) / 10) % 10);
digitalWrite(COM2, HIGH);
mode_display++;
break;
case 2: digitalWrite(COM2, LOW);
display_single_com_Anode(int(number) % 10);
digitalWrite(DOT, LOW);
digitalWrite(COM3, HIGH);
mode_display++;
break;
case 3: digitalWrite(COM3, LOW);
digitalWrite(DOT, HIGH);
display_single_com_Anode(int(number * 10) % 10);
digitalWrite(COM4, HIGH);
mode_display = 0;
break;
}
}
// Read voltage from ZMPT101B sensor
float sensor_read() {
float voltage = map(analogRead(34), 0, 4095, 150, 300); // Adjusted for ESP32 ADC (0-4095)
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;
}
// Relay control logic
void main_job(float voltage) {
if (time_passed) {
if ((voltage < 180) || (voltage > 240)) {
digitalWrite(RELAY, LOW);
last_checked_millis = millis();
time_passed = false;
} else {
digitalWrite(RELAY, HIGH);
}
} else {
if (millis() >= (TIMER_VALUE + last_checked_millis)) {
time_passed = true;
}
}
}
Loading
esp32-s3-devkitc-1
esp32-s3-devkitc-1