#include #include #include "soc/soc.h" #include "soc/rtc_cntl_reg.h" #include "esp_camera.h" // Koneksi WiFi const char *ssid = "Arif"; const char *password = "sijisiji"; // Server Details String serverName = "192.168.197.197"; String serverPath = "/rfidcam/WebAbsen.php"; const int serverPort = 80; WiFiClient client; // Konfigurasi Pin Kamera #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 // Konstanta dan Variabel Global const int timerInterval = 10000; // time between each HTTP POST image unsigned long previousMillis = 0; // last time image was sent const int pinLed1 = 33; // led merah const int pinLed2 = 4; // flash const int Stat = 13; // pin data // Fungsi Setup void setup() { WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); Serial.begin(115200); WiFi.mode(WIFI_OFF); delay(1000); WiFi.mode(WIFI_STA); pinMode(pinLed1, OUTPUT); digitalWrite(pinLed1, HIGH); pinMode(pinLed2, OUTPUT); pinMode(Stat, INPUT); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(); Serial.print("IP Address: "); Serial.println(WiFi.localIP()); camera_config_t config; 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; // init with high specs to pre-allocate larger buffers if (psramFound()) { config.frame_size = FRAMESIZE_SVGA; config.jpeg_quality = 10; // 0-63 lower number means higher quality config.fb_count = 2; } else { config.frame_size = FRAMESIZE_CIF; config.jpeg_quality = 12; // 0-63 lower number means higher quality 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); delay(1000); ESP.restart(); } digitalWrite(pinLed1, LOW); } boolean statusStata = false; // Fungsi Reset Kamera void resetCamera() { // Deinisialisasi kamera esp_camera_deinit(); // Add a delay to ensure camera de-initialization is complete delay(1000); // Initialize the camera again camera_config_t config; 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; if (psramFound()) { config.frame_size = FRAMESIZE_SVGA; config.jpeg_quality = 10; config.fb_count = 2; } else { config.frame_size = FRAMESIZE_CIF; config.jpeg_quality = 12; config.fb_count = 1; } esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Serial.printf("Camera re-init failed with error 0x%x", err); delay(1000); ESP.restart(); } } // Fungsi Loop (melakukan looping) void loop() { int stat = digitalRead(Stat); if (!stat) { if (!statusStata) { Serial.println("capture"); sendPhoto(); } statusStata = true; } else { statusStata = false; } } // Fungsi Mengirim Foto String sendPhoto() { String getAll; String getBody; digitalWrite(pinLed2, HIGH); // Reset camera before taking a new photo resetCamera(); delay(500); camera_fb_t *fb = esp_camera_fb_get(); if (!fb) { Serial.println("Camera capture failed"); delay(1000); ESP.restart(); } Serial.println("Connecting to server: " + serverName); // koneksi ke server if (client.connect(serverName.c_str(), serverPort)) { Serial.println("Connection successful!"); // Membuat Header dan Tail untuk HTTP POST Request String head = "--RandomNerdTutorials\r\nContent-Disposition: form-data; name=\"imageFile\"; filename=\".jpg\"\r\nContent-Type: image/jpeg\r\n\r\n"; String tail = "\r\n--RandomNerdTutorials--\r\n"; uint32_t imageLen = fb->len; uint32_t extraLen = head.length() + tail.length(); uint32_t totalLen = imageLen + extraLen; // Mengirim HTTP POST Request client.println("POST " + serverPath + " HTTP/1.1"); client.println("Host: " + serverName); client.println("Content-Length: " + String(totalLen)); client.println("Content-Type: multipart/form-data; boundary=RandomNerdTutorials"); client.println(); client.print(head); // mengirim data gambar uint8_t *fbBuf = fb->buf; size_t fbLen = fb->len; for (size_t n = 0; n < fbLen; n += 1024) { if (n + 1024 < fbLen) { client.write(fbBuf, 1024); fbBuf += 1024; } else if (fbLen % 1024 > 0) { size_t remainder = fbLen % 1024; client.write(fbBuf, remainder); } } client.print(tail); esp_camera_fb_return(fb); int timeoutTimer = 10000; long startTimer = millis(); boolean state = false; while ((startTimer + timeoutTimer) > millis()) { Serial.print("."); delay(100); while (client.available()) { char c = client.read(); if (c == '\n') { if (getAll.length() == 0) { state = true; } getAll = ""; } else if (c != '\r') { getAll += String(c); } if (state == true) { getBody += String(c); } startTimer = millis(); } if (getBody.length() > 0) { break; } } Serial.println(); client.stop(); Serial.println(getBody); } else { getBody = "Connection to " + serverName + " failed."; Serial.println(getBody); } digitalWrite(pinLed2, LOW); return getBody; }