You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
187 lines
6.2 KiB
187 lines
6.2 KiB
#include "esp_camera.h" |
|
#include <WiFi.h> |
|
|
|
// |
|
// WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality |
|
// Ensure ESP32 Wrover Module or other board with PSRAM is selected |
|
// Partial images will be transmitted if image exceeds buffer size |
|
// |
|
// You must select partition scheme from the board menu that has at least 3MB APP space. |
|
// Face Recognition is DISABLED for ESP32 and ESP32-S2, because it takes up from 15 |
|
// seconds to process single frame. Face Detection is ENABLED if PSRAM is enabled as well |
|
#define PIN_BOARD_LED 33 // Board LED (small red) |
|
// Define I2C Pins for I2C. Remap from default pins 21 and 22. |
|
#define I2C_SDA 14 |
|
#define I2C_SCL 15 |
|
#include <Arduino.h> |
|
#include <GyverOLED.h> |
|
GyverOLED<SSD1306_128x64> oled(0x3C); |
|
|
|
// =================== |
|
// Select camera model |
|
// =================== |
|
//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM |
|
//#define CAMERA_MODEL_ESP_EYE // Has PSRAM |
|
//#define CAMERA_MODEL_ESP32S3_EYE // Has PSRAM |
|
//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM |
|
//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM |
|
//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM |
|
//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM |
|
//#define CAMERA_MODEL_M5STACK_UNITCAM // No PSRAM |
|
#define CAMERA_MODEL_AI_THINKER // Has PSRAM |
|
//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM |
|
//#define CAMERA_MODEL_XIAO_ESP32S3 // Has PSRAM |
|
// ** Espressif Internal Boards ** |
|
//#define CAMERA_MODEL_ESP32_CAM_BOARD |
|
//#define CAMERA_MODEL_ESP32S2_CAM_BOARD |
|
//#define CAMERA_MODEL_ESP32S3_CAM_LCD |
|
//#define CAMERA_MODEL_DFRobot_FireBeetle2_ESP32S3 // Has PSRAM |
|
//#define CAMERA_MODEL_DFRobot_Romeo_ESP32S3 // Has PSRAM |
|
#include "camera_pins.h" |
|
|
|
// =========================== |
|
// Enter your WiFi credentials |
|
// =========================== |
|
const char* ssid = "Extender_9613F5"; |
|
const char* password = "repytwjd"; |
|
|
|
void startCameraServer(); |
|
void setupLedFlash(int pin); |
|
|
|
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_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.frame_size = FRAMESIZE_SVGA; |
|
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_SVGA; |
|
config.frame_size = FRAMESIZE_240X240; |
|
#if CONFIG_IDF_TARGET_ESP32S3 |
|
config.fb_count = 2; |
|
#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, -2); // lower the saturation |
|
} |
|
// drop down frame size for higher initial frame rate |
|
if(config.pixel_format == PIXFORMAT_JPEG){ |
|
s->set_framesize(s, FRAMESIZE_SVGA); |
|
s->set_vflip(s, 1); |
|
s->set_hmirror(s, 1); |
|
} |
|
|
|
#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(); |
|
|
|
Serial.print("Camera Ready! Use 'http://"); |
|
Serial.print(WiFi.localIP()); |
|
Serial.println("' to connect"); |
|
Wire.setPins(I2C_SDA, I2C_SCL); // Map SDA and SCL to new pins |
|
oled.init(); // инициализация |
|
oled.clear(); // очистить дисплей (или буфер) |
|
oled.update(); // обновить. Только для режима с буфером! OLED_BUFFER |
|
|
|
oled.home(); // курсор в 0,0 |
|
oled.println("Hello!"); // печатай что угодно: числа, строки, float, как Serial! |
|
oled.setContrast(10); // яркость 0..255 |
|
oled.update(); |
|
|
|
oled.println(WiFi.localIP()); |
|
oled.update(); |
|
} |
|
|
|
void loop() |
|
{ |
|
oled.clear(); // очистить дисплей (или буфер) |
|
oled.home(); // курсор в 0,0 |
|
oled.print("IP: "); |
|
oled.println(WiFi.localIP()); // печатай что угодно: числа, строки, float, как Serial! |
|
oled.print("RSSI: "); |
|
oled.println(WiFi.RSSI()); // печатай что угодно: числа, строки, float, как Serial! |
|
oled.update(); |
|
delay(1000); |
|
|
|
// tmr = millis(); |
|
// static uint32_t tmr; |
|
// if (millis() - tmr >= 1000) |
|
// { |
|
// } |
|
}
|
|
|