#define BLYNK_PRINT Serial
/* Fill in information from Blynk Device Info here */
#define BLYNK_TEMPLATE_ID "TMPL6AC28F9Fa"
#define BLYNK_TEMPLATE_NAME "lab4"
#define BLYNK_AUTH_TOKEN "tNmL1IM2cRk-TdLzs2WHI6wZGPJsT0nG"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
const int led = 32;
const int btn = 33;
bool on_off = false; // สถานะระบบ (เปิด/ปิด)
int currentBrightness = 0; // ตัวแปรเก็บค่าความสว่างจาก V0
BlynkTimer timer; // สร้าง Timer เพื่อแยกการทำงานออกจาก loop
// ฟังก์ชันสำหรับอัปเดตสถานะไฟ LED ตามเงื่อนไข
void updateLedState() {
if (on_off) {
// ถ้าระบบเปิด: ให้เปิดไฟตามความสว่างที่เก็บไว้
analogWrite(led, currentBrightness);
Serial.print("System ON. Brightness: ");
Serial.println(currentBrightness);
} else {
// ถ้าระบบปิด: ให้ปิดไฟ (เขียนค่า 0)
analogWrite(led, 0);
Serial.println("System OFF.");
}
}
// ฟังก์ชันเช็คปุ่ม (จะถูกเรียกโดย Timer)
void checkButton() {
// อ่านค่าปุ่ม (กด = LOW เพราะใช้ INPUT_PULLUP)
if (digitalRead(btn) == LOW) {
// Debounce: รอเล็กน้อยเพื่อกันสัญญาณรวน
delay(50);
if (digitalRead(btn) == LOW) {
// สลับสถานะ on_off
on_off = !on_off;
// อัปเดตไฟทันทีเมื่อกดปุ่ม
updateLedState();
// รอจนกว่าจะปล่อยปุ่ม (กันการกดค้างแล้วค่ารัว)
while(digitalRead(btn) == LOW) {
delay(10);
}
}
}
}
BLYNK_CONNECTED()
{
Blynk.syncVirtual(V0);
}
// รับค่าจาก Slider หรือ Widget บน Blynk (V0)
BLYNK_WRITE(V0)
{
// 1. เก็บค่าลงตัวแปร global
currentBrightness = param.asInt();
// 2. ถ้าปรับ slider ขณะที่ระบบ "เปิด" อยู่ ให้ไฟเปลี่ยนตามทันที
// แต่ถ้าปิดอยู่ ก็แค่จำค่าไว้เฉยๆ ไม่ต้องติดไฟ
if (on_off) {
analogWrite(led, currentBrightness);
}
Serial.print("V0 Value Received: ");
Serial.println(currentBrightness);
}
void setup() {
Serial.begin(115200);
pinMode(led, OUTPUT);
pinMode(btn, INPUT_PULLUP);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass, "blynk.cloud", 80);
// ตั้ง Timer ให้เรียกฟังก์ชัน checkButton ทุกๆ 100ms
// วิธีนี้ดีกว่าเขียนใน loop เพราะไม่ขวางการทำงานของ Blynk
timer.setInterval(100L, checkButton);
}
void loop() {
Blynk.run();
timer.run(); // สั่งให้ Timer ทำงาน
}