// ArduCAM 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 a supported camera modules, and can run on any Arduino platform. // // This demo was made for Omnivision 2MP/5MP sensor. // It will run the ArduCAM 2MP/5MP as a real 2MP/5MP 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 V4.0.0 (or later) library and ArduCAM 2MP/5MP shield // and use Arduino IDE 1.6.8 compiler or above #include #include #include #include #include "memorysaver.h" //This demo can only work on OV2640_MINI_2MP or OV5642_MINI_5MP or OV5642_MINI_5MP_BIT_ROTATION_FIXED platform. #if !(defined OV5642_MINI_5MP || defined OV5642_MINI_5MP_BIT_ROTATION_FIXED || defined OV2640_MINI_2MP || defined OV3640_MINI_3MP) #error Please select the hardware platform and camera module in the ../libraries/ArduCAM/memorysaver.h file #endif #define SD_CS 10 const int SPI_CS = 7; #if defined (OV2640_MINI_2MP) ArduCAM myCAM( OV2640, SPI_CS ); #elif defined (OV3640_MINI_3MP) ArduCAM myCAM( OV3640, SPI_CS ); #else ArduCAM myCAM( OV5642, SPI_CS ); #endif void myCAMSaveToSDFile() { char str[8]; byte buf[256]; static int k = 0; uint32_t length = 0; File outFile; // Flush the FIFO myCAM.flush_fifo(); // Clear the capture done flag myCAM.clear_fifo_flag(); // Start capture myCAM.start_capture(); Serial.println(F("start Capture")); while (!myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK)); Serial.println(F("Capture Done.")); length = myCAM.read_fifo_length(); Serial.print(F("The fifo length is :")); Serial.println(length, DEC); // 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(F("File open failed")); return; } // Write the buffered image data to the SD card outFile.write(buf, sizeof(buf)); outFile.close(); // Close the file after all data is written Serial.println(F("Image save OK.")); } void setup(){ uint8_t vid, pid; uint8_t temp; Wire.begin(); Serial.begin(115200); Serial.println(F("ArduCAM Start!")); //set the CS as an output: pinMode(SPI_CS,OUTPUT); digitalWrite(SPI_CS, HIGH); // initialize SPI: SPI.begin(); //Reset the CPLD myCAM.write_reg(0x07, 0x80); delay(100); myCAM.write_reg(0x07, 0x00); delay(100); String CameraModule = "SPI Bus Check"; if(CameraModule == "SPI Bus Check"){ while(1){ //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("SPI interface Error!")); delay(1000);continue; }else{ Serial.println(F("SPI interface OK."));break; } } } delay(2000); String SDModule = "SD Check"; if(SDModule == "SD Check"){ //Initialize SD Card while(!SD.begin(SD_CS)){ Serial.println(F("SD Card Error!"));delay(1000); } Serial.println(F("SD Card detected.")); #if defined (OV2640_MINI_2MP) 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; } } #elif defined (OV3640_MINI_3MP) while(1){ //Check if the camera module type is OV3640 myCAM.rdSensorReg16_8(OV3640_CHIPID_HIGH, &vid); myCAM.rdSensorReg16_8(OV3640_CHIPID_LOW, &pid); if ((vid != 0x36) || (pid != 0x4C)){ Serial.println(F("Can't find OV3640 module!")); delay(1000);continue; }else{ Serial.println(F("OV3640 detected."));break; } } #else while(1){ //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!")); delay(1000);continue; } else{ Serial.println(F("OV5642 detected."));break; } } #endif myCAM.set_format(JPEG); myCAM.InitCAM(); #if defined (OV2640_MINI_2MP) myCAM.OV2640_set_JPEG_size(OV2640_160x120); #elif defined (OV3640_MINI_3MP) myCAM.OV3640_set_JPEG_size(OV3640_320x240); #else myCAM.write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK); //VSYNC is active HIGH myCAM.OV5642_set_JPEG_size(OV5642_320x240); #endif delay(6000); // Every 6 Seconds } } void loop(){ myCAMSaveToSDFile(); delay(6000); // Saves to the camera every 6 seconds }