diff --git a/projekpir.ino b/projekpir.ino new file mode 100644 index 0000000..5ce0faf --- /dev/null +++ b/projekpir.ino @@ -0,0 +1,148 @@ +#include "esp_camera.h" +#include +#include +#include + +// GANTI DENGAN INFO WIFI & FIREBASE +#define WIFI_SSID "POCO F4" +#define WIFI_PASSWORD "87654321" + +#define FIREBASE_HOST "https://sensor-pir-b5e4a-default-rtdb.asia-southeast1.firebasedatabase.app" +#define FIREBASE_AUTH "RpfA4rUpapsbfdjaHBCVHqRaw1zpLcQqkl48KPR3" + +#define PIR_PIN 13 +#define BUZZER_PIN 15 + +FirebaseData firebaseData; +FirebaseAuth auth; +FirebaseConfig config; + +WebServer server(80); +bool pirStatePrev = LOW; + +void startCameraServer(); + +void setup() { + Serial.begin(115200); + + pinMode(PIR_PIN, INPUT); + pinMode(BUZZER_PIN, OUTPUT); + digitalWrite(BUZZER_PIN, LOW); + + camera_config_t configCam; + configCam.ledc_channel = LEDC_CHANNEL_0; + configCam.ledc_timer = LEDC_TIMER_0; + configCam.pin_d0 = 5; + configCam.pin_d1 = 18; + configCam.pin_d2 = 19; + configCam.pin_d3 = 21; + configCam.pin_d4 = 36; + configCam.pin_d5 = 39; + configCam.pin_d6 = 34; + configCam.pin_d7 = 35; + configCam.pin_xclk = 0; + configCam.pin_pclk = 22; + configCam.pin_vsync = 25; + configCam.pin_href = 23; + configCam.pin_sscb_sda = 26; + configCam.pin_sscb_scl = 27; + configCam.pin_pwdn = 32; + configCam.pin_reset = -1; + configCam.xclk_freq_hz = 20000000; + configCam.pixel_format = PIXFORMAT_JPEG; + + if (psramFound()) { + configCam.frame_size = FRAMESIZE_VGA; + configCam.jpeg_quality = 10; + configCam.fb_count = 2; + } else { + configCam.frame_size = FRAMESIZE_CIF; + configCam.jpeg_quality = 12; + configCam.fb_count = 1; + } + + if (esp_camera_init(&configCam) != ESP_OK) { + Serial.println("Camera init failed"); + return; + } + + WiFi.begin(WIFI_SSID, WIFI_PASSWORD); + Serial.print("Connecting to WiFi"); + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println("\nWiFi connected"); + Serial.print("IP address: "); + Serial.println(WiFi.localIP()); + + config.database_url = FIREBASE_HOST; + config.signer.tokens.legacy_token = FIREBASE_AUTH; + + Firebase.begin(&config, &auth); + Firebase.reconnectWiFi(true); + + Firebase.setString(firebaseData, "/status/kamera", "aktif"); + + startCameraServer(); +} + +void loop() { + int pirState = digitalRead(PIR_PIN); + + if (pirState == HIGH && pirStatePrev == LOW) { + digitalWrite(BUZZER_PIN, HIGH); + Serial.println("Motion detected!"); + Firebase.setString(firebaseData, "/status/pir", "gerakan terdeteksi"); + Firebase.setString(firebaseData, "/status/buzzer", "aktif"); + } + else if (pirState == LOW && pirStatePrev == HIGH) { + digitalWrite(BUZZER_PIN, LOW); + Firebase.setString(firebaseData, "/status/pir", "tidak ada gerakan"); + Firebase.setString(firebaseData, "/status/buzzer", "mati"); + } + + pirStatePrev = pirState; + server.handleClient(); + delay(100); +} + +void handle_jpg_stream() { + WiFiClient client = server.client(); + + String response = "HTTP/1.1 200 OK\r\n"; + response += "Content-Type: multipart/x-mixed-replace; boundary=frame\r\n\r\n"; + server.sendContent(response); + + while (client.connected()) { + camera_fb_t* fb = esp_camera_fb_get(); + if (!fb) { + Serial.println("Camera capture failed"); + break; + } + + response = "--frame\r\n"; + response += "Content-Type: image/jpeg\r\n\r\n"; + server.sendContent(response); + + client.write(fb->buf, fb->len); + server.sendContent("\r\n"); + + esp_camera_fb_return(fb); + delay(30); + } +} + +void handle_root() { + String html = "ESP32-CAM"; + html += "

ESP32-CAM PIR & Buzzer

"; + html += ""; + html += ""; + server.send(200, "text/html", html); +} + +void startCameraServer() { + server.on("/", handle_root); + server.on("/stream", HTTP_GET, handle_jpg_stream); + server.begin(); +}