#include "esp_camera.h" #include "FS.h" #include "SD.h" #include "SPI.h" #include #include #define CAMERA_MODEL_XIAO_ESP32S3 // Has PSRAM #include "camera_pins.h" #include HardwareSerial mySerial(0); const char* ssid = "Sam"; const char* password = "samlaneyhome"; WebServer server(80); unsigned long lastCaptureTime = 0; // Last shooting time int imageCount = 1; // File Counter bool camera_sign = false; // Check camera status bool sd_sign = false; // Check sd status // Save pictures to SD card void photo_save(const char * fileName) { // Take a photo camera_fb_t *fb = esp_camera_fb_get(); if (!fb) { Serial.println("Failed to get camera frame buffer"); return; } // Save photo to file writeFile(SD, fileName, fb->buf, fb->len); // Release image buffer esp_camera_fb_return(fb); Serial.println("Photo saved to file"); } // SD card write file void writeFile(fs::FS &fs, const char * path, uint8_t * data, size_t len){ Serial.printf("Writing file: %s\r\n", path); File file = fs.open(path, FILE_WRITE); if(!file){ Serial.println("Failed to open file for writing"); return; } if(file.write(data, len) == len){ Serial.println("File written"); } else { Serial.println("Write failed"); } file.close(); } void setup() { Serial.begin(115200); while (!Serial); // Wait for Serial to be ready Serial.println("Starting setup..."); pinMode(LED_BUILTIN, OUTPUT); // Set LED pin as output Serial.println("LED pin set as output."); // Blink LED to indicate start of setup for (int i = 0; i < 10; i++) { digitalWrite(LED_BUILTIN, LOW); delay(100); // LED on for 100ms digitalWrite(LED_BUILTIN, HIGH); delay(100); // LED off for 100ms } Serial.println("LED blink sequence completed."); // Serial communication for devices (if needed) // mySerial.begin(9600, SERIAL_8N1, -1, -1); // Serial.println("mySerial initialized."); // Connect to WiFi Serial.println("Connecting to WiFi..."); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Attempting to connect to WiFi..."); } Serial.print("Connected to WiFi. IP Address: "); Serial.println(WiFi.localIP()); // Setup web server server.on("/", HTTP_GET, []() { server.send(200, "text/html", getHtml()); Serial.println("Served root page."); }); Serial.println("Web server handlers configured."); // Define endpoints for devices for (int i = 1; i <= 9; ++i) { server.on("/on" + String(i), HTTP_GET, [i]() { controlDevice(i, true); // true for turning on server.send(200, "text/plain", "Turned On Device " + String(i)); Serial.println("Turned on device " + String(i)); }); server.on("/off" + String(i), HTTP_GET, [i]() { controlDevice(i, false); // false for turning off server.send(200, "text/plain", "Turned Off Device " + String(i)); Serial.println("Turned off device " + String(i)); }); } server.begin(); Serial.println("Web server started."); // Camera and SD card initialization Serial.println("Initializing camera..."); camera_config_t config; // Camera pin configuration config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; // Other camera configurations config.xclk_freq_hz = 20000000; config.pixel_format = PIXFORMAT_JPEG; config.frame_size = FRAMESIZE_UXGA; config.jpeg_quality = 12; config.fb_count = 1; esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Serial.printf("Camera init failed with error 0x%x\n", err); return; } Serial.println("Camera initialized."); Serial.println("Initializing SD card..."); if (!SD.begin()) { Serial.println("Card Mount Failed"); return; } Serial.println("SD card initialized."); } void loop() { server.handleClient(); // Camera & SD card are available, take pictures at 15-minute intervals if (camera_sign && sd_sign) { unsigned long now = millis(); if ((now - lastCaptureTime) >= 900000) { // 15 minutes char filename[32]; sprintf(filename, "/image%d.jpg", imageCount++); photo_save(filename); mySerial.println("photo_taken"); lastCaptureTime = now; } } } String getHtml() { String html = "

Device Control

"; for (int i = 1; i <= 9; ++i) { html += ""; html += "
"; } html += ""; return html; } void controlDevice(int deviceNum, bool turnOn) { String command = "device" + String(deviceNum) + (turnOn ? ":on" : ":off"); mySerial.println(command); }