From b8034308c741d284abdccaae2eaf63adafb5ca84 Mon Sep 17 00:00:00 2001 From: SahrulGunawan10 Date: Tue, 16 Jul 2024 14:48:14 +0700 Subject: [PATCH] Project TA - Securify --- Kode Arduino/CodeTA-V2.1/CodeTA-V2.1.ino | 118 ++++++++++ .../TA-CAMHTTPCLIENT/TA-CAMHTTPCLIENT.ino | 217 ++++++++++++++++++ 2 files changed, 335 insertions(+) create mode 100644 Kode Arduino/CodeTA-V2.1/CodeTA-V2.1.ino create mode 100644 Kode Arduino/TA-CAMHTTPCLIENT/TA-CAMHTTPCLIENT.ino diff --git a/Kode Arduino/CodeTA-V2.1/CodeTA-V2.1.ino b/Kode Arduino/CodeTA-V2.1/CodeTA-V2.1.ino new file mode 100644 index 0000000..c7e18a7 --- /dev/null +++ b/Kode Arduino/CodeTA-V2.1/CodeTA-V2.1.ino @@ -0,0 +1,118 @@ +#include +#include +#include "SinricPro.h" +#include "SinricProSwitch.h" + +// INITIALISASI WIFI & SINRIC PRO & BAUD RATE +#define WIFI_SSID "LAPTOPKEREN" // WIFI_SSID +#define WIFI_PASS "akuharusbisa" // WIFI_PASS +#define APP_KEY "01c3e7f5-43b6-41a3-946c-31e25cc64aa7" // App Key Sinric Pro +#define APP_SECRET "e46d9a8d-f31f-4b29-858f-9fd9ff90489b-b78405a9-f241-4a18-9fe4-77a6acd61b91" // App Secret Sinric Pro +#define SWITCH_ID_1 "6630d9cabfef1b4f30c7514d" // Device Id Sinric Pro +#define BAUD_RATE 115200 + +// INITIALISASI PERANGKAT +#define RELAYPIN_1 5 //D1 +#define pinAlarm 12 //D6 +#define pinGetar 14 //D5 + +// Pin for communication with ESP32CAM +const int AksesPintu = 4; // D2 +const int DeteksiAncaman = 13; // D7 + +void setup() { + Serial.begin(BAUD_RATE); + setupWiFi(); + setupSinricPro(); + pinMode(pinGetar, INPUT); + pinMode(pinAlarm, OUTPUT); + + // Komunikasi Cam + pinMode(AksesPintu, OUTPUT); + digitalWrite(AksesPintu, LOW); + + pinMode(DeteksiAncaman, OUTPUT); + digitalWrite(DeteksiAncaman, LOW); +} + +bool onPowerState1(const String &deviceId, bool &state) { + Serial.printf("Device 1 turned %s", state ? "on" : "off"); + digitalWrite(RELAYPIN_1, state ? LOW : HIGH); + if (state) { // Jika relay ON + digitalWrite(AksesPintu, HIGH); + delay(10); + digitalWrite(AksesPintu, LOW); + } + return true; +} + + + +// setup function for WiFi connection +void setupWiFi() { + Serial.printf("\r\n[Wifi]: Connecting"); + + WiFi.setSleepMode(WIFI_NONE_SLEEP); + WiFi.setAutoReconnect(true); + WiFi.begin(WIFI_SSID, WIFI_PASS); + + while (WiFi.status() != WL_CONNECTED) { + Serial.printf("."); + delay(250); + } + + Serial.printf("connected!\r\n[WiFi]: IP-Address is %s\r\n", WiFi.localIP().toString().c_str()); +} + +// setup function for SinricPro +void setupSinricPro() { + // add devices and callbacks to SinricPro + pinMode(RELAYPIN_1, OUTPUT); + + SinricProSwitch& mySwitch1 = SinricPro[SWITCH_ID_1]; + mySwitch1.onPowerState(onPowerState1); + + // setup SinricPro + SinricPro.onConnected([](){ Serial.printf("Connected to SinricPro\r\n"); }); + SinricPro.onDisconnected([](){ Serial.printf("Disconnected from SinricPro\r\n"); }); + + SinricPro.begin(APP_KEY, APP_SECRET); +} + + +void loop() { + // Sinric Pro + SinricPro.handle(); + + // Membaca nilai Sensor Getar + int PinValue = digitalRead(pinGetar); + + // Mengecek kondisi Relay + bool relayOff = digitalRead(RELAYPIN_1); + + // Jalankan Sensor Getar Jika Relay OFF +if (relayOff) { + if (PinValue == HIGH) { + digitalWrite(pinAlarm, HIGH); + digitalWrite(DeteksiAncaman, HIGH); + + Serial.println("Peringatan Ancaman!!!"); + delay(5000); //Durasi bunyi buzzer + + digitalWrite(DeteksiAncaman, LOW); + digitalWrite(pinAlarm, LOW); + } else { + digitalWrite(pinAlarm, LOW); + Serial.println("Tidak ada Ancaman"); + digitalWrite(DeteksiAncaman, LOW); + } +} else { + // Jika Relay ON maka hentikan Sensor Getar + digitalWrite(pinAlarm, LOW); + digitalWrite(DeteksiAncaman, LOW); +} + + + delay(100); +} + diff --git a/Kode Arduino/TA-CAMHTTPCLIENT/TA-CAMHTTPCLIENT.ino b/Kode Arduino/TA-CAMHTTPCLIENT/TA-CAMHTTPCLIENT.ino new file mode 100644 index 0000000..4bb90f7 --- /dev/null +++ b/Kode Arduino/TA-CAMHTTPCLIENT/TA-CAMHTTPCLIENT.ino @@ -0,0 +1,217 @@ +#include +#include +#include +#include +#include +#include +#include "Arduino.h" +#include "esp_camera.h" +#include "soc/soc.h" +#include "soc/rtc_cntl_reg.h" +#include "base64.h" + +// WiFi credentials +const char* ssid = "LAPTOPKEREN"; +const char* password = "akuharusbisa"; + +// Perintah untuk Capture +#define AksesPintu 14 +#define DeteksiAncaman 15 +#define LED 4 + +// Firebase project reference URL +const char* CodeRegistration = "Home-270624"; +const char* baseURL = "https://securify-apps-default-rtdb.firebaseio.com/"; +String DATABASE_URL = String(baseURL) + CodeRegistration + ".json"; + +// Define OV2640 camera +#define PWDN_GPIO_NUM 32 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 0 +#define SIOD_GPIO_NUM 26 +#define SIOC_GPIO_NUM 27 +#define Y9_GPIO_NUM 35 +#define Y8_GPIO_NUM 34 +#define Y7_GPIO_NUM 39 +#define Y6_GPIO_NUM 36 +#define Y5_GPIO_NUM 21 +#define Y4_GPIO_NUM 19 +#define Y3_GPIO_NUM 18 +#define Y2_GPIO_NUM 5 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 23 +#define PCLK_GPIO_NUM 22 + +camera_config_t config; + +// NTP Client +WiFiUDP ntpUDP; +NTPClient timeClient(ntpUDP, "pool.ntp.org"); +time_t epochTime = 0; // variable to store UNIX timestamp + +void initCamera() { + // OV2640 camera module + config.ledc_channel = LEDC_CHANNEL_0; + config.ledc_timer = LEDC_TIMER_0; + config.pin_d0 = Y2_GPIO_NUM; + config.pin_d1 = Y3_GPIO_NUM; + config.pin_d2 = Y4_GPIO_NUM; + config.pin_d3 = Y5_GPIO_NUM; + config.pin_d4 = Y6_GPIO_NUM; + config.pin_d5 = Y7_GPIO_NUM; + config.pin_d6 = Y8_GPIO_NUM; + config.pin_d7 = Y9_GPIO_NUM; + config.pin_xclk = XCLK_GPIO_NUM; + config.pin_pclk = PCLK_GPIO_NUM; + config.pin_vsync = VSYNC_GPIO_NUM; + config.pin_href = HREF_GPIO_NUM; + config.pin_sscb_sda = SIOD_GPIO_NUM; + config.pin_sscb_scl = SIOC_GPIO_NUM; + config.pin_pwdn = PWDN_GPIO_NUM; + config.pin_reset = RESET_GPIO_NUM; + config.xclk_freq_hz = 20000000; + config.pixel_format = PIXFORMAT_JPEG; + config.frame_size = FRAMESIZE_QVGA; + config.jpeg_quality = 20; // Set image quality 0 - 64 + config.fb_count = 1; + + // Camera init + esp_err_t err = esp_camera_init(&config); + if (err != ESP_OK) { + Serial.printf("Camera init failed with error 0x%x", err); + ESP.restart(); + } +} + +void setup() { + Serial.begin(115200); + + pinMode(AksesPintu, INPUT); + digitalWrite(AksesPintu, LOW); + pinMode(DeteksiAncaman, INPUT); + digitalWrite(DeteksiAncaman, LOW); + pinMode(LED, OUTPUT); + + WiFi.begin(ssid, password); + while (WiFi.status() != WL_CONNECTED) { + delay(1000); + Serial.println("Connecting to WiFi..."); + } + Serial.println("Connected to WiFi."); + Serial.println(WiFi.localIP()); + + // Initialize camera + initCamera(); + + // Initialize NTP client + timeClient.begin(); + timeClient.setTimeOffset(25200); //(GMT+7:00) + + while (epochTime == 0) { + timeClient.update(); + epochTime = timeClient.getEpochTime(); + delay(100); + } +} + +void captureAndSendPhoto(String keterangan) { + // Memastikan Buffer dibersihkan + camera_fb_t* fb = NULL; + fb = esp_camera_fb_get(); + if (fb) { + esp_camera_fb_return(fb); + } + + delay(500); + + // Capture photo + fb = esp_camera_fb_get(); + if (!fb) { + Serial.println("Camera capture failed"); + return; + } + + digitalWrite(LED, HIGH); + delay(30); + digitalWrite(LED, LOW); + + // Mengubah image to base64 + String base64Image = base64::encode(fb->buf, fb->len); + + // Bersihkan frame buffer kembali + esp_camera_fb_return(fb); + + // Get current time + timeClient.update(); + epochTime = timeClient.getEpochTime(); + + // Convert UNIX timestamp to local time and date + struct tm* localTime = localtime(&epochTime); + + // Format Waktu dan Tanggal + char timeStr[9]; + sprintf(timeStr, "%02d:%02d:%02d", localTime->tm_hour, localTime->tm_min, localTime->tm_sec); + char dateStr[11]; + sprintf(dateStr, "%02d-%02d-%04d", localTime->tm_mday, localTime->tm_mon + 1, localTime->tm_year + 1900); + + // Create a JSON object to hold your data + DynamicJsonDocument jsonDoc(200); + + // Add data to the JSON object + jsonDoc["img"] = base64Image; + jsonDoc["keterangan"] = keterangan; + jsonDoc["Tanggal"] = dateStr; + jsonDoc["waktu"] = timeStr; + + // Convert JSON object to string + String jsonData; + serializeJson(jsonDoc, jsonData); + + // Send JSON data to Firebase using HTTP POST + HTTPClient http; + http.begin(DATABASE_URL); + http.addHeader("Content-Type", "application/json"); + int httpResponseCode = http.POST(jsonData); + + if (httpResponseCode > 0) { + Serial.print("HTTP Response code: "); + Serial.println(httpResponseCode); + Serial.println("Data sent to Firebase."); + } else { + Serial.print("Error sending data to Firebase. HTTP error code: "); + Serial.println(httpResponseCode); + } + + http.end(); +} + +// Deklarasi variabel status +bool statusAksesPintu = false; +bool statusDeteksiAncaman = false; + +void loop() { + // Membaca status pin + int aksesPintuStat = digitalRead(AksesPintu); + int deteksiAncamanStat = digitalRead(DeteksiAncaman); + + // Cek perubahan status pada kedua pin + bool aksesPintuChanged = (aksesPintuStat == HIGH && !statusAksesPintu); + bool deteksiAncamanChanged = (deteksiAncamanStat == HIGH && !statusDeteksiAncaman); + + // Jika salah satu atau kedua pin berubah menjadi HIGH + if (aksesPintuChanged || deteksiAncamanChanged) { + String keterangan; + if (aksesPintuChanged) { + keterangan = "Pintu Terbuka"; + } else if (deteksiAncamanChanged) { + keterangan = "Peringatan Ancaman"; + } + captureAndSendPhoto(keterangan); + } + + // Perbarui status pin + statusAksesPintu = (aksesPintuStat == HIGH); + statusDeteksiAncaman = (deteksiAncamanStat == HIGH); + + delay(10); +}