#include #include #include #include #include #include #include #include "memorysaver.h" // Enabe debug tracing to Serial port. #define DEBUGGING // Here we define a maximum framelength to 64 bytes. Default is 256. #define MAX_FRAME_LENGTH 64 // Define how many callback functions you have. Default is 1. #define CALLBACK_FUNCTIONS 1 #if defined(ESP8266) // set GPIO15 as the slave select : const int CS = 16; #else // set pin 10 as the slave select : const int CS = 10; #endif int wifiType = 0; // 0:Station 1:AP const char* ssid = "Livebox-37cc"; // Put your SSID here const char* password = "8A6060920A8A86896F770F2C47"; // Put your PASSWORD here //const char* ssid = "SFR_E4C8"; // Put your SSID here //const char* password = "Sept/6-Six/4"; // Put your PASSWORD here ESP8266WebServer server(80); ArduCAM myCAM(OV2640, CS); void start_capture(){ myCAM.clear_fifo_flag(); myCAM.start_capture(); } void camCapture(ArduCAM myCAM){ WiFiClient client = server.client(); size_t len = myCAM.read_fifo_length(); if (len >= 393216){ Serial.println("Over size."); return; }else if (len == 0 ){ Serial.println("Size is 0."); return; } myCAM.CS_LOW(); myCAM.set_fifo_burst(); SPI.transfer(0xFF); if (!client.connected()) return; String response = "HTTP/1.1 200 OK\r\n"; response += "Content-Type: image/jpeg\r\n"; response += "Content-Length: " + String(len) + "\r\n\r\n"; server.sendContent(response); static const size_t bufferSize = 4096; static uint8_t buffer[bufferSize] = {0xFF}; while (len) { size_t will_copy = (len < bufferSize) ? len : bufferSize; SPI.transferBytes(&buffer[0], &buffer[0], will_copy); if (!client.connected()) break; client.write(&buffer[0], will_copy); len -= will_copy; } myCAM.CS_HIGH(); } void serverCapture(){ start_capture(); Serial.println("CAM Capturing"); int total_time = 0; total_time = millis(); while (!myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK)); total_time = millis() - total_time; Serial.print("capture total_time used (in miliseconds):"); Serial.println(total_time, DEC); total_time = 0; Serial.println("CAM Capture Done!"); total_time = millis(); camCapture(myCAM); total_time = millis() - total_time; Serial.print("send total_time used (in miliseconds):"); Serial.println(total_time, DEC); Serial.println("CAM send Done!"); } void serverStream(){ WiFiClient client = server.client(); String response = "HTTP/1.1 200 OK\r\n"; response += "Content-Type: multipart/x-mixed-replace; boundary=frame\r\n\r\n"; server.sendContent(response); while (1){ start_capture(); while (!myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK)); size_t len = myCAM.read_fifo_length(); if (len >= 393216){ Serial.println("Over size."); continue; }else if (len == 0 ){ Serial.println("Size is 0."); continue; } myCAM.CS_LOW(); myCAM.set_fifo_burst(); SPI.transfer(0xFF); if (!client.connected()) break; response = "--frame\r\n"; response += "Content-Type: image/jpeg\r\n\r\n"; server.sendContent(response); static const size_t bufferSize = 4096; static uint8_t buffer[bufferSize] = {0xFF}; while (len) { size_t will_copy = (len < bufferSize) ? len : bufferSize; SPI.transferBytes(&buffer[0], &buffer[0], will_copy); if (!client.connected()) break; client.write(&buffer[0], will_copy); len -= will_copy; } myCAM.CS_HIGH(); if (!client.connected()) break; } } void handleNotFound(){ String message = "Server is running!\n\n"; message += "URI: "; message += server.uri(); message += "\nMethod: "; message += (server.method() == HTTP_GET)?"GET":"POST"; message += "\nArguments: "; message += server.args(); message += "\n"; server.send(200, "text/plain", message); if (server.hasArg("ql")){ int ql = server.arg("ql").toInt(); myCAM.OV2640_set_JPEG_size(ql); Serial.println("QL change to: " + server.arg("ql")); } } void setup() { uint8_t vid, pid; uint8_t temp; #if defined(__SAM3X8E__) Wire1.begin(); #else Wire.begin(); #endif Serial.begin(115200); Serial.println("ArduCAM Start!"); // set the CS as an output: pinMode(CS, OUTPUT); // initialize SPI: SPI.begin(); SPI.setFrequency(4000000); //4MHz //Check if the ArduCAM SPI bus is OK myCAM.write_reg(ARDUCHIP_TEST1, 0x55); temp = myCAM.read_reg(ARDUCHIP_TEST1); if (temp != 0x55){ Serial.println("SPI1 interface Error!"); while(1); } //Check if the camera module type is OV2640 while(1){ //Check if the camera module type is OV2640 myCAM.wrSensorReg8_8(0xff, 0x01); myCAM.rdSensorReg8_8(OV2640_CHIPID_HIGH, &vid); myCAM.rdSensorReg8_8(OV2640_CHIPID_LOW, &pid); if ((vid != 0x26 ) && (( pid != 0x41 ) || ( pid != 0x42 ))){ Serial.println(F("Can't find OV2640 module!")); delay(1000);continue; } else{ Serial.println(F("OV2640 detected.")); break; } } //Change to JPEG capture mode and initialize the OV2640 module myCAM.set_format(JPEG); myCAM.InitCAM(); myCAM.OV2640_set_JPEG_size(OV2640_1024x768); //OV2640_1600x1200); //OV2640_1024x768); //OV2640_640x480); myCAM.clear_fifo_flag(); //myCAM.write_reg(ARDUCHIP_FRAMES, 0x00); if (wifiType == 0){ // Connect to WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("WiFi connected"); Serial.println(""); Serial.println(WiFi.localIP()); }else if (wifiType == 1){ Serial.println(); Serial.println(); Serial.print("Share AP: "); Serial.println(ssid); WiFi.mode(WIFI_AP); WiFi.softAP(ssid, password); Serial.println(""); Serial.println(WiFi.softAPIP()); } // Start the server server.on("/capture", HTTP_GET, serverCapture); server.on("/stream", HTTP_GET, serverStream); server.onNotFound(handleNotFound); server.begin(); Serial.println("Server started use /capture or /stream"); } void loop() { server.handleClient(); }