first commit
This commit is contained in:
383
ArduCAM_ESP8266_Nano_V2_Capture/ArduCAM_ESP8266_Nano_V2_Capture.ino
Executable file
383
ArduCAM_ESP8266_Nano_V2_Capture/ArduCAM_ESP8266_Nano_V2_Capture.ino
Executable file
@@ -0,0 +1,383 @@
|
||||
// ArduCAM Mini demo (C)2017 Lee
|
||||
// Web: http://www.ArduCAM.com
|
||||
// This program is a demo of how to use most of the functions
|
||||
// of the library with ArduCAM ESP8266 2MP/5MP camera.
|
||||
// This demo was made for ArduCAM ESP8266 2MP/5MP Camera.
|
||||
// It can take photo and send to the Web.
|
||||
// It can take photo continuously as video streaming and send to the Web.
|
||||
// The demo sketch will do the following tasks:
|
||||
// 1. Set the camera to JPEG output mode.
|
||||
// 2. if server.on("/capture", HTTP_GET, serverCapture),it can take photo and send to the Web.
|
||||
// 3.if server.on("/stream", HTTP_GET, serverStream),it can take photo continuously as video
|
||||
//streaming and send to the Web.
|
||||
|
||||
// This program requires the ArduCAM V4.0.0 (or later) library and ArduCAM ESP8266 2MP/5MP camera
|
||||
// and use Arduino IDE 1.6.8 compiler or above
|
||||
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <WiFiClient.h>
|
||||
#include <ESP8266WebServer.h>
|
||||
#include <ESP8266mDNS.h>
|
||||
#include <Wire.h>
|
||||
#include <ArduCAM.h>
|
||||
#include <SPI.h>
|
||||
#include "memorysaver.h"
|
||||
#if !(defined ESP8266 )
|
||||
#error Please select the ArduCAM ESP8266 UNO board in the Tools/Board
|
||||
#endif
|
||||
|
||||
//This demo can only work on OV2640_MINI_2MP or ARDUCAM_SHIELD_V2 platform.
|
||||
#if !(defined (OV2640_MINI_2MP)||defined (OV5640_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP_PLUS) \
|
||||
|| defined (OV5642_MINI_5MP) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) \
|
||||
||(defined (ARDUCAM_SHIELD_V2) && (defined (OV2640_CAM) || defined (OV5640_CAM) || defined (OV5642_CAM))))
|
||||
#error Please select the hardware platform and camera module in the ../libraries/ArduCAM/memorysaver.h file
|
||||
#endif
|
||||
// set GPIO2 as the slave select :
|
||||
const int CS = 2;
|
||||
//Version 2,set GPIO0 as the slave select :
|
||||
const int SD_CS = 0;
|
||||
|
||||
const int CAM_POWER_ON = 15;
|
||||
|
||||
|
||||
//you can change the value of wifiType to select Station or AP mode.
|
||||
//Default is AP mode.
|
||||
int wifiType = 1; // 0:Station 1:AP
|
||||
|
||||
//AP mode configuration
|
||||
//Default is arducam_esp8266.If you want,you can change the AP_aaid to your favorite name
|
||||
const char *AP_ssid = "arducam_esp8266";
|
||||
//Default is no password.If you want to set password,put your password here
|
||||
const char *AP_password = "";
|
||||
|
||||
//Station mode you should put your ssid and password
|
||||
const char *ssid = "Livebox-37cc"; // Put your SSID here
|
||||
const char *password = "8A6060920A8A86896F770F2C47"; // Put your PASSWORD here
|
||||
|
||||
static const size_t bufferSize = 4096;
|
||||
static uint8_t buffer[bufferSize] = {0xFF};
|
||||
uint8_t temp = 0, temp_last = 0;
|
||||
int i = 0;
|
||||
bool is_header = false;
|
||||
|
||||
ESP8266WebServer server(80);
|
||||
#if defined (OV2640_MINI_2MP) || defined (OV2640_CAM)
|
||||
ArduCAM myCAM(OV2640, CS);
|
||||
#elif defined (OV5640_MINI_5MP_PLUS) || defined (OV5640_CAM)
|
||||
ArduCAM myCAM(OV5640, CS);
|
||||
#elif defined (OV5642_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) ||(defined (OV5642_CAM))
|
||||
ArduCAM myCAM(OV5642, CS);
|
||||
#endif
|
||||
|
||||
|
||||
void start_capture() {
|
||||
myCAM.clear_fifo_flag();
|
||||
myCAM.start_capture();
|
||||
}
|
||||
|
||||
void camCapture(ArduCAM myCAM) {
|
||||
WiFiClient client = server.client();
|
||||
uint32_t len = myCAM.read_fifo_length();
|
||||
if (len >= MAX_FIFO_SIZE) //8M
|
||||
{
|
||||
Serial.println(F("Over size."));
|
||||
}
|
||||
if (len == 0 ) //0 kb
|
||||
{
|
||||
Serial.println(F("Size is 0."));
|
||||
}
|
||||
myCAM.CS_LOW();
|
||||
myCAM.set_fifo_burst();
|
||||
if (!client.connected()) return;
|
||||
String response = "HTTP/1.1 200 OK\r\n";
|
||||
response += "Content-Type: image/jpeg\r\n";
|
||||
response += "Content-len: " + String(len) + "\r\n\r\n";
|
||||
server.sendContent(response);
|
||||
i = 0;
|
||||
while ( len-- )
|
||||
{
|
||||
temp_last = temp;
|
||||
temp = SPI.transfer(0x00);
|
||||
//Read JPEG data from FIFO
|
||||
if ( (temp == 0xD9) && (temp_last == 0xFF) ) //If find the end ,break while,
|
||||
{
|
||||
buffer[i++] = temp; //save the last 0XD9
|
||||
//Write the remain bytes in the buffer
|
||||
if (!client.connected()) break;
|
||||
client.write(&buffer[0], i);
|
||||
is_header = false;
|
||||
i = 0;
|
||||
myCAM.CS_HIGH();
|
||||
break;
|
||||
}
|
||||
if (is_header == true)
|
||||
{
|
||||
//Write image data to buffer if not full
|
||||
if (i < bufferSize)
|
||||
buffer[i++] = temp;
|
||||
else
|
||||
{
|
||||
//Write bufferSize bytes image data to file
|
||||
if (!client.connected()) break;
|
||||
client.write(&buffer[0], bufferSize);
|
||||
i = 0;
|
||||
buffer[i++] = temp;
|
||||
}
|
||||
}
|
||||
else if ((temp == 0xD8) & (temp_last == 0xFF))
|
||||
{
|
||||
is_header = true;
|
||||
buffer[i++] = temp_last;
|
||||
buffer[i++] = temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void serverCapture() {
|
||||
start_capture();
|
||||
Serial.println(F("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(F("capture total_time used (in miliseconds):"));
|
||||
Serial.println(total_time, DEC);
|
||||
|
||||
total_time = 0;
|
||||
|
||||
Serial.println(F("CAM Capture Done."));
|
||||
total_time = millis();
|
||||
camCapture(myCAM);
|
||||
total_time = millis() - total_time;
|
||||
Serial.print(F("send total_time used (in miliseconds):"));
|
||||
Serial.println(total_time, DEC);
|
||||
Serial.println(F("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 >= MAX_FIFO_SIZE) //8M
|
||||
{
|
||||
Serial.println(F("Over size."));
|
||||
continue;
|
||||
}
|
||||
if (len == 0 ) //0 kb
|
||||
{
|
||||
Serial.println(F("Size is 0."));
|
||||
continue;
|
||||
}
|
||||
myCAM.CS_LOW();
|
||||
myCAM.set_fifo_burst();
|
||||
if (!client.connected()) {
|
||||
client.stop(); is_header = false; break;
|
||||
}
|
||||
response = "--frame\r\n";
|
||||
response += "Content-Type: image/jpeg\r\n\r\n";
|
||||
server.sendContent(response);
|
||||
while ( len-- )
|
||||
{
|
||||
temp_last = temp;
|
||||
temp = SPI.transfer(0x00);
|
||||
|
||||
//Read JPEG data from FIFO
|
||||
if ( (temp == 0xD9) && (temp_last == 0xFF) ) //If find the end ,break while,
|
||||
{
|
||||
buffer[i++] = temp; //save the last 0XD9
|
||||
//Write the remain bytes in the buffer
|
||||
myCAM.CS_HIGH();;
|
||||
if (!client.connected()) {
|
||||
client.stop(); is_header = false; break;
|
||||
}
|
||||
client.write(&buffer[0], i);
|
||||
is_header = false;
|
||||
i = 0;
|
||||
}
|
||||
if (is_header == true)
|
||||
{
|
||||
//Write image data to buffer if not full
|
||||
if (i < bufferSize)
|
||||
buffer[i++] = temp;
|
||||
else
|
||||
{
|
||||
//Write bufferSize bytes image data to file
|
||||
myCAM.CS_HIGH();
|
||||
if (!client.connected()) {
|
||||
client.stop(); is_header = false; break;
|
||||
}
|
||||
client.write(&buffer[0], bufferSize);
|
||||
i = 0;
|
||||
buffer[i++] = temp;
|
||||
myCAM.CS_LOW();
|
||||
myCAM.set_fifo_burst();
|
||||
}
|
||||
}
|
||||
else if ((temp == 0xD8) & (temp_last == 0xFF))
|
||||
{
|
||||
is_header = true;
|
||||
buffer[i++] = temp_last;
|
||||
buffer[i++] = temp;
|
||||
}
|
||||
}
|
||||
if (!client.connected()) {
|
||||
client.stop(); is_header = false; 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();
|
||||
#if defined (OV2640_MINI_2MP) || defined (OV2640_CAM)
|
||||
myCAM.OV2640_set_JPEG_size(ql);
|
||||
#elif defined (OV5640_MINI_5MP_PLUS) || defined (OV5640_CAM)
|
||||
myCAM.OV5640_set_JPEG_size(ql);
|
||||
#elif defined (OV5642_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) ||(defined (OV5642_CAM))
|
||||
myCAM.OV5642_set_JPEG_size(ql);
|
||||
#endif
|
||||
delay(1000);
|
||||
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(F("ArduCAM Start!"));
|
||||
|
||||
//set the CS as an output:
|
||||
pinMode(CS, OUTPUT);
|
||||
pinMode(CAM_POWER_ON , OUTPUT);
|
||||
digitalWrite(CAM_POWER_ON, HIGH);
|
||||
|
||||
// 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(F("SPI1 interface Error!"));
|
||||
while (1);
|
||||
}
|
||||
#if defined (OV2640_MINI_2MP) || defined (OV2640_CAM)
|
||||
//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!"));
|
||||
else
|
||||
Serial.println(F("OV2640 detected."));
|
||||
#elif defined (OV5640_MINI_5MP_PLUS) || defined (OV5640_CAM)
|
||||
//Check if the camera module type is OV5640
|
||||
myCAM.wrSensorReg16_8(0xff, 0x01);
|
||||
myCAM.rdSensorReg16_8(OV5640_CHIPID_HIGH, &vid);
|
||||
myCAM.rdSensorReg16_8(OV5640_CHIPID_LOW, &pid);
|
||||
if ((vid != 0x56) || (pid != 0x40))
|
||||
Serial.println(F("Can't find OV5640 module!"));
|
||||
else
|
||||
Serial.println(F("OV5640 detected."));
|
||||
#elif defined (OV5642_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) ||(defined (OV5642_CAM))
|
||||
//Check if the camera module type is OV5642
|
||||
myCAM.wrSensorReg16_8(0xff, 0x01);
|
||||
myCAM.rdSensorReg16_8(OV5642_CHIPID_HIGH, &vid);
|
||||
myCAM.rdSensorReg16_8(OV5642_CHIPID_LOW, &pid);
|
||||
if ((vid != 0x56) || (pid != 0x42)) {
|
||||
Serial.println(F("Can't find OV5642 module!"));
|
||||
}
|
||||
else
|
||||
Serial.println(F("OV5642 detected."));
|
||||
#endif
|
||||
|
||||
|
||||
//Change to JPEG capture mode and initialize the OV2640 module
|
||||
myCAM.set_format(JPEG);
|
||||
myCAM.InitCAM();
|
||||
#if defined (OV2640_MINI_2MP) || defined (OV2640_CAM)
|
||||
myCAM.OV2640_set_JPEG_size(OV2640_320x240);
|
||||
#elif defined (OV5640_MINI_5MP_PLUS) || defined (OV5640_CAM)
|
||||
myCAM.write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK); //VSYNC is active HIGH
|
||||
myCAM.OV5640_set_JPEG_size(OV5640_320x240);
|
||||
#elif defined (OV5642_MINI_5MP_PLUS) || defined (OV5642_MINI_5MP) || defined (OV5642_MINI_5MP_BIT_ROTATION_FIXED) ||(defined (OV5642_CAM))
|
||||
myCAM.write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK); //VSYNC is active HIGH
|
||||
myCAM.OV5640_set_JPEG_size(OV5642_320x240);
|
||||
#endif
|
||||
|
||||
myCAM.clear_fifo_flag();
|
||||
if (wifiType == 0) {
|
||||
if (!strcmp(ssid, "SSID")) {
|
||||
Serial.println(F("Please set your SSID"));
|
||||
while (1);
|
||||
}
|
||||
if (!strcmp(password, "PASSWORD")) {
|
||||
Serial.println(F("Please set your PASSWORD"));
|
||||
while (1);
|
||||
}
|
||||
// Connect to WiFi network
|
||||
Serial.println();
|
||||
Serial.println();
|
||||
Serial.print(F("Connecting to "));
|
||||
Serial.println(ssid);
|
||||
|
||||
WiFi.mode(WIFI_STA);
|
||||
WiFi.begin(ssid, password);
|
||||
while (WiFi.status() != WL_CONNECTED) {
|
||||
delay(500);
|
||||
Serial.print(F("."));
|
||||
}
|
||||
Serial.println(F("WiFi connected"));
|
||||
Serial.println("");
|
||||
Serial.println(WiFi.localIP());
|
||||
} else if (wifiType == 1) {
|
||||
Serial.println();
|
||||
Serial.println();
|
||||
Serial.print(F("Share AP: "));
|
||||
Serial.println(AP_ssid);
|
||||
Serial.print(F("The password is: "));
|
||||
Serial.println(AP_password);
|
||||
|
||||
WiFi.mode(WIFI_AP);
|
||||
WiFi.softAP(AP_ssid, AP_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(F("Server started"));
|
||||
}
|
||||
|
||||
void loop() {
|
||||
server.handleClient();
|
||||
}
|
||||
Reference in New Issue
Block a user