// 🔒 LINE Notify Token
#define LINE_NOTIFY_TOKEN "your_line_notify_token"
// 📶 WiFi
char ssid[] = "Wokwi-GUEST"; // ชื่อ WiFi
char pass[] = ""; // รหัส WiFi
// 🧾 Google Sheets
const char* SHEET_URL = "https://script.google.com/macros/s/AKfycbwjoVnO4vLYQTGeaV-12N75KHb5IuNYC1Ra7dsxIcHYZpq0-vvxecjtTXKJwz4B1Yk5fA/exec";
// 🔌 Pin Configuration
#define RELAY_VALVE 26
#define RELAY_FIRE 27
#define PIR_PIN 33
#define LED_PIN 13
#define BUZZER_PIN 25 // ➕ เพิ่ม Buzzer
#define BLYNK_TEMPLATE_ID "TMPL6sIAef5i4"
#define BLYNK_TEMPLATE_NAME "Gastest"
#define BLYNK_AUTH_TOKEN "bkMXILHO37ub_w_w6E20hzlp9gX0q7Ce"
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <BlynkSimpleEsp32.h>
#include <TimeLib.h>
#include <WidgetRTC.h>
#include <HTTPClient.h>
BlynkTimer timer;
WidgetRTC rtc;
bool systemEnabled = false;
unsigned long lastMotionTime = 0;
const unsigned long cooldownPeriod = 30000; // 30s
// ===== LINE Notify =====
void sendLineNotify(String message) {
WiFiClientSecure client;
client.setInsecure();
HTTPClient http;
http.begin(client, "https://notify-api.line.me/api/notify");
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
http.addHeader("Authorization", "Bearer " + String(LINE_NOTIFY_TOKEN));
int httpCode = http.POST("message=" + message);
Serial.printf("📨 LINE Notify: %d\n", httpCode);
http.end();
}
// ===== Google Sheet =====
void logToGoogleSheet(String event) {
WiFiClientSecure client;
client.setInsecure();
HTTPClient http;
if (http.begin(client, SHEET_URL)) {
http.addHeader("Content-Type", "application/json");
String payload = "{\"event\":\"" + event + "\"}";
int httpCode = http.POST(payload); // ⭐ ต้องเก็บค่า httpCode ด้วย
Serial.printf("📤 Google Sheets Response: %d\n", httpCode);
if (httpCode > 0) {
String response = http.getString();
Serial.println("Response: " + response);
}
http.end();
}
}
// ===== Alarm Buzzer ก่อนยิง =====
void buzzerWarning() {
digitalWrite(BUZZER_PIN, HIGH);
delay(2000);
digitalWrite(BUZZER_PIN, LOW);
delay(1000);
digitalWrite(BUZZER_PIN, HIGH);
delay(2000);
digitalWrite(BUZZER_PIN, LOW);
delay(1000);
digitalWrite(BUZZER_PIN, HIGH);
delay(2000);
digitalWrite(BUZZER_PIN, LOW);
delay(1000);
}
// ===== ยิงแก๊สไล่นก =====
void fireGas(String source) {
Serial.println("🔥 ไล่นกเริ่มจาก " + source);
buzzerWarning(); // 🔔 แจ้งเตือนก่อนยิง
digitalWrite(RELAY_VALVE, HIGH);
delay(4000);
digitalWrite(RELAY_VALVE, LOW);
digitalWrite(RELAY_FIRE, HIGH);
delay(4000);
digitalWrite(RELAY_FIRE, LOW);
logToGoogleSheet("🔥 ไล่นกจาก " + source);
sendLineNotify("🔥 ไล่นกจาก " + source);
digitalWrite(LED_PIN, HIGH);
delay(2000);
digitalWrite(LED_PIN, LOW);
}
// ===== ตรวจจับ PIR =====
void checkPIR() {
int motion = digitalRead(PIR_PIN);
unsigned long now = millis();
if (motion == HIGH && systemEnabled && (now - lastMotionTime >= cooldownPeriod)) {
lastMotionTime = now;
fireGas("PIR ตรวจจับนก");
}
}
// ===== Blynk =====
BLYNK_CONNECTED() {
rtc.begin();
Blynk.syncAll();
}
BLYNK_WRITE(V0) {
systemEnabled = param.asInt();
Serial.printf("⚙️ ระบบ: %s\n", systemEnabled ? "เปิด" : "ปิด");
}
BLYNK_WRITE(V3) {
if (param.asInt() == 1) fireGas("กดจาก Blynk");
}
// ===== Setup =====
void setup() {
Serial.begin(115200);
pinMode(RELAY_VALVE, OUTPUT);
pinMode(RELAY_FIRE, OUTPUT);
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(RELAY_VALVE, LOW);
digitalWrite(RELAY_FIRE, LOW);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n✅ WiFi connected");
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
rtc.begin();
timer.setInterval(1000L, checkPIR);
}
// ===== Loop =====
void loop() {
Blynk.run();
timer.run();
}