| 
					
				 | 
			
			
				@@ -0,0 +1,198 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "esp_camera.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <WiFi.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <HTTPClient.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            Ensure ESP32 Wrover Module or other board with PSRAM is selected 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            Partial images will be transmitted if image exceeds buffer size 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Select camera model 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//#define CAMERA_MODEL_ESP_EYE // Has PSRAM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//#define CAMERA_MODEL_AI_THINKER // Has PSRAM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+WiFiClient client; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "camera_pins.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//const char* ssid = "goldin_lab1"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//const char* password = "goldin53743001"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const char* ssid = "Fatwolf"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const char* password = "08250825"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const char* backupSsid = "goldin_lab1"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const char* backupPassword = "goldin53743001"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+int connectionAttempts = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+unsigned long previousMillis = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+unsigned long interval = 30000; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void startCameraServer(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void setup() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Serial.begin(115200); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Serial.setDebugOutput(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Serial.println(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  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_sscb_sda = SIOD_GPIO_NUM; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  config.pin_sscb_scl = SIOC_GPIO_NUM; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  config.pin_pwdn = PWDN_GPIO_NUM; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  config.pin_reset = RESET_GPIO_NUM; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  config.xclk_freq_hz = 20000000; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  config.pixel_format = PIXFORMAT_JPEG; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // if PSRAM IC present, init with UXGA resolution and higher JPEG quality 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  //                      for larger pre-allocated frame buffer. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if(psramFound()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    config.frame_size = FRAMESIZE_UXGA; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    config.jpeg_quality = 10; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    config.fb_count = 2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  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 brightness 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_QVGA); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  s->set_vflip(s, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  s->set_hmirror(s, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  //WiFi.begin(ssid, password); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  //WiFi.begin(primarySsid, primaryPassword); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  //while (WiFi.status() != WL_CONNECTED) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  //  delay(500); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  //  Serial.print("."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  //} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  //Serial.println(""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  //Serial.println("WiFi connected"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  //startCameraServer(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  //Serial.print("Camera Ready! Use 'http://"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  //Serial.print(WiFi.localIP()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  //Serial.println("' to connect"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void loop() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  static bool wifiConnected = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  static bool usingBackupWiFi = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  static int connectionAttempts = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  unsigned long currentMillis = millis(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // 检查是否需要重新连接 Wi-Fi 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!wifiConnected && (WiFi.status() != WL_CONNECTED) && (currentMillis - previousMillis >= interval)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Serial.print(millis()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Serial.println(" Reconnecting to WiFi..."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 如果当前未使用备用 Wi-Fi,尝试连接主要 Wi-Fi 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!usingBackupWiFi) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      WiFi.disconnect(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      WiFi.begin(ssid, password); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 如果当前使用备用 Wi-Fi,尝试连接备用 Wi-Fi 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      WiFi.disconnect(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      WiFi.begin(backupSsid, backupPassword); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    previousMillis = currentMillis; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    connectionAttempts++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // 检查 Wi-Fi 连接状态 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (WiFi.status() == WL_CONNECTED) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    wifiConnected = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!usingBackupWiFi) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      Serial.println(""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      Serial.println("Wi-Fi connected"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      Serial.print("SSID: "); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      Serial.println(WiFi.SSID()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      Serial.print("IP: "); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      Serial.println(WiFi.localIP()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      Serial.println(""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      Serial.println("Backup Wi-Fi connected"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      Serial.print("SSID: "); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      Serial.println(WiFi.SSID()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      Serial.print("IP: "); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      Serial.println(WiFi.localIP()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // 检测主要 Wi-Fi 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      int numNetworks = WiFi.scanNetworks(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      for (int i = 0; i < numNetworks; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (WiFi.SSID(i) == ssid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          Serial.println(""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          Serial.println("Detected main Wi-Fi"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          Serial.print("SSID: "); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          Serial.println(WiFi.SSID(i)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          // 断开备用 Wi-Fi 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          WiFi.disconnect(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          usingBackupWiFi = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    wifiConnected = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 如果已经尝试连接 3 次且仍未连接成功,切换到备用 Wi-Fi 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (connectionAttempts >= 3) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      usingBackupWiFi = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      connectionAttempts = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      Serial.println(""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      Serial.println("Switching to backup Wi-Fi"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  delay(1000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |