169 lines
3.6 KiB
C++
Executable File
169 lines
3.6 KiB
C++
Executable File
// ArduCAM demo (C)2015 Lee
|
|
// web: http://www.ArduCAM.com
|
|
// This program is a demo of how to use most of the functions
|
|
// of the library with a supported camera modules, and can run on any Arduino platform.
|
|
//
|
|
// This demo was made for Omnivision OV2640 2MP sensor.
|
|
// It will run the ArduCAM Mini 2MP as a real 2MP digital camera, provide both JPEG capture.
|
|
// The demo sketch will do the following tasks:
|
|
// 1. Set the sensor to JPEG mode.
|
|
// 2. Capture and buffer the image to FIFO every 5 seconds
|
|
// 3. Store the image to Micro SD/TF card with JPEG format in sequential.
|
|
// 4. Resolution can be changed by myCAM.set_JPEG_size() function.
|
|
// This program requires the ArduCAM V3.4.0 (or later) library and ArduCAM Mini 2MP shield
|
|
// and use Arduino IDE 1.5.2 compiler or above
|
|
|
|
//#include <UTFT_SPI.h>
|
|
#include <SD.h>
|
|
#include <Wire.h>
|
|
#include <ArduCAM.h>
|
|
#include <SPI.h>
|
|
#include "memorysaver.h"
|
|
|
|
#if defined(arm)
|
|
#include <itoa.h>
|
|
#endif
|
|
|
|
#define SD_CS 4
|
|
// set pin 4 as the slave select for SPI:
|
|
const int SPI_CS = 10;
|
|
|
|
ArduCAM myCAM(OV2640, SPI_CS);
|
|
UTFT myGLCD(SPI_CS);
|
|
|
|
void setup()
|
|
{
|
|
uint8_t vid, pid;
|
|
uint8_t temp;
|
|
#if defined(SAM3X8E)
|
|
Wire1.begin();
|
|
#else
|
|
Wire.begin();
|
|
#endif
|
|
Serial.begin(9600);
|
|
Serial.println("ArduCAM Start!");
|
|
// set the SPI_CS as an output:
|
|
pinMode(SPI_CS, OUTPUT);
|
|
|
|
// initialize SPI:
|
|
SPI.begin();
|
|
//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("SPI interface Error!");
|
|
while (1);
|
|
}
|
|
|
|
//Check if the camera module type is OV2640
|
|
myCAM.rdSensorReg8_8(OV2640_CHIPID_HIGH, &vid);
|
|
myCAM.rdSensorReg8_8(OV2640_CHIPID_LOW, &pid);
|
|
if ((vid != 0x26) || (pid != 0x42))
|
|
Serial.println("Can't find OV2640 module!");
|
|
else
|
|
Serial.println("OV2640 detected");
|
|
|
|
//Change to BMP capture mode and initialize the OV2640 module
|
|
myCAM.set_format(JPEG);
|
|
|
|
myCAM.InitCAM();
|
|
//myCAM.OV2640_set_JPEG_size(OV2640_640x480);
|
|
//myCAM.OV2640_set_JPEG_size(OV2640_1600x1200);
|
|
|
|
//Initialize SD Card
|
|
if (!SD.begin(SD_CS))
|
|
{
|
|
//while (1); //If failed, stop here
|
|
Serial.println("SD Card Error");
|
|
}
|
|
else
|
|
Serial.println("SD Card detected!");
|
|
}
|
|
|
|
void loop()
|
|
{
|
|
char str[8];
|
|
File outFile;
|
|
byte buf[256];
|
|
static int i = 0;
|
|
static int k = 0;
|
|
static int n = 0;
|
|
uint8_t temp, temp_last;
|
|
uint8_t start_capture = 0;
|
|
int total_time = 0;
|
|
////////////////////////////////
|
|
|
|
start_capture = 1;
|
|
delay(5000);
|
|
|
|
if (start_capture)
|
|
{
|
|
//Flush the FIFO
|
|
myCAM.flush_fifo();
|
|
//Clear the capture done flag
|
|
myCAM.clear_fifo_flag();
|
|
//Start capture
|
|
myCAM.start_capture();
|
|
Serial.println("Start Capture");
|
|
}
|
|
|
|
while (!myCAM.get_bit(ARDUCHIP_TRIG , CAP_DONE_MASK));
|
|
|
|
Serial.println("Capture Done!");
|
|
|
|
//Construct a file name
|
|
k = k + 1;
|
|
itoa(k, str, 10);
|
|
strcat(str, ".jpg");
|
|
//Open the new file
|
|
outFile = SD.open(str, O_WRITE | O_CREAT | O_TRUNC);
|
|
if (! outFile)
|
|
{
|
|
Serial.println("open file failed");
|
|
return;
|
|
}
|
|
total_time = millis();
|
|
i = 0;
|
|
myCAM.CS_LOW();
|
|
myCAM.set_fifo_burst();
|
|
temp = SPI.transfer(0x00);
|
|
//
|
|
//Read JPEG data from FIFO
|
|
while ( (temp != 0xD9) | (temp_last != 0xFF))
|
|
{
|
|
temp_last = temp;
|
|
temp = SPI.transfer(0x00);
|
|
|
|
//Write image data to buffer if not full
|
|
if (i < 256)
|
|
buf[i++] = temp;
|
|
else
|
|
{
|
|
//Write 256 bytes image data to file
|
|
myCAM.CS_HIGH();
|
|
outFile.write(buf, 256);
|
|
i = 0;
|
|
buf[i++] = temp;
|
|
myCAM.CS_LOW();
|
|
myCAM.set_fifo_burst();
|
|
}
|
|
}
|
|
//Write the remain bytes in the buffer
|
|
if (i > 0)
|
|
{
|
|
myCAM.CS_HIGH();
|
|
outFile.write(buf, i);
|
|
}
|
|
//Close the file
|
|
outFile.close();
|
|
total_time = millis() - total_time;
|
|
Serial.print("Total time used:");
|
|
Serial.print(total_time, DEC);
|
|
Serial.println(" millisecond");
|
|
//Clear the capture done flag
|
|
myCAM.clear_fifo_flag();
|
|
//Clear the start capture flag
|
|
start_capture = 0;
|
|
}
|