I have a board like this. ESP32S3 Wroom1. Mine is not Freenove, but everything else matches.
I want to take a photo and then halt the camera.
Sketch:
#include <AcksenButton.h>
#include "esp_camera.h"
#define BUTTON_OK_GPIO_NUM 47
AcksenButton OK_Button(BUTTON_OK_GPIO_NUM, ACKSEN_BUTTON_MODE_NORMAL, 42, INPUT_PULLUP);
void setup() {
Serial.begin(115200);
}
void loop() {
if (OK_Button.onPressed()) {
Serial.println("shooting");
initCamera();
shoot();
esp_camera_deinit();
}
OK_Button.refreshStatus();
}
//esp32s3 eye
#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 15
#define SIOD_GPIO_NUM 4
#define SIOC_GPIO_NUM 5
#define Y2_GPIO_NUM 11
#define Y3_GPIO_NUM 9
#define Y4_GPIO_NUM 8
#define Y5_GPIO_NUM 10
#define Y6_GPIO_NUM 12
#define Y7_GPIO_NUM 18
#define Y8_GPIO_NUM 17
#define Y9_GPIO_NUM 16
#define VSYNC_GPIO_NUM 6
#define HREF_GPIO_NUM 7
#define PCLK_GPIO_NUM 13
bool initCamera() {
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;
//init with high specs to pre-allocate larger buffers
if (psramFound())
{
Serial.println("\nFound PSRAM, this will improve performance!");
config.frame_size = FRAMESIZE_XGA;
config.jpeg_quality = 9;
config.fb_count = 2;
config.grab_mode = CAMERA_GRAB_LATEST;
}
else
{
Serial.println("\nWarning, PSRAM not detected. If your board has PSRAM, activate it from Tools/PSRAM ('OPI PRAM' option worked for me) !");
config.frame_size = FRAMESIZE_SVGA;
config.jpeg_quality = 12;
config.fb_count = 1;
}
#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 false;
}
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 blightness just a bit
s->set_saturation(s, -2); //lower the saturation
}
//drop down frame size for higher initial frame rate
// s->set_framesize(s, FRAMESIZE_UXGA);
#if defined(CAMERA_MODEL_M5STACK_WIDE)
s->set_vflip(s, 1);
s->set_hmirror(s, 1);
#endif
return true;
}
void shoot() {
camera_fb_t * fb = NULL;
fb = esp_camera_fb_get();
esp_camera_fb_return(fb);
Serial.print("img of length: ");
Serial.println(fb->len);
}
so when I press the button, camera inits, gets the frame buffer and outputs it's lenght followed by an error message.
Logs:
12:31:56.811 -> OK
12:31:56.811 ->
12:31:56.811 -> Found PSRAM, this will improve performance!
12:31:57.748 -> img of length: 23002
12:31:57.748 -> E (2672) gdma: gdma_disconnect(238): no peripheral is connected to the channel
there is an error:
E (2672) gdma: gdma_disconnect(238): no peripheral is connected to the channel
and I believe this blocks camera from porperly de-init esp_camera_deinit
.
Gradually board is getting quite hot after the first photo taking. When I don't take the photo it sits cool.
My question is how do I get rid of that error? Is my config bad? I need to properly de-init camera after taking the shot.
Thanks