Skip to content

Commit 4c68302

Browse files
author
Eric
committed
Home Assistant with multiple ESP32 Cameras! (Part. 2)
1 parent 63b27e4 commit 4c68302

File tree

2 files changed

+460
-0
lines changed

2 files changed

+460
-0
lines changed
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
/////////////////////////////////////////////////////////////////
2+
/*
3+
Home Assistant with multiple ESP32 Cameras! (Part. 2)
4+
For More Information: https://youtu.be/MjZjyK1WgjY
5+
Created by Eric N. (ThatProject)
6+
*/
7+
/////////////////////////////////////////////////////////////////
8+
9+
/*
10+
- ESP32 Arduino Core: 2.0.9
11+
- TestDevice: ESP32-CAM AI-Thinker, XIAO ESP32S3 Sense
12+
13+
**Required Library**
14+
- MQTT: 2.5.1
15+
https://github.com/256dpi/arduino-mqtt
16+
*/
17+
18+
#include "esp_camera.h"
19+
#include <WiFiClientSecure.h>
20+
#include <MQTT.h>
21+
22+
//Select Your Camera Board
23+
//#define CAMERA_MODEL_XIAO_ESP32S3
24+
#define CAMERA_MODEL_AI_THINKER
25+
#include "camera_pins.h"
26+
27+
const char ssid[] = "<YOUR_WIFI_SSID>";
28+
const char pass[] = "<YOUR_WIFI_PASSWORD>";
29+
30+
#define CONFIG_BROKER_URL "<YOUR_HA_IP_ADDRESS>"
31+
32+
#define CONFIG_BROKER_USERNAME "MQTT_Camera"
33+
#define CONFIG_BROKER_PASSWORD "1234"
34+
35+
//For the First Camera
36+
#define ESP32CAM_DEVICE "ESP32-CAM-0"
37+
#define ESP32CAM_PUBLISH_TOPIC "esp32/cam_0"
38+
//For the Second Camera
39+
//#define ESP32CAM_DEVICE "ESP32-CAM-1"
40+
//#define ESP32CAM_PUBLISH_TOPIC "esp32/cam_1"
41+
42+
const int bufferSize = 1024 * 25; // 25KB
43+
44+
WiFiClient net;
45+
MQTTClient client = MQTTClient(bufferSize);
46+
47+
void connect() {
48+
Serial.print("checking wifi...");
49+
while (WiFi.status() != WL_CONNECTED) {
50+
Serial.print(".");
51+
delay(500);
52+
}
53+
54+
Serial.print("\nconnecting...");
55+
while (!client.connect(ESP32CAM_DEVICE, CONFIG_BROKER_USERNAME, CONFIG_BROKER_PASSWORD)) {
56+
Serial.print(".");
57+
delay(1000);
58+
}
59+
60+
Serial.println("\nconnected!");
61+
}
62+
63+
bool camInit() {
64+
camera_config_t config;
65+
config.ledc_channel = LEDC_CHANNEL_0;
66+
config.ledc_timer = LEDC_TIMER_0;
67+
config.pin_d0 = Y2_GPIO_NUM;
68+
config.pin_d1 = Y3_GPIO_NUM;
69+
config.pin_d2 = Y4_GPIO_NUM;
70+
config.pin_d3 = Y5_GPIO_NUM;
71+
config.pin_d4 = Y6_GPIO_NUM;
72+
config.pin_d5 = Y7_GPIO_NUM;
73+
config.pin_d6 = Y8_GPIO_NUM;
74+
config.pin_d7 = Y9_GPIO_NUM;
75+
config.pin_xclk = XCLK_GPIO_NUM;
76+
config.pin_pclk = PCLK_GPIO_NUM;
77+
config.pin_vsync = VSYNC_GPIO_NUM;
78+
config.pin_href = HREF_GPIO_NUM;
79+
config.pin_sscb_sda = SIOD_GPIO_NUM;
80+
config.pin_sscb_scl = SIOC_GPIO_NUM;
81+
config.pin_pwdn = PWDN_GPIO_NUM;
82+
config.pin_reset = RESET_GPIO_NUM;
83+
config.xclk_freq_hz = 20000000;
84+
config.frame_size = FRAMESIZE_UXGA;
85+
config.pixel_format = PIXFORMAT_JPEG; // for streaming
86+
config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
87+
config.fb_location = CAMERA_FB_IN_PSRAM;
88+
config.jpeg_quality = 12;
89+
config.fb_count = 1;
90+
91+
// if PSRAM IC present, init with UXGA resolution and higher JPEG quality
92+
// for larger pre-allocated frame buffer.
93+
if (config.pixel_format == PIXFORMAT_JPEG) {
94+
if (psramFound()) {
95+
config.jpeg_quality = 10;
96+
config.fb_count = 2;
97+
config.grab_mode = CAMERA_GRAB_LATEST;
98+
config.frame_size = FRAMESIZE_VGA;
99+
} else {
100+
// Limit the frame size when PSRAM is not available
101+
config.frame_size = FRAMESIZE_SVGA;
102+
config.fb_location = CAMERA_FB_IN_DRAM;
103+
}
104+
} else {
105+
config.frame_size = FRAMESIZE_VGA;
106+
#if CONFIG_IDF_TARGET_ESP32S3
107+
config.fb_count = 2;
108+
#endif
109+
}
110+
111+
// camera init
112+
esp_err_t err = esp_camera_init(&config);
113+
if (err != ESP_OK) {
114+
Serial.printf("Camera init failed with error 0x%x", err);
115+
return false;
116+
}
117+
118+
return true;
119+
}
120+
121+
void uploadImage() {
122+
Serial.println("uploadImage via MQTT");
123+
camera_fb_t* fb = esp_camera_fb_get();
124+
if (!fb) {
125+
Serial.println("Camera capture failed");
126+
return;
127+
}
128+
129+
if (fb->format != PIXFORMAT_JPEG) {
130+
Serial.println("Non-JPEG data not implemented");
131+
esp_camera_fb_return(fb);
132+
return;
133+
}
134+
135+
if (!client.publish(ESP32CAM_PUBLISH_TOPIC, (const char*)fb->buf, fb->len)) {
136+
Serial.println("[Failure] Uploading Image via MQTT");
137+
}
138+
139+
esp_camera_fb_return(fb);
140+
}
141+
142+
void setup() {
143+
Serial.begin(115200);
144+
if (!camInit()) {
145+
Serial.println("[Failure] Cam Init");
146+
return;
147+
}
148+
WiFi.begin(ssid, pass);
149+
client.begin(CONFIG_BROKER_URL, 1883, net);
150+
connect();
151+
}
152+
153+
void loop() {
154+
client.loop();
155+
delay(10);
156+
157+
if (!client.connected()) {
158+
connect();
159+
} else {
160+
uploadImage();
161+
}
162+
}

0 commit comments

Comments
 (0)