ESPHome 2026.3.0-dev
Loading...
Searching...
No Matches
esp32_camera.h
Go to the documentation of this file.
1#pragma once
2
3#ifdef USE_ESP32
4
5#include <atomic>
6#include <esp_camera.h>
7#include <freertos/FreeRTOS.h>
8#include <freertos/queue.h>
13
14#ifdef USE_I2C
16#endif // USE_I2C
17
18namespace esphome {
19namespace esp32_camera {
20
21class ESP32Camera;
22
43
55
57 ESP32_GAINCEILING_2X = GAINCEILING_2X,
58 ESP32_GAINCEILING_4X = GAINCEILING_4X,
59 ESP32_GAINCEILING_8X = GAINCEILING_8X,
60 ESP32_GAINCEILING_16X = GAINCEILING_16X,
61 ESP32_GAINCEILING_32X = GAINCEILING_32X,
62 ESP32_GAINCEILING_64X = GAINCEILING_64X,
63 ESP32_GAINCEILING_128X = GAINCEILING_128X,
64};
65
70
78
88
89/* ---------------- CameraImage class ---------------- */
91 public:
92 ESP32CameraImage(camera_fb_t *buffer, uint8_t requester);
93 camera_fb_t *get_raw_buffer();
94 uint8_t *get_data_buffer() override;
95 size_t get_data_length() override;
96 bool was_requested_by(camera::CameraRequester requester) const override;
97
98 protected:
99 camera_fb_t *buffer_;
100 uint8_t requesters_;
101};
102
104 uint8_t *data;
105 size_t length;
106};
107
108/* ---------------- CameraImageReader class ---------------- */
110 public:
111 void set_image(std::shared_ptr<camera::CameraImage> image) override;
112 size_t available() const override;
113 uint8_t *peek_data_buffer() override;
114 void consume_data(size_t consumed) override;
115 void return_image() override;
116
117 protected:
118 std::shared_ptr<ESP32CameraImage> image_;
119 size_t offset_{0};
120};
121
122/* ---------------- ESP32Camera class ---------------- */
124 public:
125 ESP32Camera();
126
127 /* setters */
128 /* -- pin assignment */
129 void set_data_pins(std::array<uint8_t, 8> pins);
130 void set_vsync_pin(uint8_t pin);
131 void set_href_pin(uint8_t pin);
132 void set_pixel_clock_pin(uint8_t pin);
133 void set_external_clock(uint8_t pin, uint32_t frequency);
134 void set_i2c_pins(uint8_t sda, uint8_t scl);
135#ifdef USE_I2C
136 void set_i2c_id(i2c::InternalI2CBus *i2c_bus);
137#endif // USE_I2C
138 void set_reset_pin(uint8_t pin);
139 void set_power_down_pin(uint8_t pin);
140 /* -- image */
143 void set_jpeg_quality(uint8_t quality);
144 void set_vertical_flip(bool vertical_flip);
145 void set_horizontal_mirror(bool horizontal_mirror);
146 void set_contrast(int contrast);
147 void set_brightness(int brightness);
148 void set_saturation(int saturation);
150 /* -- exposure */
152 void set_aec2(bool aec2);
153 void set_ae_level(int ae_level);
154 void set_aec_value(uint32_t aec_value);
155 /* -- gains */
157 void set_agc_value(uint8_t agc_value);
158 void set_agc_gain_ceiling(ESP32AgcGainCeiling gain_ceiling);
159 /* -- white balance */
161 /* -- test */
162 void set_test_pattern(bool test_pattern);
163 /* -- framerates */
164 void set_max_update_interval(uint32_t max_update_interval);
165 void set_idle_update_interval(uint32_t idle_update_interval);
166 /* -- frame buffer */
167 void set_frame_buffer_mode(camera_grab_mode_t mode);
168 void set_frame_buffer_count(uint8_t fb_count);
169 void set_frame_buffer_location(camera_fb_location_t fb_location);
170
171 /* public API (derivated) */
172 void setup() override;
173 void loop() override;
174 void dump_config() override;
175 /* public API (specific) */
176 void start_stream(camera::CameraRequester requester) override;
177 void stop_stream(camera::CameraRequester requester) override;
178 void request_image(camera::CameraRequester requester) override;
180
182 void add_listener(camera::CameraListener *listener) override { this->listeners_.push_back(listener); }
184
185 protected:
186 /* internal methods */
187 bool has_requested_image_() const;
188 bool can_return_image_() const;
189
190 static void framebuffer_task(void *pv);
191
192 /* attributes */
193 /* camera configuration */
194 camera_config_t config_{};
195 /* -- image */
196 bool vertical_flip_{true};
198 int contrast_{0};
202 /* -- exposure */
204 bool aec2_{false};
205 int ae_level_{0};
206 uint32_t aec_value_{300};
207 /* -- gains */
209 uint8_t agc_value_{0};
211 /* -- white balance */
213 /* -- Test */
214 bool test_pattern_{false};
215 /* -- framerates */
216 uint32_t max_update_interval_{1000};
217 uint32_t idle_update_interval_{15000};
218
219 esp_err_t init_error_{ESP_OK};
220 std::shared_ptr<ESP32CameraImage> current_image_;
221 std::atomic<uint8_t> single_requesters_{0};
222 std::atomic<uint8_t> stream_requesters_{0};
225 std::vector<camera::CameraListener *> listeners_;
226
228 uint32_t last_update_{0};
229#if ESPHOME_LOG_LEVEL < ESPHOME_LOG_LEVEL_VERBOSE
230 uint32_t last_log_time_{0};
231 uint16_t frame_count_{0};
232#endif
233#ifdef USE_I2C
235#endif // USE_I2C
237};
238
239class ESP32CameraImageTrigger : public Trigger<CameraImageData>, public camera::CameraListener {
240 public:
241 explicit ESP32CameraImageTrigger(ESP32Camera *parent) { parent->add_listener(this); }
242 void on_camera_image(const std::shared_ptr<camera::CameraImage> &image) override {
243 CameraImageData camera_image_data{};
244 camera_image_data.length = image->get_data_length();
245 camera_image_data.data = image->get_data_buffer();
246 this->trigger(camera_image_data);
247 }
248};
249
251 public:
252 explicit ESP32CameraStreamStartTrigger(ESP32Camera *parent) { parent->add_listener(this); }
253 void on_stream_start() override { this->trigger(); }
254};
255
257 public:
258 explicit ESP32CameraStreamStopTrigger(ESP32Camera *parent) { parent->add_listener(this); }
259 void on_stream_stop() override { this->trigger(); }
260};
261
262} // namespace esp32_camera
263} // namespace esphome
264
265#endif
BedjetMode mode
BedJet operating mode.
uint16_le_t frequency
Definition bl0942.h:6
An STL allocator that uses SPI or internal RAM.
Definition helpers.h:1794
Abstract camera base class.
Definition camera.h:115
Abstract camera image base class.
Definition camera.h:57
Abstract image reader base class.
Definition camera.h:71
Listener interface for camera events.
Definition camera.h:46
void set_i2c_pins(uint8_t sda, uint8_t scl)
void set_agc_value(uint8_t agc_value)
void set_test_pattern(bool test_pattern)
void set_jpeg_quality(uint8_t quality)
void set_wb_mode(ESP32WhiteBalanceMode mode)
ESP32AgcGainCeiling agc_gain_ceiling_
void set_vertical_flip(bool vertical_flip)
void set_aec_value(uint32_t aec_value)
void set_special_effect(ESP32SpecialEffect effect)
void set_aec_mode(ESP32GainControlMode mode)
void set_data_pins(std::array< uint8_t, 8 > pins)
void stop_stream(camera::CameraRequester requester) override
std::vector< camera::CameraListener * > listeners_
void set_i2c_id(i2c::InternalI2CBus *i2c_bus)
void set_pixel_format(ESP32CameraPixelFormat format)
void set_frame_size(ESP32CameraFrameSize size)
void set_external_clock(uint8_t pin, uint32_t frequency)
void set_max_update_interval(uint32_t max_update_interval)
std::shared_ptr< ESP32CameraImage > current_image_
std::atomic< uint8_t > single_requesters_
void set_horizontal_mirror(bool horizontal_mirror)
camera::CameraImageReader * create_image_reader() override
void set_frame_buffer_count(uint8_t fb_count)
void set_agc_gain_ceiling(ESP32AgcGainCeiling gain_ceiling)
void set_agc_mode(ESP32GainControlMode mode)
void set_frame_buffer_location(camera_fb_location_t fb_location)
void set_frame_buffer_mode(camera_grab_mode_t mode)
void set_idle_update_interval(uint32_t idle_update_interval)
void start_stream(camera::CameraRequester requester) override
void request_image(camera::CameraRequester requester) override
void add_listener(camera::CameraListener *listener) override
Add a listener to receive camera events.
std::atomic< uint8_t > stream_requesters_
static void framebuffer_task(void *pv)
RAMAllocator< camera_fb_t > fb_allocator_
bool was_requested_by(camera::CameraRequester requester) const override
ESP32CameraImage(camera_fb_t *buffer, uint8_t requester)
void set_image(std::shared_ptr< camera::CameraImage > image) override
std::shared_ptr< ESP32CameraImage > image_
void consume_data(size_t consumed) override
void on_camera_image(const std::shared_ptr< camera::CameraImage > &image) override
CameraRequester
Different sources for filtering.
Definition camera.h:16
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
size_t size
Definition helpers.h:854