#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <time.h>
#include <HTTPClient.h>
#define LEBAR_LAYAR 128
#define TINGGI_LAYAR 64
Adafruit_SSD1306 oled(LEBAR_LAYAR, TINGGI_LAYAR, &Wire, -1);
const char* ssid = "Wokwi-GUEST"; // ชื่อเครือข่าย WiFi
const char* password = ""; // รหัสผ่าน WiFi
const char* googleScriptUrl = "https://script.google.com/macros/s/AKfycbzUi7Svi8dsL24SqRaRVqPTugxPwDY6JRERFRwNotULfM8uHuOEGuxRxezXmQz1qO-M_w/exec"; // URL ของ Google Script
const char* lineNotifyToken = "ij3BTrbSEN804X54cvkb4h2FdneatPFXkENlWBrXlRp"; // Token สำหรับ LINE Notify
const int switchPin = 33; // ขาเชื่อมต่อของ switch
const int LDR_PIN = 34; // ขาเชื่อมต่อของ LDR
const float GAMMA = 0.7; // ค่าคงที่ของ GAMMA สำหรับการคำนวณค่า LUX
const float RL10 = 50; // ค่าความต้านทานของ RL10
int analogValue; // ค่าที่อ่านได้จาก LDR
float voltage; // ค่าความต่างศักย์ที่คำนวณได้
float resistance; // ค่าความต้านทานที่คำนวณได้
float lux; // ค่าความสว่างที่คำนวณได้
unsigned long previousMillis = 0; // ตัวแปรเก็บค่าเวลาที่ผ่านมา
const long interval = 10000; // ช่วงเวลาที่ต้องการให้ทำงาน (10 วินาที)
const long duration = 600000; // ระยะเวลารวมที่ให้ทำงาน (10 นาที)
unsigned long startMillis; // ตัวแปรเก็บค่าเวลาที่เริ่มต้น
const float LUX_THRESHOLD = 90000.0; // ค่าความสว่างที่กำหนดเป็นเกณฑ์ (90%)
void setup()
{
Serial.begin(9600); // เริ่มการสื่อสารผ่าน Serial
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C))
{
Serial.println(F("failed to start SSD1306 OLED")); // ถ้าเริ่มการทำงานของ OLED ไม่สำเร็จ
while (1); // หยุดการทำงาน
}
oled.clearDisplay(); // ล้างหน้าจอ OLED
oled.setTextSize(1); // ตั้งขนาดตัวอักษร
oled.setTextColor(WHITE); // ตั้งค่าสีของตัวอักษรเป็นสีขาว
pinMode(switchPin, INPUT); // ตั้งค่า switchPin เป็นขาเข้า
pinMode(LDR_PIN, INPUT); // ตั้งค่า LDR_PIN เป็นขาเข้า
WiFi.begin(ssid, password); // เริ่มการเชื่อมต่อ WiFi
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi..."); // แสดงข้อความขณะกำลังเชื่อมต่อ WiFi
}
Serial.println("Connected to WiFi"); // แสดงข้อความเมื่อเชื่อมต่อ WiFi สำเร็จ
configTime(25200, 0, "pool.ntp.org", "time.nist.gov"); // ตั้งค่าการเชื่อมต่อเวลา
startMillis = millis(); // บันทึกเวลาที่เริ่มต้น
}
void sendLineNotification(String message) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin("https://notify-api.line.me/api/notify"); // เริ่มต้น HTTP request
http.addHeader("Authorization", "Bearer " + String(lineNotifyToken)); // เพิ่ม header สำหรับการตรวจสอบตัวตน
http.addHeader("Content-Type", "application/x-www-form-urlencoded"); // เพิ่ม header สำหรับ content type
String payload = "message=" + message;
int httpCode = http.POST(payload); // ส่ง HTTP POST request
if (httpCode > 0) {
String response = http.getString(); // อ่านการตอบกลับจากเซิร์ฟเวอร์
Serial.println(response); // แสดงการตอบกลับ
} else {
Serial.print("Error code: ");
Serial.println(httpCode); // แสดงรหัสข้อผิดพลาดถ้ามี
}
http.end(); // สิ้นสุดการเชื่อมต่อ HTTP
} else {
Serial.println("WiFi not connected."); // แสดงข้อความถ้า WiFi ไม่ได้เชื่อมต่อ
}
}
void loop()
{
unsigned long currentMillis = millis(); // อ่านเวลาในปัจจุบัน
analogValue = analogRead(LDR_PIN); // อ่านค่าจาก LDR
voltage = analogValue * 5 / 4095.0; // คำนวณความต่างศักย์
resistance = 2000 * voltage / (1 - voltage / 5); // คำนวณความต้านทาน
lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA)); // คำนวณค่าความสว่าง
int switchState = digitalRead(switchPin); // อ่านค่าจาก switch
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Failed to obtain time"); // แสดงข้อความถ้าการอ่านเวลาล้มเหลว
}
char datetime[30];
strftime(datetime, sizeof(datetime), "%Y-%m-%d %H:%M:%S", &timeinfo); // แปลงเวลาปัจจุบันเป็นรูปแบบ string
oled.clearDisplay(); // ล้างหน้าจอ OLED
oled.setTextSize(1);
oled.setCursor(0, 0);
oled.println(datetime); // แสดงเวลาปัจจุบันบนหน้าจอ OLED
oled.setCursor(0, 32);
oled.print("Lux: ");
oled.println(lux); // แสดงค่าความสว่างบนหน้าจอ OLED
oled.setCursor(0, 16);
oled.print("Switch State: ");
oled.println(switchState); // แสดงสถานะของ switch บนหน้าจอ OLED
oled.display(); // อัพเดทหน้าจอ OLED
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (currentMillis - startMillis < duration) {
// ส่งข้อมูลไปยัง Google Sheets
HTTPClient http;
String url = String(googleScriptUrl) + "?switch=" + String(switchState) + "&lux=" + String(lux, 1);
http.begin(url);
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
int httpCode = http.GET(); // ส่ง HTTP GET request
if (httpCode > 0) {
String payload = http.getString(); // อ่านการตอบกลับจากเซิร์ฟเวอร์
Serial.println(payload); // แสดงการตอบกลับ
} else {
Serial.print("Error code: ");
Serial.println(httpCode); // แสดงรหัสข้อผิดพลาดถ้ามี
}
http.end(); // สิ้นสุดการเชื่อมต่อ HTTP
// ส่งการแจ้งเตือน LINE ถ้าสวิตซ์อยู่ที่ 0
if (switchState == 0) {
sendLineNotification("มีผู้บุกรุก"); // ส่งข้อความแจ้งเตือนเมื่อ switch อยู่ในสถานะปิด
}
// ส่งการแจ้งเตือน LINE ถ้าค่าของเซ็นเซอร์สูงกว่าค่าที่กำหนด
if (lux > LUX_THRESHOLD) {
sendLineNotification("ค่าของเซ็นเซอร์สูงกว่าค่าที่กำหนด"); // ส่งข้อความแจ้งเตือนเมื่อค่า LUX เกินเกณฑ์ที่กำหนด
}
} else {
Serial.println("10 minutes elapsed, stopping data send"); // แสดงข้อความเมื่อครบ 10 นาทีแล้วหยุดส่งข้อมูล
while (true); // หยุดการทำงาน
}
}
delay(1000); // หน่วงเวลา 1 วินาที
}