2#ifdef USE_CAMERA_MODULE
11#define ENABLE_RTSPSERVER
14#define ENABLE_RTSPSERVER
16#ifdef ENABLE_RTSPSERVER
24WiFiServer _rtspServer(8554);
30#include "esp_camera.h"
34#include "soc/rtc_cntl_reg.h"
40#define PWDN_GPIO_NUM -1
41#define RESET_GPIO_NUM 15
42#define XCLK_GPIO_NUM 27
43#define SIOD_GPIO_NUM 25
44#define SIOC_GPIO_NUM 23
55#define VSYNC_GPIO_NUM 22
56#define HREF_GPIO_NUM 26
57#define PCLK_GPIO_NUM 21
59#define CAMERA_LED_GPIO 2
61#define BAT_OUTPUT_HOLD_PIN 33
67int _pictureNumber = 0;
80 struct timeval timestamp;
86void initCameraSensor();
89camera_config_t _cameraConfig;
92void setup_CameraModule()
94 SerialDebug.println(
"setup_CameraModule");
100 WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
102 _cameraConfig.ledc_channel = LEDC_CHANNEL_0;
103 _cameraConfig.ledc_timer = LEDC_TIMER_0;
104 _cameraConfig.pin_d0 = Y2_GPIO_NUM;
105 _cameraConfig.pin_d1 = Y3_GPIO_NUM;
106 _cameraConfig.pin_d2 = Y4_GPIO_NUM;
107 _cameraConfig.pin_d3 = Y5_GPIO_NUM;
108 _cameraConfig.pin_d4 = Y6_GPIO_NUM;
109 _cameraConfig.pin_d5 = Y7_GPIO_NUM;
110 _cameraConfig.pin_d6 = Y8_GPIO_NUM;
111 _cameraConfig.pin_d7 = Y9_GPIO_NUM;
112 _cameraConfig.pin_xclk = XCLK_GPIO_NUM;
113 _cameraConfig.pin_pclk = PCLK_GPIO_NUM;
114 _cameraConfig.pin_vsync = VSYNC_GPIO_NUM;
115 _cameraConfig.pin_href = HREF_GPIO_NUM;
116 _cameraConfig.pin_sscb_sda = SIOD_GPIO_NUM;
117 _cameraConfig.pin_sscb_scl = SIOC_GPIO_NUM;
118 _cameraConfig.pin_pwdn = PWDN_GPIO_NUM;
119 _cameraConfig.pin_reset = RESET_GPIO_NUM;
120 _cameraConfig.xclk_freq_hz = 20000000;
121 _cameraConfig.pixel_format = PIXFORMAT_JPEG;
127 _cameraConfig.frame_size = FRAMESIZE_UXGA;
130 _cameraConfig.jpeg_quality = 12;
131 _cameraConfig.fb_count = 2;
137 _cameraConfig.frame_size = FRAMESIZE_SVGA;
138 _cameraConfig.jpeg_quality = 12;
139 _cameraConfig.fb_count = 1;
143 esp_err_t err = esp_camera_init(&_cameraConfig);
146 SerialError.printf(
"Camera init failed with error 0x%x", err);
149 SerialTemp.println(
"*** Camera Initialized ****");
154#ifdef ENABLE_RTSPSERVER
160 WiFi.begin(
"SunnyWhiteriver",
"sunny2021");
167 while (WiFi.status() != WL_CONNECTED)
170 SerialDebug.print(F(
"."));
175 SerialDebug.println(F(
"WiFi connected"));
176 SerialDebug.println(
"");
177 SerialDebug.println(ip);
178 SerialDebug.print(
"Stream Link: rtsp://");
179 SerialDebug.print(ip);
180 SerialDebug.println(
":8554/mjpeg/1");
184#ifdef ENABLE_RTSPSERVER
192void ssidDetected_MessageCallback(
char *message)
194 SerialDebug.printf(
"TODO ssidDetected_MessageCallback %s\n", message);
199void initCameraSensor()
202 sensor_t *s = esp_camera_sensor_get();
206 s->set_brightness(s, 1);
207 s->set_saturation(s, -2);
209 s->set_hmirror(s, 0);
215 SerialTemp.println(
"*** Camera Sensor Initialized ****");
218#ifdef ENABLE_RTSPSERVER
219CStreamer *_rtsp_streamer;
220CRtspSession *_rtsp_session;
221WiFiClient _rtsp_client;
226void loop_CameraModule()
236#ifdef ENABLE_RTSPSERVER
237 uint32_t msecPerFrame = 100;
238 static uint32_t lastimage =
millis();
247 _rtsp_session->handleRequests(0);
251 if(now > lastimage + msecPerFrame || now < lastimage)
253 _rtsp_session->broadcastCurrentFrame(now);
258 if(now > lastimage + msecPerFrame)
259 SerialDebug.printf(
"warning exceeding max frame rate of %d ms\n", now - lastimage);
262 if(_rtsp_session->m_stopped)
264 delete _rtsp_session;
265 delete _rtsp_streamer;
266 _rtsp_session = NULL;
267 _rtsp_streamer = NULL;
272 _rtsp_client = _rtspServer.accept();
278 _rtsp_streamer =
new OV2640Streamer(&_rtsp_client, _camera);
280 _rtsp_session =
new CRtspSession(&_rtsp_client, _rtsp_streamer);
294void takePicture_CameraModule_internal(
boolean publishBinary)
300 digitalWrite(2, HIGH);
302 camera_fb_t *cameraFB = NULL;
305 cameraFB = esp_camera_fb_get();
308 SerialError.println(
"Camera capture failed");
312#ifdef M5_CAPTURE_SCREEN
317 (
char*)
"/CameraPicture.jpg");
321 digitalWrite(2, LOW);
325 publishBinaryFile((
char*)
"usersP/bark/images", cameraFB->buf, cameraFB->len,
"jpg");
327 esp_camera_fb_return(cameraFB);
333void takePicture_CameraModule()
337 takePicture_CameraModule_internal(
false);
343 takePicture_CameraModule_internal(
true);
349void flashConfig_CameraModule(
boolean turnOn)
354 digitalWrite(4, LOW);
359void sleep_CameraModule()
361 SerialDebug.println(
"Going to sleep now");
363 esp_deep_sleep_start();
374void buttonA_ShortPress_CameraModule()
379void buttonA_LongPress_CameraModule()
void publishBinaryFile(char *topic, uint8_t *buf, size_t len, String fileExtension)
void writeFB_SPIFFModule(uint8_t *buf, size_t len, char *fileName)
writes a FB to a file..