#define BLYNK_TEMPLATE_ID "TMPL6T_nL504M"
#define BLYNK_TEMPLATE_NAME "Light System"
#define BLYNK_AUTH_TOKEN "hzvjMc_MlDDjPAGtIqB0tEsz8cU5iUT1"

#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

char auth[] = BLYNK_AUTH_TOKEN;

const int buttonPins[5] = {18, 19, 21, 22, 23};
const int ledPins[5] = {4, 5, 12, 13, 14};
bool ledStates[5] = {false, false, false, false, false};

const int ledVPins[5] = {V1, V2, V3, V4, V5};
#define LED_COUNT_VPIN V10

BlynkTimer timer;

// Hàm đổi trạng thái LED
void toggleLED(int index, int value) {
    ledStates[index] = value;
    digitalWrite(ledPins[index], value ? HIGH : LOW);
}

// Xử lý khi nhấn nút
void checkButtons() {
    int countOn = 0;
    for (int i = 0; i < 5; i++) {
        if (digitalRead(buttonPins[i]) == LOW) {
            ledStates[i] = !ledStates[i];
            digitalWrite(ledPins[i], ledStates[i] ? HIGH : LOW);
            Blynk.virtualWrite(ledVPins[i], ledStates[i]);
        }
        if (ledStates[i]) countOn++;
    }
    Blynk.virtualWrite(LED_COUNT_VPIN, countOn);
}

// Nhận lệnh từ Blynk
BLYNK_WRITE(V1) { toggleLED(0, param.asInt()); }
BLYNK_WRITE(V2) { toggleLED(1, param.asInt()); }
BLYNK_WRITE(V3) { toggleLED(2, param.asInt()); }
BLYNK_WRITE(V4) { toggleLED(3, param.asInt()); }
BLYNK_WRITE(V5) { toggleLED(4, param.asInt()); }

void setup() {
    Serial.begin(115200);
    WiFi.begin();  // Sử dụng WiFi mặc định của Wokwi
    Blynk.begin(auth, WiFi);

    for (int i = 0; i < 5; i++) {
        pinMode(buttonPins[i], INPUT_PULLUP);
        pinMode(ledPins[i], OUTPUT);
    }

    timer.setInterval(500L, checkButtons);
}

void loop() {
    Blynk.run();
    timer.run();
}