// 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
NOCOMNCVCCGNDINLED1PWRRelay Module