first commit
This commit is contained in:
253
ESP8266_ArduCAM_Capture/ESP8266_ArduCAM_Capture.ino
Normal file
253
ESP8266_ArduCAM_Capture/ESP8266_ArduCAM_Capture.ino
Normal file
@@ -0,0 +1,253 @@
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <WiFiClient.h>
|
||||
#include <ESP8266WebServer.h>
|
||||
#include <ESP8266mDNS.h>
|
||||
|
||||
#include <Wire.h>
|
||||
#include <ArduCAM.h>
|
||||
#include <SPI.h>
|
||||
#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();
|
||||
}
|
||||
Reference in New Issue
Block a user