Last active
November 27, 2024 15:24
-
-
Save rcervera/7a4a30da3ce3789379e44d45d21a8b4d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include "esp_camera.h" | |
| #include <WiFi.h> | |
| #include <HTTPClient.h> | |
| #include <WebServer.h> | |
| #define CAMERA_MODEL_AI_THINKER // Has PSRAM | |
| #include "camera_pins.h" | |
| // =========================== | |
| // Enter your WiFi credentials | |
| // =========================== | |
| const char *ssid = ""; | |
| const char *password = ""; | |
| void startCameraServer(); | |
| void setupLedFlash(int pin); | |
| WebServer server(80); | |
| void handleTakePhoto() { | |
| camera_fb_t *fb = esp_camera_fb_get(); | |
| if (!fb) { | |
| Serial.println("Error capturant la imatge"); | |
| server.send(500, "text/plain", "Error capturant la imatge"); | |
| return; | |
| } | |
| server.sendHeader("Content-Disposition", "inline; filename=capture.jpg"); | |
| server.send_P(200, "image/jpeg", (const char *)fb->buf, fb->len); | |
| esp_camera_fb_return(fb); | |
| } | |
| void setup() { | |
| Serial.begin(115200); | |
| Serial.setDebugOutput(true); | |
| Serial.println(); | |
| 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_sccb_sda = SIOD_GPIO_NUM; | |
| config.pin_sccb_scl = SIOC_GPIO_NUM; | |
| config.pin_pwdn = PWDN_GPIO_NUM; | |
| config.pin_reset = RESET_GPIO_NUM; | |
| config.xclk_freq_hz = 20000000; | |
| config.frame_size = FRAMESIZE_QVGA; // FRAMESIZE_UXGA; | |
| config.pixel_format = PIXFORMAT_JPEG; // for streaming | |
| //config.pixel_format = PIXFORMAT_RGB565; // for face detection/recognition | |
| config.grab_mode = CAMERA_GRAB_WHEN_EMPTY; | |
| config.fb_location = CAMERA_FB_IN_PSRAM; | |
| config.jpeg_quality = 12; | |
| config.fb_count = 1; | |
| // if PSRAM IC present, init with UXGA resolution and higher JPEG quality | |
| // for larger pre-allocated frame buffer. | |
| if (config.pixel_format == PIXFORMAT_JPEG) { | |
| if (psramFound()) { | |
| config.jpeg_quality = 10; | |
| config.fb_count = 2; | |
| config.grab_mode = CAMERA_GRAB_LATEST; | |
| } else { | |
| // Limit the frame size when PSRAM is not available | |
| config.frame_size = FRAMESIZE_SVGA; | |
| config.fb_location = CAMERA_FB_IN_DRAM; | |
| } | |
| } else { | |
| // Best option for face detection/recognition | |
| config.frame_size = FRAMESIZE_240X240; | |
| #if CONFIG_IDF_TARGET_ESP32S3 | |
| config.fb_count = 2; | |
| #endif | |
| } | |
| #if defined(CAMERA_MODEL_ESP_EYE) | |
| pinMode(13, INPUT_PULLUP); | |
| pinMode(14, INPUT_PULLUP); | |
| #endif | |
| // camera init | |
| esp_err_t err = esp_camera_init(&config); | |
| if (err != ESP_OK) { | |
| Serial.printf("Camera init failed with error 0x%x", err); | |
| return; | |
| } | |
| sensor_t *s = esp_camera_sensor_get(); | |
| // initial sensors are flipped vertically and colors are a bit saturated | |
| if (s->id.PID == OV3660_PID) { | |
| //s->set_vflip(s, 1); // flip it back | |
| s->set_brightness(s, 1); // up the brightness just a bit | |
| s->set_saturation(s, -1); // lower the saturation | |
| } | |
| // Augmenta la resolució si vols imatges més detallades | |
| s->set_framesize(s, FRAMESIZE_UXGA); // Millor resolució (UXGA) si PSRAM està disponible | |
| // Ajusta la qualitat JPEG (més baixa millora la qualitat) | |
| config.jpeg_quality = 8; // Millora la qualitat reduint el valor | |
| // Ajustos addicionals per a una millor qualitat | |
| s->set_contrast(s, 1); // Augmenta el contrast | |
| s->set_sharpness(s, 2); // Augmenta la nitidesa | |
| s->set_whitebal(s, 1); // Activa el balanç de blancs automàtic | |
| s->set_gain_ctrl(s, 1); // Activa el control de guany automàtic | |
| s->set_exposure_ctrl(s, 1); // Activa el control d'exposició automàtic | |
| s->set_awb_gain(s, 1); // Activa el guany de balanç de blancs automàtic | |
| s->set_aec2(s, 1); // Activa el control d'exposició automàtic addicional | |
| // drop down frame size for higher initial frame rate | |
| if (config.pixel_format == PIXFORMAT_JPEG) { | |
| s->set_framesize(s, FRAMESIZE_QVGA); | |
| } | |
| #if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM) | |
| s->set_vflip(s, 1); | |
| s->set_hmirror(s, 1); | |
| #endif | |
| #if defined(CAMERA_MODEL_ESP32S3_EYE) | |
| s->set_vflip(s, 1); | |
| #endif | |
| // Setup LED FLash if LED pin is defined in camera_pins.h | |
| #if defined(LED_GPIO_NUM) | |
| setupLedFlash(LED_GPIO_NUM); | |
| #endif | |
| WiFi.begin(ssid, password); | |
| WiFi.setSleep(false); | |
| while (WiFi.status() != WL_CONNECTED) { | |
| delay(500); | |
| Serial.print("."); | |
| } | |
| Serial.println(""); | |
| Serial.println("WiFi connected"); | |
| //startCameraServer(); | |
| server.on("/take_photo", HTTP_GET, handleTakePhoto); | |
| server.begin(); | |
| Serial.print("Camera Ready! Use 'http://"); | |
| Serial.print(WiFi.localIP()); | |
| Serial.println("' to connect"); | |
| } | |
| void loop() { | |
| // Do nothing. Everything is done in another task by the web server | |
| server.handleClient(); | |
| // delay(10000); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment