Project TA - Securify
This commit is contained in:
parent
2138ab9055
commit
b8034308c7
|
@ -0,0 +1,118 @@
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <ESP8266WiFi.h>
|
||||||
|
#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);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,217 @@
|
||||||
|
#include <WiFi.h>
|
||||||
|
#include <NTPClient.h>
|
||||||
|
#include <WiFiUdp.h>
|
||||||
|
#include <ctime>
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
#include <HTTPClient.h>
|
||||||
|
#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);
|
||||||
|
}
|
Loading…
Reference in New Issue