Teensy 4.1 and Arducam

I see, how would I change the version to that? I'm using Arduino IDE 1.8.19

Don't bother. I just reverted putting the begin's in the constructor and put them in the sketch. Just downloaded the updated library, https://github.com/mjs513/ArduCAM_t4 , and give the sketch below a try:
Code:
// 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 Mini camera, and can run on any Arduino platform.
// This demo was made for ArduCAM_Mini_5MP_Plus.
// It needs to be used in combination with PC software.
// It can test OV5642 functions.
//

// This program requires the ArduCAM V4.0.0 (or later) library and ArduCAM_Mini_5MP_Plus
// and use Arduino IDE 1.6.8 compiler or above
#include <Wire.h>
#include <ArduCAM.h>
#include <SPI.h>
#include "memorysaver.h"
//This demo can only work on OV5642_MINI_5MP_Plus  platform.
#if !(defined OV5642_MINI_5MP_PLUS)
  #error Please select the hardware platform and camera module in the ../libraries/ArduCAM/memorysaver.h file
#endif
#define BMPIMAGEOFFSET 66
const char bmp_header[BMPIMAGEOFFSET] PROGMEM =
{
  0x42, 0x4D, 0x36, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x28, 0x00,
  0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x03, 0x00,
  0x00, 0x00, 0x00, 0x58, 0x02, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x1F, 0x00,
  0x00, 0x00
};
// set pin 7 as the slave select for the digital pot:
const int CS = 10;
bool is_header = false;
int mode = 0;
uint8_t start_capture = 0;
 ArduCAM myCAM( OV5642, CS, &Wire1, &SPI );
uint8_t read_fifo_burst(ArduCAM myCAM);
void setup() {
// put your setup code here, to run once:
uint8_t vid, pid;
uint8_t temp;
Wire1.begin();
SPI.begin();
SPI.beginTransaction(SPISettings(12000000, MSBFIRST, SPI_MODE0));
Serial.begin(921600);
delay(5000);
Serial.println(F("ACK CMD ArduCAM Start! END"));
// set the CS as an output:
pinMode(CS, OUTPUT);
digitalWrite(CS, HIGH);

 //Reset the CPLD
myCAM.write_reg(0x07, 0x80);
delay(100);
myCAM.write_reg(0x07, 0x00);
delay(100); 
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("ACK CMD SPI interface Error! END"));
    delay(1000);continue;
  }else{
    Serial.println(F("ACK CMD SPI interface OK. END"));break;
  }
}
  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("ACK CMD Can't find OV5642 module! END"));
      delay(1000);continue;
    }
    else{
      Serial.println(F("ACK CMD OV5642 detected. END"));break;
    } 
  }
//Change to JPEG capture mode and initialize the OV5642 module
myCAM.set_format(JPEG);
myCAM.InitCAM();

  myCAM.write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);   //VSYNC is active HIGH
  myCAM.OV5642_set_JPEG_size(OV5642_320x240);
delay(1000);
myCAM.clear_fifo_flag();
myCAM.write_reg(ARDUCHIP_FRAMES,0x00);
}
void loop() {
// put your main code here, to run repeatedly:
uint8_t temp = 0xff, temp_last = 0;
bool is_header = false;
if (Serial.available())
{
  temp = Serial.read();
  switch (temp)
  {
    case 0:
      myCAM.OV5642_set_JPEG_size(OV5642_320x240);delay(1000);
      Serial.println(F("ACK CMD switch to OV5642_320x240 END"));
    temp = 0xff;
    break;
    case 1:
      myCAM.OV5642_set_JPEG_size(OV5642_640x480);delay(1000);
      Serial.println(F("ACK CMD switch to OV5642_640x480 END"));
    temp = 0xff;
    break;
    case 2: 
      myCAM.OV5642_set_JPEG_size(OV5642_1024x768);delay(1000);
      Serial.println(F("ACK CMD switch to OV5642_1024x768 END"));
    temp = 0xff;
    break;
    case 3:
    temp = 0xff;
      myCAM.OV5642_set_JPEG_size(OV5642_1280x960);delay(1000);
      Serial.println(F("ACK CMD switch to OV5642_1280x960 END"));
    break;
    case 4:
    temp = 0xff;
      myCAM.OV5642_set_JPEG_size(OV5642_1600x1200);delay(1000);
      Serial.println(F("ACK CMD switch to OV5642_1600x1200 END"));
    break;
    case 5:
    temp = 0xff;
      myCAM.OV5642_set_JPEG_size(OV5642_2048x1536);delay(1000);
      Serial.println(F("ACK CMD switch to OV5642_2048x1536 END"));
    break;
    case 6:
    temp = 0xff;
      myCAM.OV5642_set_JPEG_size(OV5642_2592x1944);delay(1000);
      Serial.println(F("ACK CMD switch to OV5642_2592x1944 END"));
    break;
    case 0x10:
    mode = 1;
    temp = 0xff;
    start_capture = 1;
    Serial.println(F("ACK CMD CAM start single shoot. END"));
    break;
    case 0x11: 
    temp = 0xff;
    myCAM.set_format(JPEG);
    myCAM.InitCAM();
    #if !(defined (OV2640_MINI_2MP))
    myCAM.set_bit(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);
    #endif
    break;
    case 0x20:
    mode = 2;
    temp = 0xff;
    start_capture = 2;
    Serial.println(F("ACK CMD CAM start video streaming. END"));
    break;
    case 0x30:
    mode = 3;
    temp = 0xff;
    start_capture = 3;
    Serial.println(F("ACK CMD CAM start single shoot. END"));
    break;
    case 0x31:
    temp = 0xff;
    myCAM.set_format(BMP);
    myCAM.InitCAM();     
    myCAM.clear_bit(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);
    myCAM.wrSensorReg16_8(0x3818, 0x81);
    myCAM.wrSensorReg16_8(0x3621, 0xA7);
    break;
    case 0x40:
    myCAM.OV5642_set_Light_Mode(Advanced_AWB);temp = 0xff;
     Serial.println(F("ACK CMD Set to Advanced_AWB END"));break;
    case 0x41:
    myCAM.OV5642_set_Light_Mode(Simple_AWB);temp = 0xff;
     Serial.println(F("ACK CMD Set to Simple_AWB END"));break;
     case 0x42:
    myCAM.OV5642_set_Light_Mode(Manual_day);temp = 0xff;
     Serial.println(F("ACK CMD Set to Manual_day END"));break;
     case 0x43:
    myCAM.OV5642_set_Light_Mode(Manual_A);temp = 0xff;
     Serial.println(F("ACK CMD Set to Manual_A END"));break;
     case 0x44:
    myCAM.OV5642_set_Light_Mode(Manual_cwf);temp = 0xff;
     Serial.println(F("ACK CMD Set to Manual_cwf END"));break;
     case 0x45:
    myCAM.OV5642_set_Light_Mode(Manual_cloudy);temp = 0xff;
     Serial.println(F("ACK CMD Set to Manual_cloudy END"));break;
      case 0x50:
    myCAM.OV5642_set_Color_Saturation(Saturation4);temp = 0xff;
     Serial.println(F("ACK CMD Set to Saturation+4 END"));break;
   case 0x51:
      myCAM.OV5642_set_Color_Saturation(Saturation3);temp = 0xff;
     Serial.println(F("ACK CMD Set to Saturation+3 END"));break;
   case 0x52:
    myCAM.OV5642_set_Color_Saturation(Saturation2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation+2 END"));break;
  case 0x53:
    myCAM.OV5642_set_Color_Saturation(Saturation1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation+1 END"));break;
   case 0x54:
    myCAM.OV5642_set_Color_Saturation(Saturation0);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation+0 END"));break;
   case 0x55:
    myCAM.OV5642_set_Color_Saturation(Saturation_1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation-1 END"));break;
   case 0x56:
    myCAM.OV5642_set_Color_Saturation(Saturation_2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation-2"));break;
    case 0x57:
    myCAM.OV5642_set_Color_Saturation(Saturation_3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation-3 END"));break;
   case 0x58:
  myCAM.OV5642_set_Light_Mode(Saturation_4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation-4 END"));break; 
   case 0x60:
  myCAM.OV5642_set_Brightness(Brightness4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+4 END"));break;
  case 0x61:
  myCAM.OV5642_set_Brightness(Brightness3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+3 END"));break; 
  case 0x62:
  myCAM.OV5642_set_Brightness(Brightness2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+2 END"));break; 
   case 0x63:
  myCAM.OV5642_set_Brightness(Brightness1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+1 END"));break; 
   case 0x64:
  myCAM.OV5642_set_Brightness(Brightness0);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+0 END"));break; 
    case 0x65:
  myCAM.OV5642_set_Brightness(Brightness_1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness-1 END"));break; 
     case 0x66:
  myCAM.OV5642_set_Brightness(Brightness_2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness-2 END"));break; 
    case 0x67:
  myCAM.OV5642_set_Brightness(Brightness_3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness-3 END"));break; 
    case 0x68:
  myCAM.OV5642_set_Brightness(Brightness_4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness-4 END"));break;
case 0x70:
  myCAM.OV5642_set_Contrast(Contrast4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+4 END"));break;
  case 0x71:
  myCAM.OV5642_set_Contrast(Contrast3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+3 END"));break; 
  case 0x72:
  myCAM.OV5642_set_Contrast(Contrast2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+2 END"));break; 
   case 0x73:
  myCAM.OV5642_set_Contrast(Contrast1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+1 END"));break; 
   case 0x74:
  myCAM.OV5642_set_Contrast(Contrast0);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+0 END"));break; 
    case 0x75:
  myCAM.OV5642_set_Contrast(Contrast_1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast-1 END"));break; 
     case 0x76:
  myCAM.OV5642_set_Contrast(Contrast_2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast-2 END"));break; 
    case 0x77:
  myCAM.OV5642_set_Contrast(Contrast_3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast-3 END"));break; 
    case 0x78:
  myCAM.OV5642_set_Contrast(Contrast_4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast-4 END"));break;
   case 0x80: 
    myCAM.OV5642_set_hue(degree_180);temp = 0xff;
     Serial.println(F("ACK CMD Set to -180 degree END"));break;   
   case 0x81: 
   myCAM.OV5642_set_hue(degree_150);temp = 0xff;
     Serial.println(F("ACK CMD Set to -150 degree END"));break;  
   case 0x82: 
   myCAM.OV5642_set_hue(degree_120);temp = 0xff;
     Serial.println(F("ACK CMD Set to -120 degree END"));break;  
   case 0x83: 
   myCAM.OV5642_set_hue(degree_90);temp = 0xff;
     Serial.println(F("ACK CMD Set to -90 degree END"));break;   
    case 0x84: 
   myCAM.OV5642_set_hue(degree_60);temp = 0xff;
     Serial.println(F("ACK CMD Set to -60 degree END"));break;   
    case 0x85: 
   myCAM.OV5642_set_hue(degree_30);temp = 0xff;
     Serial.println(F("ACK CMD Set to -30 degree END"));break;  
     case 0x86: 
   myCAM.OV5642_set_hue(degree_0);temp = 0xff;
     Serial.println(F("ACK CMD Set to 0 degree END"));break; 
   case 0x87: 
   myCAM.OV5642_set_hue(degree30);temp = 0xff;
     Serial.println(F("ACK CMD Set to 30 degree END"));break;
   case 0x88: 
   myCAM.OV5642_set_hue(degree60);temp = 0xff;
     Serial.println(F("ACK CMD Set to 60 degree END"));break;
    case 0x89: 
   myCAM.OV5642_set_hue(degree90);temp = 0xff;
     Serial.println(F("ACK CMD Set to 90 degree END"));break;
     case 0x8a: 
   myCAM.OV5642_set_hue(degree120);temp = 0xff;
     Serial.println(F("ACK CMD Set to 120 degree END"));break ; 
   case 0x8b: 
   myCAM.OV5642_set_hue(degree150);temp = 0xff;
     Serial.println(F("ACK CMD Set to 150 degree END"));break ;
   case 0x90: 
   myCAM.OV5642_set_Special_effects(Normal);temp = 0xff;
     Serial.println(F("ACK CMD Set to Normal END"));break ;
      case 0x91: 
   myCAM.OV5642_set_Special_effects(BW);temp = 0xff;
     Serial.println(F("ACK CMD Set to BW END"));break ;
    case 0x92: 
   myCAM.OV5642_set_Special_effects(Bluish);temp = 0xff;
     Serial.println(F("ACK CMD Set to Bluish END"));break ;
      case 0x93: 
   myCAM.OV5642_set_Special_effects(Sepia);temp = 0xff;
     Serial.println(F("ACK CMD Set to Sepia END"));break ;
    case 0x94: 
   myCAM.OV5642_set_Special_effects(Reddish);temp = 0xff;
     Serial.println(F("ACK CMD Set to Reddish END"));break ;
   case 0x95: 
   myCAM.OV5642_set_Special_effects(Greenish);temp = 0xff;
     Serial.println(F("ACK CMD Set to Greenish END"));break ;
   case 0x96: 
   myCAM.OV5642_set_Special_effects(Negative);temp = 0xff;
     Serial.println(F("ACK CMD Set to Negative END"));break ;
   case 0xA0: 
   myCAM.OV5642_set_Exposure_level(Exposure_17_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -1.7EV"));break ;  
     case 0xA1: 
   myCAM.OV5642_set_Exposure_level(Exposure_13_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -1.3EV END"));break ;
      case 0xA2: 
   myCAM.OV5642_set_Exposure_level(Exposure_10_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -1.0EV END"));break ; 
    case 0xA3: 
   myCAM.OV5642_set_Exposure_level(Exposure_07_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -0.7EV END"));break ;
     case 0xA4: 
   myCAM.OV5642_set_Exposure_level(Exposure_03_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -0.3EV END"));break ;
   case 0xA5: 
   myCAM.OV5642_set_Exposure_level(Exposure_default);temp = 0xff;
     Serial.println(F("ACK CMD Set to -Exposure_default END"));break ;
    case 0xA6: 
   myCAM.OV5642_set_Exposure_level(Exposure07_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to 0.7EV END"));break ;  
   case 0xA7: 
   myCAM.OV5642_set_Exposure_level(Exposure10_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to 1.0EV END"));break ;
    case 0xA8: 
   myCAM.OV5642_set_Exposure_level(Exposure13_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to 1.3EV END"));break ; 
    case 0xA9: 
   myCAM.OV5642_set_Exposure_level(Exposure17_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to 1.7EV END"));break ; 
   case 0xB0: 
   myCAM.OV5642_set_Sharpness(Auto_Sharpness_default);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Sharpness default END"));break ; 
    case 0xB1: 
   myCAM.OV5642_set_Sharpness(Auto_Sharpness1);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Sharpness +1 END"));break ; 
    case 0xB2: 
   myCAM.OV5642_set_Sharpness(Auto_Sharpness2);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Sharpness +2 END"));break ; 
      case 0xB3: 
   myCAM.OV5642_set_Sharpness(Manual_Sharpnessoff);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness off END"));break ; 
     case 0xB4: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness1);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +1 END"));break ;
     case 0xB5: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness2);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +2 END"));break ; 
     case 0xB6: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness3);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +3 END"));break ;
     case 0xB7: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness4);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +4 END"));break ;
    case 0xB8: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness5);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +5 END"));break ;  
    case 0xC0: 
     myCAM.OV5642_set_Mirror_Flip(MIRROR);temp = 0xff;
     Serial.println(F("ACK CMD Set to MIRROR END"));break ;  
    case 0xC1: 
     myCAM.OV5642_set_Mirror_Flip(FLIP);temp = 0xff;
     Serial.println(F("ACK CMD Set to FLIP END"));break ; 
    case 0xC2: 
     myCAM.OV5642_set_Mirror_Flip(MIRROR_FLIP);temp = 0xff;
     Serial.println(F("ACK CMD Set to MIRROR&FLIP END"));break ;
    case 0xC3: 
     myCAM.OV5642_set_Mirror_Flip(Normal);temp = 0xff;
     Serial.println(F("ACK CMD Set to Normal END"));break ;
     case 0xD0: 
     myCAM.OV5642_set_Compress_quality(high_quality);temp = 0xff;
     Serial.println(F("ACK CMD Set to high quality END"));break ;
      case 0xD1: 
     myCAM.OV5642_set_Compress_quality(default_quality);temp = 0xff;
     Serial.println(F("ACK CMD Set to default quality END"));break ;
      case 0xD2: 
     myCAM.OV5642_set_Compress_quality(low_quality);temp = 0xff;
     Serial.println(F("ACK CMD Set to low quality END"));break ;

      case 0xE0: 
     myCAM.OV5642_Test_Pattern(Color_bar);temp = 0xff;
     Serial.println(F("ACK CMD Set to Color bar END"));break ;
      case 0xE1: 
     myCAM.OV5642_Test_Pattern(Color_square);temp = 0xff;
     Serial.println(F("ACK CMD Set to Color square END"));break ;
      case 0xE2: 
     myCAM.OV5642_Test_Pattern(BW_square);temp = 0xff;
     Serial.println(F("ACK CMD Set to BW square END"));break ;
     case 0xE3: 
     myCAM.OV5642_Test_Pattern(DLI);temp = 0xff;
     Serial.println(F("ACK CMD Set to DLI END"));break ;
      default:
      break;
  }
}
if (mode == 1)
{
  if (start_capture == 1)
  {
    myCAM.flush_fifo();
    myCAM.clear_fifo_flag();
    //Start capture
    myCAM.start_capture();
    start_capture = 0;
  }
  if (myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK))
  {
    Serial.println(F("ACK CMD CAM Capture Done. END"));delay(50);
    read_fifo_burst(myCAM);
    //Clear the capture done flag
    myCAM.clear_fifo_flag();
  }
}
else if (mode == 2)
{
  while (1)
  {
    temp = Serial.read();
    if (temp == 0x21)
    {
      start_capture = 0;
      mode = 0;
      Serial.println(F("ACK CMD CAM stop video streaming. END"));
      break;
    }
    switch(temp){
       case 0x40:
    myCAM.OV5642_set_Light_Mode(Advanced_AWB);temp = 0xff;
     Serial.println(F("ACK CMD Set to Advanced_AWB END"));break;
    case 0x41:
    myCAM.OV5642_set_Light_Mode(Simple_AWB);temp = 0xff;
     Serial.println(F("ACK CMD Set to Simple_AWB END"));break;
     case 0x42:
    myCAM.OV5642_set_Light_Mode(Manual_day);temp = 0xff;
     Serial.println(F("ACK CMD Set to Manual_day END"));break;
     case 0x43:
    myCAM.OV5642_set_Light_Mode(Manual_A);temp = 0xff;
     Serial.println(F("ACK CMD Set to Manual_A END"));break;
     case 0x44:
    myCAM.OV5642_set_Light_Mode(Manual_cwf);temp = 0xff;
     Serial.println(F("ACK CMD Set to Manual_cwf END"));break;
     case 0x45:
    myCAM.OV5642_set_Light_Mode(Manual_cloudy);temp = 0xff;
     Serial.println(F("ACK CMD Set to Manual_cloudy END"));break;
      case 0x50:
    myCAM.OV5642_set_Color_Saturation(Saturation4);temp = 0xff;
     Serial.println(F("ACK CMD Set to Saturation+4 END"));break;
   case 0x51:
      myCAM.OV5642_set_Color_Saturation(Saturation3);temp = 0xff;
     Serial.println(F("ACK CMD Set to Saturation+3 END"));break;
   case 0x52:
    myCAM.OV5642_set_Color_Saturation(Saturation2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation+2 END"));break;
  case 0x53:
    myCAM.OV5642_set_Color_Saturation(Saturation1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation+1 END"));break;
   case 0x54:
    myCAM.OV5642_set_Color_Saturation(Saturation0);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation+0 END"));break;
   case 0x55:
    myCAM.OV5642_set_Color_Saturation(Saturation_1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation-1 END"));break;
   case 0x56:
    myCAM.OV5642_set_Color_Saturation(Saturation_2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation-2 END"));break;
    case 0x57:
    myCAM.OV5642_set_Color_Saturation(Saturation_3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation-3 END"));break;
   case 0x58:
  myCAM.OV5642_set_Light_Mode(Saturation_4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Saturation-4 END"));break; 
   case 0x60:
  myCAM.OV5642_set_Brightness(Brightness4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+4 END"));break;
  case 0x61:
  myCAM.OV5642_set_Brightness(Brightness3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+3 END"));break; 
  case 0x62:
  myCAM.OV5642_set_Brightness(Brightness2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+2 END"));break; 
   case 0x63:
  myCAM.OV5642_set_Brightness(Brightness1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+1 END"));break; 
   case 0x64:
  myCAM.OV5642_set_Brightness(Brightness0);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness+0 END"));break; 
    case 0x65:
  myCAM.OV5642_set_Brightness(Brightness_1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness-1 END"));break; 
     case 0x66:
  myCAM.OV5642_set_Brightness(Brightness_2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness-2 END"));break; 
    case 0x67:
  myCAM.OV5642_set_Brightness(Brightness_3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness-3 END"));break; 
    case 0x68:
  myCAM.OV5642_set_Brightness(Brightness_4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Brightness-4 END"));break;
case 0x70:
  myCAM.OV5642_set_Contrast(Contrast4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+4 END"));break;
  case 0x71:
  myCAM.OV5642_set_Contrast(Contrast3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+3 END"));break; 
  case 0x72:
  myCAM.OV5642_set_Contrast(Contrast2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+2 END"));break; 
   case 0x73:
  myCAM.OV5642_set_Contrast(Contrast1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+1 END"));break; 
   case 0x74:
  myCAM.OV5642_set_Contrast(Contrast0);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast+0 END"));break; 
    case 0x75:
  myCAM.OV5642_set_Contrast(Contrast_1);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast-1 END"));break; 
     case 0x76:
  myCAM.OV5642_set_Contrast(Contrast_2);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast-2 END"));break; 
    case 0x77:
  myCAM.OV5642_set_Contrast(Contrast_3);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast-3 END"));break; 
    case 0x78:
  myCAM.OV5642_set_Contrast(Contrast_4);temp = 0xff;
   Serial.println(F("ACK CMD Set to Contrast-4 END"));break;
   case 0x80: 
    myCAM.OV5642_set_hue(degree_180);temp = 0xff;
     Serial.println(F("ACK CMD Set to -180 degree END"));break;   
   case 0x81: 
   myCAM.OV5642_set_hue(degree_150);temp = 0xff;
     Serial.println(F("ACK CMD Set to -150 degree END"));break;  
   case 0x82: 
   myCAM.OV5642_set_hue(degree_120);temp = 0xff;
     Serial.println(F("ACK CMD Set to -120 degree END"));break;  
   case 0x83: 
   myCAM.OV5642_set_hue(degree_90);temp = 0xff;
     Serial.println(F("ACK CMD Set to -90 degree END"));break;   
    case 0x84: 
   myCAM.OV5642_set_hue(degree_60);temp = 0xff;
     Serial.println(F("ACK CMD Set to -60 degree END"));break;   
    case 0x85: 
   myCAM.OV5642_set_hue(degree_30);temp = 0xff;
     Serial.println(F("ACK CMD Set to -30 degree END"));break;  
     case 0x86: 
   myCAM.OV5642_set_hue(degree_0);temp = 0xff;
     Serial.println(F("ACK CMD Set to 0 degree END"));break; 
   case 0x87: 
   myCAM.OV5642_set_hue(degree30);temp = 0xff;
     Serial.println(F("ACK CMD Set to 30 degree END"));break;
   case 0x88: 
   myCAM.OV5642_set_hue(degree60);temp = 0xff;
     Serial.println(F("ACK CMD Set to 60 degree END"));break;
    case 0x89: 
   myCAM.OV5642_set_hue(degree90);temp = 0xff;
     Serial.println(F("ACK CMD Set to 90 degree END"));break;
     case 0x8a: 
   myCAM.OV5642_set_hue(degree120);temp = 0xff;
     Serial.println(F("ACK CMD Set to 120 degree END"));break ; 
   case 0x8b: 
   myCAM.OV5642_set_hue(degree150);temp = 0xff;
     Serial.println(F("ACK CMD Set to 150 degree END"));break ;
  case 0x90: 
   myCAM.OV5642_set_Special_effects(Normal);temp = 0xff;
     Serial.println(F("ACK CMD Set to Normal END"));break ;
      case 0x91: 
   myCAM.OV5642_set_Special_effects(BW);temp = 0xff;
     Serial.println(F("ACK CMD Set to BW END"));break ;
    case 0x92: 
   myCAM.OV5642_set_Special_effects(Bluish);temp = 0xff;
     Serial.println(F("ACK CMD Set to Bluish END"));break ;
      case 0x93: 
   myCAM.OV5642_set_Special_effects(Sepia);temp = 0xff;
     Serial.println(F("ACK CMD Set to Sepia END"));break ;
    case 0x94: 
   myCAM.OV5642_set_Special_effects(Reddish);temp = 0xff;
     Serial.println(F("ACK CMD Set to Reddish END"));break ;
   case 0x95: 
   myCAM.OV5642_set_Special_effects(Greenish);temp = 0xff;
     Serial.println(F("ACK CMD Set to Greenish END"));break ;
   case 0x96: 
   myCAM.OV5642_set_Special_effects(Negative);temp = 0xff;
     Serial.println(F("ACK CMD Set to Negative END"));break ;
   case 0xA0: 
   myCAM.OV5642_set_Exposure_level(Exposure_17_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -1.7EV END"));break ;  
     case 0xA1: 
   myCAM.OV5642_set_Exposure_level(Exposure_13_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -1.3EV END"));break ;
      case 0xA2: 
   myCAM.OV5642_set_Exposure_level(Exposure_10_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -1.0EV END"));break ; 
    case 0xA3: 
   myCAM.OV5642_set_Exposure_level(Exposure_07_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -0.7EV END"));break ;
     case 0xA4: 
   myCAM.OV5642_set_Exposure_level(Exposure_03_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to -0.3EV END"));break ;
   case 0xA5: 
   myCAM.OV5642_set_Exposure_level(Exposure_default);temp = 0xff;
     Serial.println(F("ACK CMD Set to -Exposure_default END"));break ;
    case 0xA6: 
   myCAM.OV5642_set_Exposure_level(Exposure07_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to 0.7EV END"));break ;  
   case 0xA7: 
   myCAM.OV5642_set_Exposure_level(Exposure10_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to 1.0EV END"));break ;
    case 0xA8: 
   myCAM.OV5642_set_Exposure_level(Exposure13_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to 1.3EV END"));break ; 
    case 0xA9: 
   myCAM.OV5642_set_Exposure_level(Exposure17_EV);temp = 0xff;
     Serial.println(F("ACK CMD Set to 1.7EV END"));break ; 
   case 0xB0: 
   myCAM.OV5642_set_Sharpness(Auto_Sharpness_default);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Sharpness default END"));break ; 
    case 0xB1: 
   myCAM.OV5642_set_Sharpness(Auto_Sharpness1);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Sharpness +1 END"));break ; 
    case 0xB2: 
   myCAM.OV5642_set_Sharpness(Auto_Sharpness2);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Sharpness +2 END"));break ; 
      case 0xB3: 
   myCAM.OV5642_set_Sharpness(Manual_Sharpnessoff);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness off END"));break ; 
     case 0xB4: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness1);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +1 END"));break ;
     case 0xB5: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness2);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +2 END"));break ; 
     case 0xB6: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness3);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +3 END"));break ;
     case 0xB7: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness4);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +4 END"));break ;
    case 0xB8: 
     myCAM.OV5642_set_Sharpness(Manual_Sharpness5);temp = 0xff;
     Serial.println(F("ACK CMD Set to Auto Manual Sharpness +5 END"));break ;  
    case 0xC0: 
     myCAM.OV5642_set_Mirror_Flip(MIRROR);temp = 0xff;
     Serial.println(F("ACK CMD Set to MIRROR END"));break ;  
    case 0xC1: 
     myCAM.OV5642_set_Mirror_Flip(FLIP);temp = 0xff;
     Serial.println(F("ACK CMD Set to FLIP END"));break ; 
    case 0xC2: 
     myCAM.OV5642_set_Mirror_Flip(MIRROR_FLIP);temp = 0xff;
     Serial.println(F("ACK CMD Set to MIRROR&FLIP END"));break ;
    case 0xC3: 
     myCAM.OV5642_set_Mirror_Flip(Normal);temp = 0xff;
     Serial.println(F("ACK CMD Set to Normal END"));break ;
     case 0xD0: 
     myCAM.OV5642_set_Compress_quality(high_quality);temp = 0xff;
     Serial.println(F("ACK CMD Set to high quality END"));break ;
      case 0xD1: 
     myCAM.OV5642_set_Compress_quality(default_quality);temp = 0xff;
     Serial.println(F("ACK CMD Set to default quality END"));break ;
      case 0xD2: 
     myCAM.OV5642_set_Compress_quality(low_quality);temp = 0xff;
     Serial.println(F("ACK CMD Set to low quality END"));break ;

      case 0xE0: 
     myCAM.OV5642_Test_Pattern(Color_bar);temp = 0xff;
     Serial.println(F("ACK CMD Set to Color bar END"));break ;
      case 0xE1: 
     myCAM.OV5642_Test_Pattern(Color_square);temp = 0xff;
     Serial.println(F("ACK CMD Set to Color square END"));break ;
      case 0xE2: 
     myCAM.OV5642_Test_Pattern(BW_square);temp = 0xff;
     Serial.println(F("ACK CMD Set to BW square END"));break ;
     case 0xE3: 
     myCAM.OV5642_Test_Pattern(DLI);temp = 0xff;
     Serial.println(F("ACK CMD Set to DLI END"));break ;
      
      }
    if (start_capture == 2)
    {
      myCAM.flush_fifo();
      myCAM.clear_fifo_flag();
      //Start capture
      myCAM.start_capture();
      start_capture = 0;
    }
    if (myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK))
    {
      uint32_t length = 0;
      length = myCAM.read_fifo_length();
      if ((length >= MAX_FIFO_SIZE) | (length == 0))
      {
        myCAM.clear_fifo_flag();
        start_capture = 2;
        continue;
      }
      myCAM.CS_LOW();
      myCAM.set_fifo_burst();//Set fifo burst mode
      temp =  SPI.transfer(0x00);
      length --;
      while ( length-- )
      {
        temp_last = temp;
        temp =  SPI.transfer(0x00);
        if (is_header == true)
        {
          Serial.write(temp);
        }
        else if ((temp == 0xD8) & (temp_last == 0xFF))
        {
          is_header = true;
          Serial.println(F("ACK IMG END"));
          Serial.write(temp_last);
          Serial.write(temp);
        }
        if ( (temp == 0xD9) && (temp_last == 0xFF) ) //If find the end ,break while,
        break;
        delayMicroseconds(4);
      }
      myCAM.CS_HIGH();
      SPI.endTransaction();
      myCAM.clear_fifo_flag();
      start_capture = 2;
      is_header = false;
    }
  }
}
else if (mode == 3)
{
  if (start_capture == 3)
  {
    //Flush the FIFO
    myCAM.flush_fifo();
    myCAM.clear_fifo_flag();
    //Start capture
    myCAM.start_capture();
    start_capture = 0;
  }
  if (myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK))
  {
    Serial.println(F("ACK CMD CAM Capture Done. END"));delay(50);
    uint8_t temp, temp_last;
    uint32_t length = 0;
    length = myCAM.read_fifo_length();
    if (length >= MAX_FIFO_SIZE ) 
    {
      Serial.println(F("ACK CMD Over size. END"));
      myCAM.clear_fifo_flag();
      return;
    }
    if (length == 0 ) //0 kb
    {
      Serial.println(F("ACK CMD Size is 0. END"));
      myCAM.clear_fifo_flag();
      return;
    }
    myCAM.CS_LOW();
    myCAM.set_fifo_burst();//Set fifo burst mode
    
    Serial.write(0xFF);
    Serial.write(0xAA);
    for (temp = 0; temp < BMPIMAGEOFFSET; temp++)
    {
      Serial.write(pgm_read_byte(&bmp_header[temp]));
    }
    //SPI.transfer(0x00);
    char VH, VL;
    int i = 0, j = 0;
    for (i = 0; i < 240; i++)
    {
      for (j = 0; j < 320; j++)
      {
        VH = SPI.transfer(0x00);;
        VL = SPI.transfer(0x00);;
        Serial.write(VL);
        delayMicroseconds(12);
        Serial.write(VH);
        delayMicroseconds(12);
      }
    }
    Serial.write(0xBB);
    Serial.write(0xCC);
    myCAM.CS_HIGH();
    SPI.endTransaction();

    //Clear the capture done flag
    myCAM.clear_fifo_flag();
  }
}
}
uint8_t read_fifo_burst(ArduCAM myCAM)
{
  uint8_t temp = 0, temp_last = 0;
  uint32_t length = 0;
  length = myCAM.read_fifo_length();
  Serial.println(length, DEC);
  if (length >= MAX_FIFO_SIZE) //512 kb
  {
    Serial.println(F("ACK CMD Over size. END"));
    return 0;
  }
  if (length == 0 ) //0 kb
  {
    Serial.println(F("ACK CMD Size is 0. END"));
    return 0;
  }
  myCAM.CS_LOW();
  myCAM.set_fifo_burst();//Set fifo burst mode
  temp =  SPI.transfer(0x00);
  length --;
  while ( length-- )
  {
    temp_last = temp;
    temp =  SPI.transfer(0x00);
    if (is_header == true)
    {
      Serial.write(temp);
    }
    else if ((temp == 0xD8) & (temp_last == 0xFF))
    {
      is_header = true;
      Serial.println(F("ACK IMG END"));
      Serial.write(temp_last);
      Serial.write(temp);
    }
    if ( (temp == 0xD9) && (temp_last == 0xFF) ) //If find the end ,break while,
    break;
    delayMicroseconds(15);
  }
  myCAM.CS_HIGH();
  SPI.endTransaction();

  is_header = false;
  return 1;
}
 
Don't bother. I just reverted putting the begin's in the constructor and put them in the sketch. Just downloaded the updated library, https://github.com/mjs513/ArduCAM_t4 , and give the sketch below a try:

Thank you very much for writing this. I don't get error messages anymore, but when I press 'Capture' I don't get an image window. If I press it once I repeatedly get the message:

CAM Capture Done.
Size is 0.

Screenshot 2023-08-17 100908.png
 
Try using bmp option. Seeing the same thing here and trying to troubleshoot. What’s going on. Something with this camera. As I said didn’t see these issues with the ov2640
 
I used the BMP option and now I get an image window, but it is definitely not a picture of what it sees, it's all black. The debugger also acts like it is in continuous mode even though I selected single mode. It seems like something is wrong with image transmission.

Screenshot 2023-08-17 105852.jpg
 
The problem is that the example sketches. Been testing this and seems to work better for JPEGs. Have to check the other capture modes. Let me know if it is working for you.
Code:
// 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 Mini camera, and can run on any Arduino platform.
// This demo was made for ArduCAM_Mini_5MP_Plus.
// It needs to be used in combination with PC software.
// It can test OV5642 functions.
//

// This program requires the ArduCAM V4.0.0 (or later) library and ArduCAM_Mini_5MP_Plus
// and use Arduino IDE 1.6.8 compiler or above
#include <Wire.h>
#include <ArduCAM.h>
#include <SPI.h>
#include "memorysaver.h"
//This demo can only work on OV5642_MINI_5MP_Plus  platform.
#if !(defined OV5642_MINI_5MP_PLUS)
#error Please select the hardware platform and camera module in the ../libraries/ArduCAM/memorysaver.h file
#endif
#define BMPIMAGEOFFSET 66
const char bmp_header[BMPIMAGEOFFSET] PROGMEM = {
  0x42, 0x4D, 0x36, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x28, 0x00,
  0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x03, 0x00,
  0x00, 0x00, 0x00, 0x58, 0x02, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x1F, 0x00,
  0x00, 0x00
};
// set pin 7 as the slave select for the digital pot:
const int CS = 10;
bool is_header = false;
int mode = 0;
uint8_t start_capture = 0;
ArduCAM myCAM(OV5642, CS, &Wire1, &SPI);
uint8_t read_fifo_burst(ArduCAM myCAM);

void setup() {
  // put your setup code here, to run once:
  uint8_t vid, pid;
  uint8_t temp;

  Wire1.begin();
  SPI.begin();
  SPI.beginTransaction(SPISettings(12000000, MSBFIRST, SPI_MODE0));

  Serial.begin(921600);
  delay(5000);
  Serial.println(F("ACK CMD ArduCAM Start! END"));
  // set the CS as an output:
  pinMode(CS, OUTPUT);
  digitalWrite(CS, HIGH);

  //Reset the CPLD
  myCAM.write_reg(0x07, 0x80);
  delay(100);
  myCAM.write_reg(0x07, 0x00);
  delay(100);
  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("ACK CMD SPI interface Error! END"));
      delay(1000);
      continue;
    } else {
      Serial.println(F("ACK CMD SPI interface OK. END"));
      break;
    }
  }
  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("ACK CMD Can't find OV5642 module! END"));
      delay(1000);
      continue;
    } else {
      Serial.println(F("ACK CMD OV5642 detected. END"));
      break;
    }
  }
  //Change to JPEG capture mode and initialize the OV5642 module
  myCAM.set_format(JPEG);
  myCAM.InitCAM();

  myCAM.write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);  //VSYNC is active HIGH
  myCAM.OV5642_set_JPEG_size(OV5642_320x240);
  delay(1000);
  myCAM.clear_fifo_flag();
  myCAM.write_reg(ARDUCHIP_FRAMES, 0x00);

  SPI.endTransaction();
}

void loop() {
  // put your main code here, to run repeatedly:
  uint8_t temp = 0xff, temp_last = 0;
  bool is_header = false;
  if (Serial.available()) {
    temp = Serial.read();
    switch (temp) {
      case 0:
        myCAM.OV5642_set_JPEG_size(OV5642_320x240);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_320x240 END"));
        temp = 0xff;
        break;
      case 1:
        myCAM.OV5642_set_JPEG_size(OV5642_640x480);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_640x480 END"));
        temp = 0xff;
        break;
      case 2:
        myCAM.OV5642_set_JPEG_size(OV5642_1024x768);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_1024x768 END"));
        temp = 0xff;
        break;
      case 3:
        temp = 0xff;
        myCAM.OV5642_set_JPEG_size(OV5642_1280x960);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_1280x960 END"));
        break;
      case 4:
        temp = 0xff;
        myCAM.OV5642_set_JPEG_size(OV5642_1600x1200);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_1600x1200 END"));
        break;
      case 5:
        temp = 0xff;
        myCAM.OV5642_set_JPEG_size(OV5642_2048x1536);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_2048x1536 END"));
        break;
      case 6:
        temp = 0xff;
        myCAM.OV5642_set_JPEG_size(OV5642_2592x1944);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_2592x1944 END"));
        break;
      case 0x10:
        mode = 1;
        temp = 0xff;
        start_capture = 1;
        Serial.println(F("ACK CMD CAM start single shoot. END"));
        break;
      case 0x11:
        temp = 0xff;
        myCAM.set_format(JPEG);
        myCAM.InitCAM();
#if !(defined(OV2640_MINI_2MP))
        myCAM.set_bit(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);
#endif
        break;
      case 0x20:
        mode = 2;
        temp = 0xff;
        start_capture = 2;
        Serial.println(F("ACK CMD CAM start video streaming. END"));
        break;
      case 0x30:
        mode = 3;
        temp = 0xff;
        start_capture = 3;
        Serial.println(F("ACK CMD CAM start single shoot. END"));
        break;
      case 0x31:
        temp = 0xff;
        myCAM.set_format(BMP);
        myCAM.InitCAM();
        myCAM.clear_bit(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);
        myCAM.wrSensorReg16_8(0x3818, 0x81);
        myCAM.wrSensorReg16_8(0x3621, 0xA7);
        break;
      case 0x40:
        myCAM.OV5642_set_Light_Mode(Advanced_AWB);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Advanced_AWB END"));
        break;
      case 0x41:
        myCAM.OV5642_set_Light_Mode(Simple_AWB);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Simple_AWB END"));
        break;
      case 0x42:
        myCAM.OV5642_set_Light_Mode(Manual_day);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Manual_day END"));
        break;
      case 0x43:
        myCAM.OV5642_set_Light_Mode(Manual_A);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Manual_A END"));
        break;
      case 0x44:
        myCAM.OV5642_set_Light_Mode(Manual_cwf);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Manual_cwf END"));
        break;
      case 0x45:
        myCAM.OV5642_set_Light_Mode(Manual_cloudy);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Manual_cloudy END"));
        break;
      case 0x50:
        myCAM.OV5642_set_Color_Saturation(Saturation4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+4 END"));
        break;
      case 0x51:
        myCAM.OV5642_set_Color_Saturation(Saturation3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+3 END"));
        break;
      case 0x52:
        myCAM.OV5642_set_Color_Saturation(Saturation2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+2 END"));
        break;
      case 0x53:
        myCAM.OV5642_set_Color_Saturation(Saturation1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+1 END"));
        break;
      case 0x54:
        myCAM.OV5642_set_Color_Saturation(Saturation0);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+0 END"));
        break;
      case 0x55:
        myCAM.OV5642_set_Color_Saturation(Saturation_1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation-1 END"));
        break;
      case 0x56:
        myCAM.OV5642_set_Color_Saturation(Saturation_2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation-2"));
        break;
      case 0x57:
        myCAM.OV5642_set_Color_Saturation(Saturation_3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation-3 END"));
        break;
      case 0x58:
        myCAM.OV5642_set_Light_Mode(Saturation_4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation-4 END"));
        break;
      case 0x60:
        myCAM.OV5642_set_Brightness(Brightness4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+4 END"));
        break;
      case 0x61:
        myCAM.OV5642_set_Brightness(Brightness3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+3 END"));
        break;
      case 0x62:
        myCAM.OV5642_set_Brightness(Brightness2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+2 END"));
        break;
      case 0x63:
        myCAM.OV5642_set_Brightness(Brightness1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+1 END"));
        break;
      case 0x64:
        myCAM.OV5642_set_Brightness(Brightness0);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+0 END"));
        break;
      case 0x65:
        myCAM.OV5642_set_Brightness(Brightness_1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness-1 END"));
        break;
      case 0x66:
        myCAM.OV5642_set_Brightness(Brightness_2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness-2 END"));
        break;
      case 0x67:
        myCAM.OV5642_set_Brightness(Brightness_3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness-3 END"));
        break;
      case 0x68:
        myCAM.OV5642_set_Brightness(Brightness_4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness-4 END"));
        break;
      case 0x70:
        myCAM.OV5642_set_Contrast(Contrast4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+4 END"));
        break;
      case 0x71:
        myCAM.OV5642_set_Contrast(Contrast3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+3 END"));
        break;
      case 0x72:
        myCAM.OV5642_set_Contrast(Contrast2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+2 END"));
        break;
      case 0x73:
        myCAM.OV5642_set_Contrast(Contrast1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+1 END"));
        break;
      case 0x74:
        myCAM.OV5642_set_Contrast(Contrast0);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+0 END"));
        break;
      case 0x75:
        myCAM.OV5642_set_Contrast(Contrast_1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast-1 END"));
        break;
      case 0x76:
        myCAM.OV5642_set_Contrast(Contrast_2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast-2 END"));
        break;
      case 0x77:
        myCAM.OV5642_set_Contrast(Contrast_3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast-3 END"));
        break;
      case 0x78:
        myCAM.OV5642_set_Contrast(Contrast_4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast-4 END"));
        break;
      case 0x80:
        myCAM.OV5642_set_hue(degree_180);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -180 degree END"));
        break;
      case 0x81:
        myCAM.OV5642_set_hue(degree_150);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -150 degree END"));
        break;
      case 0x82:
        myCAM.OV5642_set_hue(degree_120);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -120 degree END"));
        break;
      case 0x83:
        myCAM.OV5642_set_hue(degree_90);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -90 degree END"));
        break;
      case 0x84:
        myCAM.OV5642_set_hue(degree_60);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -60 degree END"));
        break;
      case 0x85:
        myCAM.OV5642_set_hue(degree_30);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -30 degree END"));
        break;
      case 0x86:
        myCAM.OV5642_set_hue(degree_0);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 0 degree END"));
        break;
      case 0x87:
        myCAM.OV5642_set_hue(degree30);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 30 degree END"));
        break;
      case 0x88:
        myCAM.OV5642_set_hue(degree60);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 60 degree END"));
        break;
      case 0x89:
        myCAM.OV5642_set_hue(degree90);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 90 degree END"));
        break;
      case 0x8a:
        myCAM.OV5642_set_hue(degree120);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 120 degree END"));
        break;
      case 0x8b:
        myCAM.OV5642_set_hue(degree150);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 150 degree END"));
        break;
      case 0x90:
        myCAM.OV5642_set_Special_effects(Normal);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Normal END"));
        break;
      case 0x91:
        myCAM.OV5642_set_Special_effects(BW);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to BW END"));
        break;
      case 0x92:
        myCAM.OV5642_set_Special_effects(Bluish);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Bluish END"));
        break;
      case 0x93:
        myCAM.OV5642_set_Special_effects(Sepia);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Sepia END"));
        break;
      case 0x94:
        myCAM.OV5642_set_Special_effects(Reddish);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Reddish END"));
        break;
      case 0x95:
        myCAM.OV5642_set_Special_effects(Greenish);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Greenish END"));
        break;
      case 0x96:
        myCAM.OV5642_set_Special_effects(Negative);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Negative END"));
        break;
      case 0xA0:
        myCAM.OV5642_set_Exposure_level(Exposure_17_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -1.7EV"));
        break;
      case 0xA1:
        myCAM.OV5642_set_Exposure_level(Exposure_13_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -1.3EV END"));
        break;
      case 0xA2:
        myCAM.OV5642_set_Exposure_level(Exposure_10_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -1.0EV END"));
        break;
      case 0xA3:
        myCAM.OV5642_set_Exposure_level(Exposure_07_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -0.7EV END"));
        break;
      case 0xA4:
        myCAM.OV5642_set_Exposure_level(Exposure_03_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -0.3EV END"));
        break;
      case 0xA5:
        myCAM.OV5642_set_Exposure_level(Exposure_default);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -Exposure_default END"));
        break;
      case 0xA6:
        myCAM.OV5642_set_Exposure_level(Exposure07_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 0.7EV END"));
        break;
      case 0xA7:
        myCAM.OV5642_set_Exposure_level(Exposure10_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 1.0EV END"));
        break;
      case 0xA8:
        myCAM.OV5642_set_Exposure_level(Exposure13_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 1.3EV END"));
        break;
      case 0xA9:
        myCAM.OV5642_set_Exposure_level(Exposure17_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 1.7EV END"));
        break;
      case 0xB0:
        myCAM.OV5642_set_Sharpness(Auto_Sharpness_default);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Sharpness default END"));
        break;
      case 0xB1:
        myCAM.OV5642_set_Sharpness(Auto_Sharpness1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Sharpness +1 END"));
        break;
      case 0xB2:
        myCAM.OV5642_set_Sharpness(Auto_Sharpness2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Sharpness +2 END"));
        break;
      case 0xB3:
        myCAM.OV5642_set_Sharpness(Manual_Sharpnessoff);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness off END"));
        break;
      case 0xB4:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +1 END"));
        break;
      case 0xB5:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +2 END"));
        break;
      case 0xB6:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +3 END"));
        break;
      case 0xB7:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +4 END"));
        break;
      case 0xB8:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness5);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +5 END"));
        break;
      case 0xC0:
        myCAM.OV5642_set_Mirror_Flip(MIRROR);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to MIRROR END"));
        break;
      case 0xC1:
        myCAM.OV5642_set_Mirror_Flip(FLIP);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to FLIP END"));
        break;
      case 0xC2:
        myCAM.OV5642_set_Mirror_Flip(MIRROR_FLIP);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to MIRROR&FLIP END"));
        break;
      case 0xC3:
        myCAM.OV5642_set_Mirror_Flip(Normal);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Normal END"));
        break;
      case 0xD0:
        myCAM.OV5642_set_Compress_quality(high_quality);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to high quality END"));
        break;
      case 0xD1:
        myCAM.OV5642_set_Compress_quality(default_quality);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to default quality END"));
        break;
      case 0xD2:
        myCAM.OV5642_set_Compress_quality(low_quality);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to low quality END"));
        break;

      case 0xE0:
        myCAM.OV5642_Test_Pattern(Color_bar);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Color bar END"));
        break;
      case 0xE1:
        myCAM.OV5642_Test_Pattern(Color_square);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Color square END"));
        break;
      case 0xE2:
        myCAM.OV5642_Test_Pattern(BW_square);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to BW square END"));
        break;
      case 0xE3:
        myCAM.OV5642_Test_Pattern(DLI);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to DLI END"));
        break;
      default:
        break;
    }
  }
  if (mode == 1) {
    if (start_capture == 1) {
      myCAM.flush_fifo();
      myCAM.clear_fifo_flag();
      //Start capture
      myCAM.start_capture();
      start_capture = 0;
    }
    if (myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK)) {
      Serial.println(F("ACK CMD CAM Capture Done Mode1. END"));
      delay(50);
      read_fifo_burst(myCAM);
      //Clear the capture done flag
      myCAM.clear_fifo_flag();
    }

  } else if (mode == 2) {
    while (1) {
      temp = Serial.read();
      if (temp == 0x21) {
        start_capture = 0;
        mode = 0;
        Serial.println(F("ACK CMD CAM stop video streaming Mode2. END"));
        break;
      }
      switch (temp) {
        case 0x40:
          myCAM.OV5642_set_Light_Mode(Advanced_AWB);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Advanced_AWB END"));
          break;
        case 0x41:
          myCAM.OV5642_set_Light_Mode(Simple_AWB);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Simple_AWB END"));
          break;
        case 0x42:
          myCAM.OV5642_set_Light_Mode(Manual_day);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Manual_day END"));
          break;
        case 0x43:
          myCAM.OV5642_set_Light_Mode(Manual_A);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Manual_A END"));
          break;
        case 0x44:
          myCAM.OV5642_set_Light_Mode(Manual_cwf);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Manual_cwf END"));
          break;
        case 0x45:
          myCAM.OV5642_set_Light_Mode(Manual_cloudy);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Manual_cloudy END"));
          break;
        case 0x50:
          myCAM.OV5642_set_Color_Saturation(Saturation4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+4 END"));
          break;
        case 0x51:
          myCAM.OV5642_set_Color_Saturation(Saturation3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+3 END"));
          break;
        case 0x52:
          myCAM.OV5642_set_Color_Saturation(Saturation2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+2 END"));
          break;
        case 0x53:
          myCAM.OV5642_set_Color_Saturation(Saturation1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+1 END"));
          break;
        case 0x54:
          myCAM.OV5642_set_Color_Saturation(Saturation0);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+0 END"));
          break;
        case 0x55:
          myCAM.OV5642_set_Color_Saturation(Saturation_1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation-1 END"));
          break;
        case 0x56:
          myCAM.OV5642_set_Color_Saturation(Saturation_2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation-2 END"));
          break;
        case 0x57:
          myCAM.OV5642_set_Color_Saturation(Saturation_3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation-3 END"));
          break;
        case 0x58:
          myCAM.OV5642_set_Light_Mode(Saturation_4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation-4 END"));
          break;
        case 0x60:
          myCAM.OV5642_set_Brightness(Brightness4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+4 END"));
          break;
        case 0x61:
          myCAM.OV5642_set_Brightness(Brightness3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+3 END"));
          break;
        case 0x62:
          myCAM.OV5642_set_Brightness(Brightness2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+2 END"));
          break;
        case 0x63:
          myCAM.OV5642_set_Brightness(Brightness1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+1 END"));
          break;
        case 0x64:
          myCAM.OV5642_set_Brightness(Brightness0);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+0 END"));
          break;
        case 0x65:
          myCAM.OV5642_set_Brightness(Brightness_1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness-1 END"));
          break;
        case 0x66:
          myCAM.OV5642_set_Brightness(Brightness_2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness-2 END"));
          break;
        case 0x67:
          myCAM.OV5642_set_Brightness(Brightness_3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness-3 END"));
          break;
        case 0x68:
          myCAM.OV5642_set_Brightness(Brightness_4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness-4 END"));
          break;
        case 0x70:
          myCAM.OV5642_set_Contrast(Contrast4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+4 END"));
          break;
        case 0x71:
          myCAM.OV5642_set_Contrast(Contrast3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+3 END"));
          break;
        case 0x72:
          myCAM.OV5642_set_Contrast(Contrast2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+2 END"));
          break;
        case 0x73:
          myCAM.OV5642_set_Contrast(Contrast1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+1 END"));
          break;
        case 0x74:
          myCAM.OV5642_set_Contrast(Contrast0);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+0 END"));
          break;
        case 0x75:
          myCAM.OV5642_set_Contrast(Contrast_1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast-1 END"));
          break;
        case 0x76:
          myCAM.OV5642_set_Contrast(Contrast_2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast-2 END"));
          break;
        case 0x77:
          myCAM.OV5642_set_Contrast(Contrast_3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast-3 END"));
          break;
        case 0x78:
          myCAM.OV5642_set_Contrast(Contrast_4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast-4 END"));
          break;
        case 0x80:
          myCAM.OV5642_set_hue(degree_180);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -180 degree END"));
          break;
        case 0x81:
          myCAM.OV5642_set_hue(degree_150);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -150 degree END"));
          break;
        case 0x82:
          myCAM.OV5642_set_hue(degree_120);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -120 degree END"));
          break;
        case 0x83:
          myCAM.OV5642_set_hue(degree_90);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -90 degree END"));
          break;
        case 0x84:
          myCAM.OV5642_set_hue(degree_60);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -60 degree END"));
          break;
        case 0x85:
          myCAM.OV5642_set_hue(degree_30);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -30 degree END"));
          break;
        case 0x86:
          myCAM.OV5642_set_hue(degree_0);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 0 degree END"));
          break;
        case 0x87:
          myCAM.OV5642_set_hue(degree30);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 30 degree END"));
          break;
        case 0x88:
          myCAM.OV5642_set_hue(degree60);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 60 degree END"));
          break;
        case 0x89:
          myCAM.OV5642_set_hue(degree90);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 90 degree END"));
          break;
        case 0x8a:
          myCAM.OV5642_set_hue(degree120);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 120 degree END"));
          break;
        case 0x8b:
          myCAM.OV5642_set_hue(degree150);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 150 degree END"));
          break;
        case 0x90:
          myCAM.OV5642_set_Special_effects(Normal);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Normal END"));
          break;
        case 0x91:
          myCAM.OV5642_set_Special_effects(BW);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to BW END"));
          break;
        case 0x92:
          myCAM.OV5642_set_Special_effects(Bluish);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Bluish END"));
          break;
        case 0x93:
          myCAM.OV5642_set_Special_effects(Sepia);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Sepia END"));
          break;
        case 0x94:
          myCAM.OV5642_set_Special_effects(Reddish);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Reddish END"));
          break;
        case 0x95:
          myCAM.OV5642_set_Special_effects(Greenish);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Greenish END"));
          break;
        case 0x96:
          myCAM.OV5642_set_Special_effects(Negative);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Negative END"));
          break;
        case 0xA0:
          myCAM.OV5642_set_Exposure_level(Exposure_17_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -1.7EV END"));
          break;
        case 0xA1:
          myCAM.OV5642_set_Exposure_level(Exposure_13_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -1.3EV END"));
          break;
        case 0xA2:
          myCAM.OV5642_set_Exposure_level(Exposure_10_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -1.0EV END"));
          break;
        case 0xA3:
          myCAM.OV5642_set_Exposure_level(Exposure_07_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -0.7EV END"));
          break;
        case 0xA4:
          myCAM.OV5642_set_Exposure_level(Exposure_03_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -0.3EV END"));
          break;
        case 0xA5:
          myCAM.OV5642_set_Exposure_level(Exposure_default);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -Exposure_default END"));
          break;
        case 0xA6:
          myCAM.OV5642_set_Exposure_level(Exposure07_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 0.7EV END"));
          break;
        case 0xA7:
          myCAM.OV5642_set_Exposure_level(Exposure10_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 1.0EV END"));
          break;
        case 0xA8:
          myCAM.OV5642_set_Exposure_level(Exposure13_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 1.3EV END"));
          break;
        case 0xA9:
          myCAM.OV5642_set_Exposure_level(Exposure17_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 1.7EV END"));
          break;
        case 0xB0:
          myCAM.OV5642_set_Sharpness(Auto_Sharpness_default);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Sharpness default END"));
          break;
        case 0xB1:
          myCAM.OV5642_set_Sharpness(Auto_Sharpness1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Sharpness +1 END"));
          break;
        case 0xB2:
          myCAM.OV5642_set_Sharpness(Auto_Sharpness2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Sharpness +2 END"));
          break;
        case 0xB3:
          myCAM.OV5642_set_Sharpness(Manual_Sharpnessoff);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness off END"));
          break;
        case 0xB4:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +1 END"));
          break;
        case 0xB5:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +2 END"));
          break;
        case 0xB6:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +3 END"));
          break;
        case 0xB7:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +4 END"));
          break;
        case 0xB8:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness5);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +5 END"));
          break;
        case 0xC0:
          myCAM.OV5642_set_Mirror_Flip(MIRROR);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to MIRROR END"));
          break;
        case 0xC1:
          myCAM.OV5642_set_Mirror_Flip(FLIP);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to FLIP END"));
          break;
        case 0xC2:
          myCAM.OV5642_set_Mirror_Flip(MIRROR_FLIP);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to MIRROR&FLIP END"));
          break;
        case 0xC3:
          myCAM.OV5642_set_Mirror_Flip(Normal);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Normal END"));
          break;
        case 0xD0:
          myCAM.OV5642_set_Compress_quality(high_quality);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to high quality END"));
          break;
        case 0xD1:
          myCAM.OV5642_set_Compress_quality(default_quality);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to default quality END"));
          break;
        case 0xD2:
          myCAM.OV5642_set_Compress_quality(low_quality);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to low quality END"));
          break;

        case 0xE0:
          myCAM.OV5642_Test_Pattern(Color_bar);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Color bar END"));
          break;
        case 0xE1:
          myCAM.OV5642_Test_Pattern(Color_square);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Color square END"));
          break;
        case 0xE2:
          myCAM.OV5642_Test_Pattern(BW_square);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to BW square END"));
          break;
        case 0xE3:
          myCAM.OV5642_Test_Pattern(DLI);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to DLI END"));
          break;
      }
      if (start_capture == 2) {
        myCAM.flush_fifo();
        myCAM.clear_fifo_flag();
        //Start capture
        myCAM.start_capture();
        start_capture = 0;
      }
      if (myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK)) {
        uint32_t length = 0;
        length = myCAM.read_fifo_length();
        if ((length >= MAX_FIFO_SIZE) | (length == 0)) {
          myCAM.clear_fifo_flag();
          start_capture = 2;
          continue;
        }
        SPI.beginTransaction(SPISettings(12000000, MSBFIRST, SPI_MODE0));
        myCAM.CS_LOW();
        myCAM.set_fifo_burst();  //Set fifo burst mode
        temp = SPI.transfer(0x00);
        length--;
        while (length--) {
          temp_last = temp;
          temp = SPI.transfer(0x00);
          if (is_header == true) {
            Serial.write(temp);
          } else if ((temp == 0xD8) & (temp_last == 0xFF)) {
            is_header = true;
            Serial.println(F("ACK IMG END"));
            Serial.write(temp_last);
            Serial.write(temp);
          }
          if ((temp == 0xD9) && (temp_last == 0xFF))  //If find the end ,break while,
            break;
          delayMicroseconds(4);
        }
        myCAM.CS_HIGH();
        SPI.endTransaction();
        myCAM.clear_fifo_flag();
        start_capture = 2;
        is_header = false;
      }
    }
  } else if (mode == 3) {
    if (start_capture == 3) {
      //Flush the FIFO
      myCAM.flush_fifo();
      myCAM.clear_fifo_flag();
      //Start capture
      myCAM.start_capture();
      start_capture = 0;
    }
    if (myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK)) {
      Serial.println(F("ACK CMD CAM Capture Done mode3. END"));
      delay(50);
      uint8_t temp, temp_last;
      uint32_t length = 0;
      length = myCAM.read_fifo_length();
      if (length >= MAX_FIFO_SIZE) {
        Serial.println(F("ACK CMD Over size. END"));
        myCAM.clear_fifo_flag();
        return;
      }
      if (length == 0)  //0 kb
      {
        Serial.println(F("ACK CMD Size is 0. END"));
        myCAM.clear_fifo_flag();
        return;
      }
      SPI.beginTransaction(SPISettings(12000000, MSBFIRST, SPI_MODE0));
      myCAM.CS_LOW();
      myCAM.set_fifo_burst();  //Set fifo burst mode

      Serial.write(0xFF);
      Serial.write(0xAA);
      for (temp = 0; temp < BMPIMAGEOFFSET; temp++) {
        Serial.write(pgm_read_byte(&bmp_header[temp]));
      }
      //SPI.transfer(0x00);
      char VH, VL;
      int i = 0, j = 0;
      for (i = 0; i < 240; i++) {
        for (j = 0; j < 320; j++) {
          VH = SPI.transfer(0x00);
          ;
          VL = SPI.transfer(0x00);
          ;
          Serial.write(VL);
          delayMicroseconds(12);
          Serial.write(VH);
          delayMicroseconds(12);
        }
      }
      Serial.write(0xBB);
      Serial.write(0xCC);
      myCAM.CS_HIGH();
      SPI.endTransaction();

      //Clear the capture done flag
      myCAM.clear_fifo_flag();
    }
  }
}
uint8_t read_fifo_burst(ArduCAM myCAM) {
  uint8_t temp = 0, temp_last = 0;
  uint32_t length = 0;
  length = myCAM.read_fifo_length();
  Serial.println(length, DEC);
  if (length >= MAX_FIFO_SIZE)  //512 kb
  {
    Serial.println(F("ACK CMD Over size. END"));
    return 0;
  }
  if (length == 0)  //0 kb
  {
    Serial.println(F("ACK CMD Size is 0. END"));
    return 0;
  }
  SPI.beginTransaction(SPISettings(12000000, MSBFIRST, SPI_MODE0));
  myCAM.CS_LOW();
  delayMicroseconds(5);
  myCAM.set_fifo_burst();  //Set fifo burst mode
  temp = SPI.transfer(0x00);
  length--;
  while (length--) {
    temp_last = temp;
    temp = SPI.transfer(0x00);
    if (is_header == true) {
      Serial.write(temp);
    } else if ((temp == 0xD8) & (temp_last == 0xFF)) {
      is_header = true;
      Serial.println(F("ACK IMG END"));
      Serial.write(temp_last);
      Serial.write(temp);
    }
    if ((temp == 0xD9) && (temp_last == 0xFF))  //If find the end ,break while,
      break;
    //delayMicroseconds(15);
  }
  myCAM.CS_HIGH();
  delayMicroseconds(5);
  SPI.endTransaction();

  is_header = false;
  return 1;
}
 
Unfortunately this sketch still doesn't work, I get no image window when I don't select "SetToBMP" and with "SetToBMP" selected, I get black, and a new image every few seconds, with some artifacts sometimes.

Screenshot 2023-08-17 141935.png

Out of curiousity I also changed the Teensyduino version to 1.59 beta3, and still got the same problem. Even going back to previous versions I still run into the same problems I did as on 1.58. I am thinking of getting the OV2460 2MP module and seeing how that works instead of the OV5642.
 
Unfortunately this sketch still doesn't work, I get no image window when I don't select "SetToBMP" and with "SetToBMP" selected, I get black, and a new image every few seconds, with some artifacts sometimes.

...

Out of curiousity I also changed the Teensyduino version to 1.59 beta3, and still got the same problem. Even going back to previous versions I still run into the same problems I did as on 1.58. I am thinking of getting the OV2460 2MP module and seeing how that works instead of the OV5642.

Well before you do that I fiddled with the sketch again - issue really is the delays in the read fifo buffer. Right now with my 5642 seems like it is working reliably including video mode. And now I am not fiddling with setBmp. One note on using their app.
1. The drop down for the pixel size does not correspond to the settings in the sketch so watch the output section of the app.
2. Probably the others dropdowns don't either - didn't really check those.
3. Found once you capture an image and image window opens don't close it if you are doing more captures. Seems like it doesn't want to open up again if you want to do another capture. Only way to fix it is to open and close the port (your blue button).

A couple of critical notes (found from playing with it):
1. Give it a 5 count between captures.
2. If you have a issue with captures on the first upload just plug and unplug the teensy. Seems to fix the issue (think something with the camera).


Note the below sketch is configured for Wire not wire1
Code:
// 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 Mini camera, and can run on any Arduino platform.
// This demo was made for ArduCAM_Mini_5MP_Plus.
// It needs to be used in combination with PC software.
// It can test OV5642 functions.
//

// This program requires the ArduCAM V4.0.0 (or later) library and ArduCAM_Mini_5MP_Plus
// and use Arduino IDE 1.6.8 compiler or above
#include <Wire.h>
#include <ArduCAM.h>
#include <SPI.h>
#include "memorysaver.h"
//This demo can only work on OV5642_MINI_5MP_Plus  platform.
#if !(defined OV5642_MINI_5MP_PLUS)
#error Please select the hardware platform and camera module in the ../libraries/ArduCAM/memorysaver.h file
#endif
#define BMPIMAGEOFFSET 66
const char bmp_header[BMPIMAGEOFFSET] PROGMEM = {
  0x42, 0x4D, 0x36, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x28, 0x00,
  0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x03, 0x00,
  0x00, 0x00, 0x00, 0x58, 0x02, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x1F, 0x00,
  0x00, 0x00
};
// set pin 7 as the slave select for the digital pot:
const int CS = 10;
bool is_header = false;
int mode = 0;
uint8_t start_capture = 0;
ArduCAM myCAM(OV5642, CS, &Wire, &SPI);
uint8_t read_fifo_burst(ArduCAM myCAM);

void setup() {
  // put your setup code here, to run once:
  uint8_t vid, pid;
  uint8_t temp;

  Wire.begin();
  SPI.begin();
  SPI.beginTransaction(SPISettings(12000000, MSBFIRST, SPI_MODE0));

  Serial.begin(921600);
  delay(5000);
  Serial.println(F("ACK CMD ArduCAM Start! END"));
  // set the CS as an output:
  pinMode(CS, OUTPUT);
  digitalWrite(CS, HIGH);

  //Reset the CPLD
  myCAM.write_reg(0x07, 0x80);
  delay(100);
  myCAM.write_reg(0x07, 0x00);
  delay(100);
  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("ACK CMD SPI interface Error! END"));
      delay(1000);
      continue;
    } else {
      Serial.println(F("ACK CMD SPI interface OK. END"));
      break;
    }
  }
  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("ACK CMD Can't find OV5642 module! END"));
      delay(1000);
      continue;
    } else {
      Serial.println(F("ACK CMD OV5642 detected. END"));
      break;
    }
  }
  //Change to JPEG capture mode and initialize the OV5642 module
  myCAM.set_format(JPEG);
  myCAM.InitCAM();

  myCAM.write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);  //VSYNC is active HIGH
  myCAM.OV5642_set_JPEG_size(OV5642_320x240);
  delay(1000);
  myCAM.clear_fifo_flag();
  myCAM.write_reg(ARDUCHIP_FRAMES, 0x00);

}

void loop() {
  // put your main code here, to run repeatedly:
  uint8_t temp = 0xff, temp_last = 0;
  bool is_header = false;
  if (Serial.available()) {
    temp = Serial.read();
    switch (temp) {
      case 0:
        myCAM.OV5642_set_JPEG_size(OV5642_320x240);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_320x240 END"));
        temp = 0xff;
        break;
      case 1:
        myCAM.OV5642_set_JPEG_size(OV5642_640x480);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_640x480 END"));
        temp = 0xff;
        break;
      case 2:
        myCAM.OV5642_set_JPEG_size(OV5642_1024x768);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_1024x768 END"));
        temp = 0xff;
        break;
      case 3:
        temp = 0xff;
        myCAM.OV5642_set_JPEG_size(OV5642_1280x960);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_1280x960 END"));
        break;
      case 4:
        temp = 0xff;
        myCAM.OV5642_set_JPEG_size(OV5642_1600x1200);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_1600x1200 END"));
        break;
      case 5:
        temp = 0xff;
        myCAM.OV5642_set_JPEG_size(OV5642_2048x1536);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_2048x1536 END"));
        break;
      case 6:
        temp = 0xff;
        myCAM.OV5642_set_JPEG_size(OV5642_2592x1944);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_2592x1944 END"));
        break;
      case 0x10:
        mode = 1;
        temp = 0xff;
        start_capture = 1;
        Serial.println(F("ACK CMD CAM start single shoot. END"));
        break;
      case 0x11:
        temp = 0xff;
        myCAM.set_format(JPEG);
        myCAM.InitCAM();
#if !(defined(OV2640_MINI_2MP))
        myCAM.set_bit(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);
#endif
        break;
      case 0x20:
        mode = 2;
        temp = 0xff;
        start_capture = 2;
        Serial.println(F("ACK CMD CAM start video streaming. END"));
        break;
      case 0x30:
        mode = 3;
        temp = 0xff;
        start_capture = 3;
        Serial.println(F("ACK CMD CAM start single shoot. END"));
        break;
      case 0x31:
        temp = 0xff;
        myCAM.set_format(BMP);
        myCAM.InitCAM();
        myCAM.clear_bit(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);
        myCAM.wrSensorReg16_8(0x3818, 0x81);
        myCAM.wrSensorReg16_8(0x3621, 0xA7);
        break;
      case 0x40:
        myCAM.OV5642_set_Light_Mode(Advanced_AWB);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Advanced_AWB END"));
        break;
      case 0x41:
        myCAM.OV5642_set_Light_Mode(Simple_AWB);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Simple_AWB END"));
        break;
      case 0x42:
        myCAM.OV5642_set_Light_Mode(Manual_day);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Manual_day END"));
        break;
      case 0x43:
        myCAM.OV5642_set_Light_Mode(Manual_A);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Manual_A END"));
        break;
      case 0x44:
        myCAM.OV5642_set_Light_Mode(Manual_cwf);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Manual_cwf END"));
        break;
      case 0x45:
        myCAM.OV5642_set_Light_Mode(Manual_cloudy);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Manual_cloudy END"));
        break;
      case 0x50:
        myCAM.OV5642_set_Color_Saturation(Saturation4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+4 END"));
        break;
      case 0x51:
        myCAM.OV5642_set_Color_Saturation(Saturation3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+3 END"));
        break;
      case 0x52:
        myCAM.OV5642_set_Color_Saturation(Saturation2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+2 END"));
        break;
      case 0x53:
        myCAM.OV5642_set_Color_Saturation(Saturation1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+1 END"));
        break;
      case 0x54:
        myCAM.OV5642_set_Color_Saturation(Saturation0);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+0 END"));
        break;
      case 0x55:
        myCAM.OV5642_set_Color_Saturation(Saturation_1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation-1 END"));
        break;
      case 0x56:
        myCAM.OV5642_set_Color_Saturation(Saturation_2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation-2"));
        break;
      case 0x57:
        myCAM.OV5642_set_Color_Saturation(Saturation_3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation-3 END"));
        break;
      case 0x58:
        myCAM.OV5642_set_Light_Mode(Saturation_4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation-4 END"));
        break;
      case 0x60:
        myCAM.OV5642_set_Brightness(Brightness4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+4 END"));
        break;
      case 0x61:
        myCAM.OV5642_set_Brightness(Brightness3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+3 END"));
        break;
      case 0x62:
        myCAM.OV5642_set_Brightness(Brightness2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+2 END"));
        break;
      case 0x63:
        myCAM.OV5642_set_Brightness(Brightness1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+1 END"));
        break;
      case 0x64:
        myCAM.OV5642_set_Brightness(Brightness0);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+0 END"));
        break;
      case 0x65:
        myCAM.OV5642_set_Brightness(Brightness_1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness-1 END"));
        break;
      case 0x66:
        myCAM.OV5642_set_Brightness(Brightness_2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness-2 END"));
        break;
      case 0x67:
        myCAM.OV5642_set_Brightness(Brightness_3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness-3 END"));
        break;
      case 0x68:
        myCAM.OV5642_set_Brightness(Brightness_4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness-4 END"));
        break;
      case 0x70:
        myCAM.OV5642_set_Contrast(Contrast4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+4 END"));
        break;
      case 0x71:
        myCAM.OV5642_set_Contrast(Contrast3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+3 END"));
        break;
      case 0x72:
        myCAM.OV5642_set_Contrast(Contrast2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+2 END"));
        break;
      case 0x73:
        myCAM.OV5642_set_Contrast(Contrast1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+1 END"));
        break;
      case 0x74:
        myCAM.OV5642_set_Contrast(Contrast0);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+0 END"));
        break;
      case 0x75:
        myCAM.OV5642_set_Contrast(Contrast_1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast-1 END"));
        break;
      case 0x76:
        myCAM.OV5642_set_Contrast(Contrast_2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast-2 END"));
        break;
      case 0x77:
        myCAM.OV5642_set_Contrast(Contrast_3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast-3 END"));
        break;
      case 0x78:
        myCAM.OV5642_set_Contrast(Contrast_4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast-4 END"));
        break;
      case 0x80:
        myCAM.OV5642_set_hue(degree_180);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -180 degree END"));
        break;
      case 0x81:
        myCAM.OV5642_set_hue(degree_150);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -150 degree END"));
        break;
      case 0x82:
        myCAM.OV5642_set_hue(degree_120);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -120 degree END"));
        break;
      case 0x83:
        myCAM.OV5642_set_hue(degree_90);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -90 degree END"));
        break;
      case 0x84:
        myCAM.OV5642_set_hue(degree_60);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -60 degree END"));
        break;
      case 0x85:
        myCAM.OV5642_set_hue(degree_30);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -30 degree END"));
        break;
      case 0x86:
        myCAM.OV5642_set_hue(degree_0);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 0 degree END"));
        break;
      case 0x87:
        myCAM.OV5642_set_hue(degree30);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 30 degree END"));
        break;
      case 0x88:
        myCAM.OV5642_set_hue(degree60);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 60 degree END"));
        break;
      case 0x89:
        myCAM.OV5642_set_hue(degree90);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 90 degree END"));
        break;
      case 0x8a:
        myCAM.OV5642_set_hue(degree120);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 120 degree END"));
        break;
      case 0x8b:
        myCAM.OV5642_set_hue(degree150);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 150 degree END"));
        break;
      case 0x90:
        myCAM.OV5642_set_Special_effects(Normal);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Normal END"));
        break;
      case 0x91:
        myCAM.OV5642_set_Special_effects(BW);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to BW END"));
        break;
      case 0x92:
        myCAM.OV5642_set_Special_effects(Bluish);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Bluish END"));
        break;
      case 0x93:
        myCAM.OV5642_set_Special_effects(Sepia);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Sepia END"));
        break;
      case 0x94:
        myCAM.OV5642_set_Special_effects(Reddish);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Reddish END"));
        break;
      case 0x95:
        myCAM.OV5642_set_Special_effects(Greenish);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Greenish END"));
        break;
      case 0x96:
        myCAM.OV5642_set_Special_effects(Negative);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Negative END"));
        break;
      case 0xA0:
        myCAM.OV5642_set_Exposure_level(Exposure_17_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -1.7EV"));
        break;
      case 0xA1:
        myCAM.OV5642_set_Exposure_level(Exposure_13_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -1.3EV END"));
        break;
      case 0xA2:
        myCAM.OV5642_set_Exposure_level(Exposure_10_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -1.0EV END"));
        break;
      case 0xA3:
        myCAM.OV5642_set_Exposure_level(Exposure_07_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -0.7EV END"));
        break;
      case 0xA4:
        myCAM.OV5642_set_Exposure_level(Exposure_03_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -0.3EV END"));
        break;
      case 0xA5:
        myCAM.OV5642_set_Exposure_level(Exposure_default);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -Exposure_default END"));
        break;
      case 0xA6:
        myCAM.OV5642_set_Exposure_level(Exposure07_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 0.7EV END"));
        break;
      case 0xA7:
        myCAM.OV5642_set_Exposure_level(Exposure10_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 1.0EV END"));
        break;
      case 0xA8:
        myCAM.OV5642_set_Exposure_level(Exposure13_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 1.3EV END"));
        break;
      case 0xA9:
        myCAM.OV5642_set_Exposure_level(Exposure17_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 1.7EV END"));
        break;
      case 0xB0:
        myCAM.OV5642_set_Sharpness(Auto_Sharpness_default);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Sharpness default END"));
        break;
      case 0xB1:
        myCAM.OV5642_set_Sharpness(Auto_Sharpness1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Sharpness +1 END"));
        break;
      case 0xB2:
        myCAM.OV5642_set_Sharpness(Auto_Sharpness2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Sharpness +2 END"));
        break;
      case 0xB3:
        myCAM.OV5642_set_Sharpness(Manual_Sharpnessoff);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness off END"));
        break;
      case 0xB4:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +1 END"));
        break;
      case 0xB5:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +2 END"));
        break;
      case 0xB6:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +3 END"));
        break;
      case 0xB7:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +4 END"));
        break;
      case 0xB8:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness5);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +5 END"));
        break;
      case 0xC0:
        myCAM.OV5642_set_Mirror_Flip(MIRROR);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to MIRROR END"));
        break;
      case 0xC1:
        myCAM.OV5642_set_Mirror_Flip(FLIP);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to FLIP END"));
        break;
      case 0xC2:
        myCAM.OV5642_set_Mirror_Flip(MIRROR_FLIP);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to MIRROR&FLIP END"));
        break;
      case 0xC3:
        myCAM.OV5642_set_Mirror_Flip(Normal);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Normal END"));
        break;
      case 0xD0:
        myCAM.OV5642_set_Compress_quality(high_quality);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to high quality END"));
        break;
      case 0xD1:
        myCAM.OV5642_set_Compress_quality(default_quality);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to default quality END"));
        break;
      case 0xD2:
        myCAM.OV5642_set_Compress_quality(low_quality);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to low quality END"));
        break;

      case 0xE0:
        myCAM.OV5642_Test_Pattern(Color_bar);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Color bar END"));
        break;
      case 0xE1:
        myCAM.OV5642_Test_Pattern(Color_square);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Color square END"));
        break;
      case 0xE2:
        myCAM.OV5642_Test_Pattern(BW_square);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to BW square END"));
        break;
      case 0xE3:
        myCAM.OV5642_Test_Pattern(DLI);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to DLI END"));
        break;
      default:
        break;
    }
  }
  if (mode == 1) {
    if (start_capture == 1) {
      myCAM.flush_fifo();
      myCAM.clear_fifo_flag();
      //Start capture
      myCAM.start_capture();
      start_capture = 0;
    }
    if (myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK)) {
      Serial.println(F("ACK CMD CAM Capture Done Mode1. END"));
      delay(50);
      read_fifo_burst(myCAM);
      //Clear the capture done flag
      myCAM.clear_fifo_flag();
    }

  } else if (mode == 2) {
    while (1) {
      temp = Serial.read();
      if (temp == 0x21) {
        start_capture = 0;
        mode = 0;
        Serial.println(F("ACK CMD CAM stop video streaming Mode2. END"));
        break;
      }
      switch (temp) {
        case 0x40:
          myCAM.OV5642_set_Light_Mode(Advanced_AWB);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Advanced_AWB END"));
          break;
        case 0x41:
          myCAM.OV5642_set_Light_Mode(Simple_AWB);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Simple_AWB END"));
          break;
        case 0x42:
          myCAM.OV5642_set_Light_Mode(Manual_day);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Manual_day END"));
          break;
        case 0x43:
          myCAM.OV5642_set_Light_Mode(Manual_A);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Manual_A END"));
          break;
        case 0x44:
          myCAM.OV5642_set_Light_Mode(Manual_cwf);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Manual_cwf END"));
          break;
        case 0x45:
          myCAM.OV5642_set_Light_Mode(Manual_cloudy);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Manual_cloudy END"));
          break;
        case 0x50:
          myCAM.OV5642_set_Color_Saturation(Saturation4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+4 END"));
          break;
        case 0x51:
          myCAM.OV5642_set_Color_Saturation(Saturation3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+3 END"));
          break;
        case 0x52:
          myCAM.OV5642_set_Color_Saturation(Saturation2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+2 END"));
          break;
        case 0x53:
          myCAM.OV5642_set_Color_Saturation(Saturation1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+1 END"));
          break;
        case 0x54:
          myCAM.OV5642_set_Color_Saturation(Saturation0);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+0 END"));
          break;
        case 0x55:
          myCAM.OV5642_set_Color_Saturation(Saturation_1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation-1 END"));
          break;
        case 0x56:
          myCAM.OV5642_set_Color_Saturation(Saturation_2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation-2 END"));
          break;
        case 0x57:
          myCAM.OV5642_set_Color_Saturation(Saturation_3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation-3 END"));
          break;
        case 0x58:
          myCAM.OV5642_set_Light_Mode(Saturation_4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation-4 END"));
          break;
        case 0x60:
          myCAM.OV5642_set_Brightness(Brightness4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+4 END"));
          break;
        case 0x61:
          myCAM.OV5642_set_Brightness(Brightness3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+3 END"));
          break;
        case 0x62:
          myCAM.OV5642_set_Brightness(Brightness2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+2 END"));
          break;
        case 0x63:
          myCAM.OV5642_set_Brightness(Brightness1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+1 END"));
          break;
        case 0x64:
          myCAM.OV5642_set_Brightness(Brightness0);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+0 END"));
          break;
        case 0x65:
          myCAM.OV5642_set_Brightness(Brightness_1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness-1 END"));
          break;
        case 0x66:
          myCAM.OV5642_set_Brightness(Brightness_2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness-2 END"));
          break;
        case 0x67:
          myCAM.OV5642_set_Brightness(Brightness_3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness-3 END"));
          break;
        case 0x68:
          myCAM.OV5642_set_Brightness(Brightness_4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness-4 END"));
          break;
        case 0x70:
          myCAM.OV5642_set_Contrast(Contrast4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+4 END"));
          break;
        case 0x71:
          myCAM.OV5642_set_Contrast(Contrast3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+3 END"));
          break;
        case 0x72:
          myCAM.OV5642_set_Contrast(Contrast2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+2 END"));
          break;
        case 0x73:
          myCAM.OV5642_set_Contrast(Contrast1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+1 END"));
          break;
        case 0x74:
          myCAM.OV5642_set_Contrast(Contrast0);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+0 END"));
          break;
        case 0x75:
          myCAM.OV5642_set_Contrast(Contrast_1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast-1 END"));
          break;
        case 0x76:
          myCAM.OV5642_set_Contrast(Contrast_2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast-2 END"));
          break;
        case 0x77:
          myCAM.OV5642_set_Contrast(Contrast_3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast-3 END"));
          break;
        case 0x78:
          myCAM.OV5642_set_Contrast(Contrast_4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast-4 END"));
          break;
        case 0x80:
          myCAM.OV5642_set_hue(degree_180);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -180 degree END"));
          break;
        case 0x81:
          myCAM.OV5642_set_hue(degree_150);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -150 degree END"));
          break;
        case 0x82:
          myCAM.OV5642_set_hue(degree_120);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -120 degree END"));
          break;
        case 0x83:
          myCAM.OV5642_set_hue(degree_90);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -90 degree END"));
          break;
        case 0x84:
          myCAM.OV5642_set_hue(degree_60);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -60 degree END"));
          break;
        case 0x85:
          myCAM.OV5642_set_hue(degree_30);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -30 degree END"));
          break;
        case 0x86:
          myCAM.OV5642_set_hue(degree_0);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 0 degree END"));
          break;
        case 0x87:
          myCAM.OV5642_set_hue(degree30);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 30 degree END"));
          break;
        case 0x88:
          myCAM.OV5642_set_hue(degree60);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 60 degree END"));
          break;
        case 0x89:
          myCAM.OV5642_set_hue(degree90);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 90 degree END"));
          break;
        case 0x8a:
          myCAM.OV5642_set_hue(degree120);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 120 degree END"));
          break;
        case 0x8b:
          myCAM.OV5642_set_hue(degree150);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 150 degree END"));
          break;
        case 0x90:
          myCAM.OV5642_set_Special_effects(Normal);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Normal END"));
          break;
        case 0x91:
          myCAM.OV5642_set_Special_effects(BW);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to BW END"));
          break;
        case 0x92:
          myCAM.OV5642_set_Special_effects(Bluish);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Bluish END"));
          break;
        case 0x93:
          myCAM.OV5642_set_Special_effects(Sepia);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Sepia END"));
          break;
        case 0x94:
          myCAM.OV5642_set_Special_effects(Reddish);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Reddish END"));
          break;
        case 0x95:
          myCAM.OV5642_set_Special_effects(Greenish);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Greenish END"));
          break;
        case 0x96:
          myCAM.OV5642_set_Special_effects(Negative);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Negative END"));
          break;
        case 0xA0:
          myCAM.OV5642_set_Exposure_level(Exposure_17_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -1.7EV END"));
          break;
        case 0xA1:
          myCAM.OV5642_set_Exposure_level(Exposure_13_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -1.3EV END"));
          break;
        case 0xA2:
          myCAM.OV5642_set_Exposure_level(Exposure_10_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -1.0EV END"));
          break;
        case 0xA3:
          myCAM.OV5642_set_Exposure_level(Exposure_07_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -0.7EV END"));
          break;
        case 0xA4:
          myCAM.OV5642_set_Exposure_level(Exposure_03_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -0.3EV END"));
          break;
        case 0xA5:
          myCAM.OV5642_set_Exposure_level(Exposure_default);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -Exposure_default END"));
          break;
        case 0xA6:
          myCAM.OV5642_set_Exposure_level(Exposure07_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 0.7EV END"));
          break;
        case 0xA7:
          myCAM.OV5642_set_Exposure_level(Exposure10_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 1.0EV END"));
          break;
        case 0xA8:
          myCAM.OV5642_set_Exposure_level(Exposure13_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 1.3EV END"));
          break;
        case 0xA9:
          myCAM.OV5642_set_Exposure_level(Exposure17_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 1.7EV END"));
          break;
        case 0xB0:
          myCAM.OV5642_set_Sharpness(Auto_Sharpness_default);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Sharpness default END"));
          break;
        case 0xB1:
          myCAM.OV5642_set_Sharpness(Auto_Sharpness1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Sharpness +1 END"));
          break;
        case 0xB2:
          myCAM.OV5642_set_Sharpness(Auto_Sharpness2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Sharpness +2 END"));
          break;
        case 0xB3:
          myCAM.OV5642_set_Sharpness(Manual_Sharpnessoff);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness off END"));
          break;
        case 0xB4:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +1 END"));
          break;
        case 0xB5:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +2 END"));
          break;
        case 0xB6:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +3 END"));
          break;
        case 0xB7:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +4 END"));
          break;
        case 0xB8:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness5);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +5 END"));
          break;
        case 0xC0:
          myCAM.OV5642_set_Mirror_Flip(MIRROR);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to MIRROR END"));
          break;
        case 0xC1:
          myCAM.OV5642_set_Mirror_Flip(FLIP);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to FLIP END"));
          break;
        case 0xC2:
          myCAM.OV5642_set_Mirror_Flip(MIRROR_FLIP);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to MIRROR&FLIP END"));
          break;
        case 0xC3:
          myCAM.OV5642_set_Mirror_Flip(Normal);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Normal END"));
          break;
        case 0xD0:
          myCAM.OV5642_set_Compress_quality(high_quality);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to high quality END"));
          break;
        case 0xD1:
          myCAM.OV5642_set_Compress_quality(default_quality);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to default quality END"));
          break;
        case 0xD2:
          myCAM.OV5642_set_Compress_quality(low_quality);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to low quality END"));
          break;

        case 0xE0:
          myCAM.OV5642_Test_Pattern(Color_bar);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Color bar END"));
          break;
        case 0xE1:
          myCAM.OV5642_Test_Pattern(Color_square);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Color square END"));
          break;
        case 0xE2:
          myCAM.OV5642_Test_Pattern(BW_square);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to BW square END"));
          break;
        case 0xE3:
          myCAM.OV5642_Test_Pattern(DLI);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to DLI END"));
          break;
      }
      if (start_capture == 2) {
        myCAM.flush_fifo();
        myCAM.clear_fifo_flag();
        //Start capture
        myCAM.start_capture();
        start_capture = 0;
      }
      if (myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK)) {
        uint32_t length = 0;
        length = myCAM.read_fifo_length();
        if ((length >= MAX_FIFO_SIZE) | (length == 0)) {
          myCAM.clear_fifo_flag();
          start_capture = 2;
          continue;
        }
        SPI.beginTransaction(SPISettings(12000000, MSBFIRST, SPI_MODE0));
        myCAM.CS_LOW();
        myCAM.set_fifo_burst();  //Set fifo burst mode
        temp = SPI.transfer(0x00);
        length--;
        while (length--) {
          temp_last = temp;
          temp = SPI.transfer(0x00);
          if (is_header == true) {
            Serial.write(temp);
          } else if ((temp == 0xD8) & (temp_last == 0xFF)) {
            is_header = true;
            Serial.println(F("ACK IMG END"));
            Serial.write(temp_last);
            Serial.write(temp);
          }
          if ((temp == 0xD9) && (temp_last == 0xFF))  //If find the end ,break while,
            break;
          delayMicroseconds(4);
        }
        myCAM.CS_HIGH();
        myCAM.clear_fifo_flag();
        start_capture = 2;
        is_header = false;
      }
    }
  } else if (mode == 3) {
    if (start_capture == 3) {
      //Flush the FIFO
      myCAM.flush_fifo();
      myCAM.clear_fifo_flag();
      //Start capture
      myCAM.start_capture();
      start_capture = 0;
    }
    if (myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK)) {
      Serial.println(F("ACK CMD CAM Capture Done mode3. END"));
      delay(50);
      uint8_t temp, temp_last;
      uint32_t length = 0;
      length = myCAM.read_fifo_length();
      if (length >= MAX_FIFO_SIZE) {
        Serial.println(F("ACK CMD Over size. END"));
        myCAM.clear_fifo_flag();
        return;
      }
      if (length == 0)  //0 kb
      {
        Serial.println(F("ACK CMD Size is 0. END"));
        myCAM.clear_fifo_flag();
        return;
      }
      SPI.beginTransaction(SPISettings(12000000, MSBFIRST, SPI_MODE0));
      myCAM.CS_LOW();
      myCAM.set_fifo_burst();  //Set fifo burst mode

      Serial.write(0xFF);
      Serial.write(0xAA);
      for (temp = 0; temp < BMPIMAGEOFFSET; temp++) {
        Serial.write(pgm_read_byte(&bmp_header[temp]));
      }
      //SPI.transfer(0x00);
      char VH, VL;
      int i = 0, j = 0;
      for (i = 0; i < 240; i++) {
        for (j = 0; j < 320; j++) {
          VH = SPI.transfer(0x00);
          ;
          VL = SPI.transfer(0x00);
          ;
          Serial.write(VL);
          delayMicroseconds(12);
          Serial.write(VH);
          delayMicroseconds(12);
        }
      }
      Serial.write(0xBB);
      Serial.write(0xCC);
      myCAM.CS_HIGH();

      //Clear the capture done flag
      myCAM.clear_fifo_flag();
    }
  }
}
uint8_t read_fifo_burst(ArduCAM myCAM) {
  uint8_t temp = 0, temp_last = 0;
  uint32_t length = 0;
  length = myCAM.read_fifo_length();
  Serial.println(length, DEC);
  if (length >= MAX_FIFO_SIZE)  //512 kb
  {
    Serial.println(F("ACK CMD Over size. END"));
    return 0;
  }
  if (length == 0)  //0 kb
  {
    Serial.println(F("ACK CMD Size is 0. END"));
    return 0;
  }
  SPI.beginTransaction(SPISettings(12000000, MSBFIRST, SPI_MODE0));
  myCAM.CS_LOW();
  myCAM.set_fifo_burst();  //Set fifo burst mode
  temp = SPI.transfer(0x00);
  length--;
  while (length--) {
    temp_last = temp;
    temp = SPI.transfer(0x00);
    if (is_header == true) {
      Serial.write(temp);
    } else if ((temp == 0xD8) & (temp_last == 0xFF)) {
      is_header = true;
      Serial.println(F("ACK IMG END"));
      Serial.write(temp_last);
      Serial.write(temp);
    }
    if ((temp == 0xD9) && (temp_last == 0xFF))  //If find the end ,break while,
      break;
    //delayMicroseconds(15);
  }
  myCAM.CS_HIGH();

  is_header = false;
  return 1;
}
 
The previous sketch kind of pushes the limits of the camera clock so this version sticks with the original version of 8Mhz for the camera. Suggest that you start with this version before pushing the clock.
Code:
// 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 Mini camera, and can run on any Arduino platform.
// This demo was made for ArduCAM_Mini_5MP_Plus.
// It needs to be used in combination with PC software.
// It can test OV5642 functions.
//

// This program requires the ArduCAM V4.0.0 (or later) library and ArduCAM_Mini_5MP_Plus
// and use Arduino IDE 1.6.8 compiler or above
#include <Wire.h>
#include <ArduCAM.h>
#include <SPI.h>
#include "memorysaver.h"
//This demo can only work on OV5642_MINI_5MP_Plus  platform.
#if !(defined OV5642_MINI_5MP_PLUS)
#error Please select the hardware platform and camera module in the ../libraries/ArduCAM/memorysaver.h file
#endif
#define BMPIMAGEOFFSET 66
const char bmp_header[BMPIMAGEOFFSET] PROGMEM = {
  0x42, 0x4D, 0x36, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x28, 0x00,
  0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x03, 0x00,
  0x00, 0x00, 0x00, 0x58, 0x02, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x1F, 0x00,
  0x00, 0x00
};
// set pin 7 as the slave select for the digital pot:
const int CS = 10;
bool is_header = false;
int mode = 0;
uint8_t start_capture = 0;
ArduCAM myCAM(OV5642, CS, &Wire, &SPI);
uint8_t read_fifo_burst(ArduCAM myCAM);

void setup() {
  // put your setup code here, to run once:
  uint8_t vid, pid;
  uint8_t temp;

  Wire.begin();
  SPI.begin();
  //SPI.beginTransaction(SPISettings(12000000, MSBFIRST, SPI_MODE0));

  Serial.begin(921600);
  delay(5000);
  Serial.println(F("ACK CMD ArduCAM Start! END"));
  // set the CS as an output:
  pinMode(CS, OUTPUT);
  digitalWrite(CS, HIGH);

  //Reset the CPLD
  myCAM.write_reg(0x07, 0x80);
  delay(100);
  myCAM.write_reg(0x07, 0x00);
  delay(100);
  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("ACK CMD SPI interface Error! END"));
      delay(1000);
      continue;
    } else {
      Serial.println(F("ACK CMD SPI interface OK. END"));
      break;
    }
  }
  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("ACK CMD Can't find OV5642 module! END"));
      delay(1000);
      continue;
    } else {
      Serial.println(F("ACK CMD OV5642 detected. END"));
      break;
    }
  }
  //Change to JPEG capture mode and initialize the OV5642 module
  myCAM.set_format(JPEG);
  myCAM.InitCAM();

  myCAM.write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);  //VSYNC is active HIGH
  myCAM.OV5642_set_JPEG_size(OV5642_320x240);
  delay(1000);
  myCAM.clear_fifo_flag();
  myCAM.write_reg(ARDUCHIP_FRAMES, 0x00);

}

void loop() {
  // put your main code here, to run repeatedly:
  uint8_t temp = 0xff, temp_last = 0;
  bool is_header = false;
  if (Serial.available()) {
    temp = Serial.read();
    switch (temp) {
      case 0:
        myCAM.OV5642_set_JPEG_size(OV5642_320x240);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_320x240 END"));
        temp = 0xff;
        break;
      case 1:
        myCAM.OV5642_set_JPEG_size(OV5642_640x480);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_640x480 END"));
        temp = 0xff;
        break;
      case 2:
        myCAM.OV5642_set_JPEG_size(OV5642_1024x768);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_1024x768 END"));
        temp = 0xff;
        break;
      case 3:
        temp = 0xff;
        myCAM.OV5642_set_JPEG_size(OV5642_1280x960);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_1280x960 END"));
        break;
      case 4:
        temp = 0xff;
        myCAM.OV5642_set_JPEG_size(OV5642_1600x1200);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_1600x1200 END"));
        break;
      case 5:
        temp = 0xff;
        myCAM.OV5642_set_JPEG_size(OV5642_2048x1536);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_2048x1536 END"));
        break;
      case 6:
        temp = 0xff;
        myCAM.OV5642_set_JPEG_size(OV5642_2592x1944);
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_2592x1944 END"));
        break;
      case 0x10:
        mode = 1;
        temp = 0xff;
        start_capture = 1;
        Serial.println(F("ACK CMD CAM start single shoot. END"));
        break;
      case 0x11:
        temp = 0xff;
        myCAM.set_format(JPEG);
        myCAM.InitCAM();
#if !(defined(OV2640_MINI_2MP))
        myCAM.set_bit(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);
#endif
        break;
      case 0x20:
        mode = 2;
        temp = 0xff;
        start_capture = 2;
        Serial.println(F("ACK CMD CAM start video streaming. END"));
        break;
      case 0x30:
        mode = 3;
        temp = 0xff;
        start_capture = 3;
        Serial.println(F("ACK CMD CAM start single shoot. END"));
        break;
      case 0x31:
        temp = 0xff;
        myCAM.set_format(BMP);
        myCAM.InitCAM();
        myCAM.clear_bit(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);
        myCAM.wrSensorReg16_8(0x3818, 0x81);
        myCAM.wrSensorReg16_8(0x3621, 0xA7);
        break;
      case 0x40:
        myCAM.OV5642_set_Light_Mode(Advanced_AWB);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Advanced_AWB END"));
        break;
      case 0x41:
        myCAM.OV5642_set_Light_Mode(Simple_AWB);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Simple_AWB END"));
        break;
      case 0x42:
        myCAM.OV5642_set_Light_Mode(Manual_day);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Manual_day END"));
        break;
      case 0x43:
        myCAM.OV5642_set_Light_Mode(Manual_A);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Manual_A END"));
        break;
      case 0x44:
        myCAM.OV5642_set_Light_Mode(Manual_cwf);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Manual_cwf END"));
        break;
      case 0x45:
        myCAM.OV5642_set_Light_Mode(Manual_cloudy);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Manual_cloudy END"));
        break;
      case 0x50:
        myCAM.OV5642_set_Color_Saturation(Saturation4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+4 END"));
        break;
      case 0x51:
        myCAM.OV5642_set_Color_Saturation(Saturation3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+3 END"));
        break;
      case 0x52:
        myCAM.OV5642_set_Color_Saturation(Saturation2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+2 END"));
        break;
      case 0x53:
        myCAM.OV5642_set_Color_Saturation(Saturation1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+1 END"));
        break;
      case 0x54:
        myCAM.OV5642_set_Color_Saturation(Saturation0);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+0 END"));
        break;
      case 0x55:
        myCAM.OV5642_set_Color_Saturation(Saturation_1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation-1 END"));
        break;
      case 0x56:
        myCAM.OV5642_set_Color_Saturation(Saturation_2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation-2"));
        break;
      case 0x57:
        myCAM.OV5642_set_Color_Saturation(Saturation_3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation-3 END"));
        break;
      case 0x58:
        myCAM.OV5642_set_Light_Mode(Saturation_4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation-4 END"));
        break;
      case 0x60:
        myCAM.OV5642_set_Brightness(Brightness4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+4 END"));
        break;
      case 0x61:
        myCAM.OV5642_set_Brightness(Brightness3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+3 END"));
        break;
      case 0x62:
        myCAM.OV5642_set_Brightness(Brightness2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+2 END"));
        break;
      case 0x63:
        myCAM.OV5642_set_Brightness(Brightness1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+1 END"));
        break;
      case 0x64:
        myCAM.OV5642_set_Brightness(Brightness0);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+0 END"));
        break;
      case 0x65:
        myCAM.OV5642_set_Brightness(Brightness_1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness-1 END"));
        break;
      case 0x66:
        myCAM.OV5642_set_Brightness(Brightness_2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness-2 END"));
        break;
      case 0x67:
        myCAM.OV5642_set_Brightness(Brightness_3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness-3 END"));
        break;
      case 0x68:
        myCAM.OV5642_set_Brightness(Brightness_4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness-4 END"));
        break;
      case 0x70:
        myCAM.OV5642_set_Contrast(Contrast4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+4 END"));
        break;
      case 0x71:
        myCAM.OV5642_set_Contrast(Contrast3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+3 END"));
        break;
      case 0x72:
        myCAM.OV5642_set_Contrast(Contrast2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+2 END"));
        break;
      case 0x73:
        myCAM.OV5642_set_Contrast(Contrast1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+1 END"));
        break;
      case 0x74:
        myCAM.OV5642_set_Contrast(Contrast0);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+0 END"));
        break;
      case 0x75:
        myCAM.OV5642_set_Contrast(Contrast_1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast-1 END"));
        break;
      case 0x76:
        myCAM.OV5642_set_Contrast(Contrast_2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast-2 END"));
        break;
      case 0x77:
        myCAM.OV5642_set_Contrast(Contrast_3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast-3 END"));
        break;
      case 0x78:
        myCAM.OV5642_set_Contrast(Contrast_4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast-4 END"));
        break;
      case 0x80:
        myCAM.OV5642_set_hue(degree_180);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -180 degree END"));
        break;
      case 0x81:
        myCAM.OV5642_set_hue(degree_150);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -150 degree END"));
        break;
      case 0x82:
        myCAM.OV5642_set_hue(degree_120);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -120 degree END"));
        break;
      case 0x83:
        myCAM.OV5642_set_hue(degree_90);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -90 degree END"));
        break;
      case 0x84:
        myCAM.OV5642_set_hue(degree_60);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -60 degree END"));
        break;
      case 0x85:
        myCAM.OV5642_set_hue(degree_30);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -30 degree END"));
        break;
      case 0x86:
        myCAM.OV5642_set_hue(degree_0);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 0 degree END"));
        break;
      case 0x87:
        myCAM.OV5642_set_hue(degree30);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 30 degree END"));
        break;
      case 0x88:
        myCAM.OV5642_set_hue(degree60);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 60 degree END"));
        break;
      case 0x89:
        myCAM.OV5642_set_hue(degree90);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 90 degree END"));
        break;
      case 0x8a:
        myCAM.OV5642_set_hue(degree120);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 120 degree END"));
        break;
      case 0x8b:
        myCAM.OV5642_set_hue(degree150);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 150 degree END"));
        break;
      case 0x90:
        myCAM.OV5642_set_Special_effects(Normal);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Normal END"));
        break;
      case 0x91:
        myCAM.OV5642_set_Special_effects(BW);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to BW END"));
        break;
      case 0x92:
        myCAM.OV5642_set_Special_effects(Bluish);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Bluish END"));
        break;
      case 0x93:
        myCAM.OV5642_set_Special_effects(Sepia);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Sepia END"));
        break;
      case 0x94:
        myCAM.OV5642_set_Special_effects(Reddish);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Reddish END"));
        break;
      case 0x95:
        myCAM.OV5642_set_Special_effects(Greenish);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Greenish END"));
        break;
      case 0x96:
        myCAM.OV5642_set_Special_effects(Negative);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Negative END"));
        break;
      case 0xA0:
        myCAM.OV5642_set_Exposure_level(Exposure_17_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -1.7EV"));
        break;
      case 0xA1:
        myCAM.OV5642_set_Exposure_level(Exposure_13_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -1.3EV END"));
        break;
      case 0xA2:
        myCAM.OV5642_set_Exposure_level(Exposure_10_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -1.0EV END"));
        break;
      case 0xA3:
        myCAM.OV5642_set_Exposure_level(Exposure_07_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -0.7EV END"));
        break;
      case 0xA4:
        myCAM.OV5642_set_Exposure_level(Exposure_03_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -0.3EV END"));
        break;
      case 0xA5:
        myCAM.OV5642_set_Exposure_level(Exposure_default);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -Exposure_default END"));
        break;
      case 0xA6:
        myCAM.OV5642_set_Exposure_level(Exposure07_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 0.7EV END"));
        break;
      case 0xA7:
        myCAM.OV5642_set_Exposure_level(Exposure10_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 1.0EV END"));
        break;
      case 0xA8:
        myCAM.OV5642_set_Exposure_level(Exposure13_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 1.3EV END"));
        break;
      case 0xA9:
        myCAM.OV5642_set_Exposure_level(Exposure17_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 1.7EV END"));
        break;
      case 0xB0:
        myCAM.OV5642_set_Sharpness(Auto_Sharpness_default);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Sharpness default END"));
        break;
      case 0xB1:
        myCAM.OV5642_set_Sharpness(Auto_Sharpness1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Sharpness +1 END"));
        break;
      case 0xB2:
        myCAM.OV5642_set_Sharpness(Auto_Sharpness2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Sharpness +2 END"));
        break;
      case 0xB3:
        myCAM.OV5642_set_Sharpness(Manual_Sharpnessoff);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness off END"));
        break;
      case 0xB4:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +1 END"));
        break;
      case 0xB5:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +2 END"));
        break;
      case 0xB6:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +3 END"));
        break;
      case 0xB7:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +4 END"));
        break;
      case 0xB8:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness5);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +5 END"));
        break;
      case 0xC0:
        myCAM.OV5642_set_Mirror_Flip(MIRROR);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to MIRROR END"));
        break;
      case 0xC1:
        myCAM.OV5642_set_Mirror_Flip(FLIP);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to FLIP END"));
        break;
      case 0xC2:
        myCAM.OV5642_set_Mirror_Flip(MIRROR_FLIP);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to MIRROR&FLIP END"));
        break;
      case 0xC3:
        myCAM.OV5642_set_Mirror_Flip(Normal);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Normal END"));
        break;
      case 0xD0:
        myCAM.OV5642_set_Compress_quality(high_quality);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to high quality END"));
        break;
      case 0xD1:
        myCAM.OV5642_set_Compress_quality(default_quality);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to default quality END"));
        break;
      case 0xD2:
        myCAM.OV5642_set_Compress_quality(low_quality);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to low quality END"));
        break;

      case 0xE0:
        myCAM.OV5642_Test_Pattern(Color_bar);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Color bar END"));
        break;
      case 0xE1:
        myCAM.OV5642_Test_Pattern(Color_square);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Color square END"));
        break;
      case 0xE2:
        myCAM.OV5642_Test_Pattern(BW_square);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to BW square END"));
        break;
      case 0xE3:
        myCAM.OV5642_Test_Pattern(DLI);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to DLI END"));
        break;
      default:
        break;
    }
  }
  if (mode == 1) {
    if (start_capture == 1) {
      myCAM.flush_fifo();
      myCAM.clear_fifo_flag();
      //Start capture
      myCAM.start_capture();
      start_capture = 0;
    }
    if (myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK)) {
      Serial.println(F("ACK CMD CAM Capture Done Mode1. END"));
      delay(50);
      read_fifo_burst(myCAM);
      //Clear the capture done flag
      myCAM.clear_fifo_flag();
    }

  } else if (mode == 2) {
    while (1) {
      temp = Serial.read();
      if (temp == 0x21) {
        start_capture = 0;
        mode = 0;
        Serial.println(F("ACK CMD CAM stop video streaming Mode2. END"));
        break;
      }
      switch (temp) {
        case 0x40:
          myCAM.OV5642_set_Light_Mode(Advanced_AWB);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Advanced_AWB END"));
          break;
        case 0x41:
          myCAM.OV5642_set_Light_Mode(Simple_AWB);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Simple_AWB END"));
          break;
        case 0x42:
          myCAM.OV5642_set_Light_Mode(Manual_day);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Manual_day END"));
          break;
        case 0x43:
          myCAM.OV5642_set_Light_Mode(Manual_A);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Manual_A END"));
          break;
        case 0x44:
          myCAM.OV5642_set_Light_Mode(Manual_cwf);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Manual_cwf END"));
          break;
        case 0x45:
          myCAM.OV5642_set_Light_Mode(Manual_cloudy);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Manual_cloudy END"));
          break;
        case 0x50:
          myCAM.OV5642_set_Color_Saturation(Saturation4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+4 END"));
          break;
        case 0x51:
          myCAM.OV5642_set_Color_Saturation(Saturation3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+3 END"));
          break;
        case 0x52:
          myCAM.OV5642_set_Color_Saturation(Saturation2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+2 END"));
          break;
        case 0x53:
          myCAM.OV5642_set_Color_Saturation(Saturation1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+1 END"));
          break;
        case 0x54:
          myCAM.OV5642_set_Color_Saturation(Saturation0);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+0 END"));
          break;
        case 0x55:
          myCAM.OV5642_set_Color_Saturation(Saturation_1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation-1 END"));
          break;
        case 0x56:
          myCAM.OV5642_set_Color_Saturation(Saturation_2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation-2 END"));
          break;
        case 0x57:
          myCAM.OV5642_set_Color_Saturation(Saturation_3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation-3 END"));
          break;
        case 0x58:
          myCAM.OV5642_set_Light_Mode(Saturation_4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation-4 END"));
          break;
        case 0x60:
          myCAM.OV5642_set_Brightness(Brightness4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+4 END"));
          break;
        case 0x61:
          myCAM.OV5642_set_Brightness(Brightness3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+3 END"));
          break;
        case 0x62:
          myCAM.OV5642_set_Brightness(Brightness2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+2 END"));
          break;
        case 0x63:
          myCAM.OV5642_set_Brightness(Brightness1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+1 END"));
          break;
        case 0x64:
          myCAM.OV5642_set_Brightness(Brightness0);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+0 END"));
          break;
        case 0x65:
          myCAM.OV5642_set_Brightness(Brightness_1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness-1 END"));
          break;
        case 0x66:
          myCAM.OV5642_set_Brightness(Brightness_2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness-2 END"));
          break;
        case 0x67:
          myCAM.OV5642_set_Brightness(Brightness_3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness-3 END"));
          break;
        case 0x68:
          myCAM.OV5642_set_Brightness(Brightness_4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness-4 END"));
          break;
        case 0x70:
          myCAM.OV5642_set_Contrast(Contrast4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+4 END"));
          break;
        case 0x71:
          myCAM.OV5642_set_Contrast(Contrast3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+3 END"));
          break;
        case 0x72:
          myCAM.OV5642_set_Contrast(Contrast2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+2 END"));
          break;
        case 0x73:
          myCAM.OV5642_set_Contrast(Contrast1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+1 END"));
          break;
        case 0x74:
          myCAM.OV5642_set_Contrast(Contrast0);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+0 END"));
          break;
        case 0x75:
          myCAM.OV5642_set_Contrast(Contrast_1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast-1 END"));
          break;
        case 0x76:
          myCAM.OV5642_set_Contrast(Contrast_2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast-2 END"));
          break;
        case 0x77:
          myCAM.OV5642_set_Contrast(Contrast_3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast-3 END"));
          break;
        case 0x78:
          myCAM.OV5642_set_Contrast(Contrast_4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast-4 END"));
          break;
        case 0x80:
          myCAM.OV5642_set_hue(degree_180);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -180 degree END"));
          break;
        case 0x81:
          myCAM.OV5642_set_hue(degree_150);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -150 degree END"));
          break;
        case 0x82:
          myCAM.OV5642_set_hue(degree_120);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -120 degree END"));
          break;
        case 0x83:
          myCAM.OV5642_set_hue(degree_90);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -90 degree END"));
          break;
        case 0x84:
          myCAM.OV5642_set_hue(degree_60);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -60 degree END"));
          break;
        case 0x85:
          myCAM.OV5642_set_hue(degree_30);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -30 degree END"));
          break;
        case 0x86:
          myCAM.OV5642_set_hue(degree_0);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 0 degree END"));
          break;
        case 0x87:
          myCAM.OV5642_set_hue(degree30);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 30 degree END"));
          break;
        case 0x88:
          myCAM.OV5642_set_hue(degree60);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 60 degree END"));
          break;
        case 0x89:
          myCAM.OV5642_set_hue(degree90);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 90 degree END"));
          break;
        case 0x8a:
          myCAM.OV5642_set_hue(degree120);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 120 degree END"));
          break;
        case 0x8b:
          myCAM.OV5642_set_hue(degree150);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 150 degree END"));
          break;
        case 0x90:
          myCAM.OV5642_set_Special_effects(Normal);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Normal END"));
          break;
        case 0x91:
          myCAM.OV5642_set_Special_effects(BW);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to BW END"));
          break;
        case 0x92:
          myCAM.OV5642_set_Special_effects(Bluish);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Bluish END"));
          break;
        case 0x93:
          myCAM.OV5642_set_Special_effects(Sepia);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Sepia END"));
          break;
        case 0x94:
          myCAM.OV5642_set_Special_effects(Reddish);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Reddish END"));
          break;
        case 0x95:
          myCAM.OV5642_set_Special_effects(Greenish);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Greenish END"));
          break;
        case 0x96:
          myCAM.OV5642_set_Special_effects(Negative);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Negative END"));
          break;
        case 0xA0:
          myCAM.OV5642_set_Exposure_level(Exposure_17_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -1.7EV END"));
          break;
        case 0xA1:
          myCAM.OV5642_set_Exposure_level(Exposure_13_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -1.3EV END"));
          break;
        case 0xA2:
          myCAM.OV5642_set_Exposure_level(Exposure_10_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -1.0EV END"));
          break;
        case 0xA3:
          myCAM.OV5642_set_Exposure_level(Exposure_07_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -0.7EV END"));
          break;
        case 0xA4:
          myCAM.OV5642_set_Exposure_level(Exposure_03_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -0.3EV END"));
          break;
        case 0xA5:
          myCAM.OV5642_set_Exposure_level(Exposure_default);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -Exposure_default END"));
          break;
        case 0xA6:
          myCAM.OV5642_set_Exposure_level(Exposure07_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 0.7EV END"));
          break;
        case 0xA7:
          myCAM.OV5642_set_Exposure_level(Exposure10_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 1.0EV END"));
          break;
        case 0xA8:
          myCAM.OV5642_set_Exposure_level(Exposure13_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 1.3EV END"));
          break;
        case 0xA9:
          myCAM.OV5642_set_Exposure_level(Exposure17_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 1.7EV END"));
          break;
        case 0xB0:
          myCAM.OV5642_set_Sharpness(Auto_Sharpness_default);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Sharpness default END"));
          break;
        case 0xB1:
          myCAM.OV5642_set_Sharpness(Auto_Sharpness1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Sharpness +1 END"));
          break;
        case 0xB2:
          myCAM.OV5642_set_Sharpness(Auto_Sharpness2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Sharpness +2 END"));
          break;
        case 0xB3:
          myCAM.OV5642_set_Sharpness(Manual_Sharpnessoff);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness off END"));
          break;
        case 0xB4:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +1 END"));
          break;
        case 0xB5:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +2 END"));
          break;
        case 0xB6:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +3 END"));
          break;
        case 0xB7:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +4 END"));
          break;
        case 0xB8:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness5);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +5 END"));
          break;
        case 0xC0:
          myCAM.OV5642_set_Mirror_Flip(MIRROR);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to MIRROR END"));
          break;
        case 0xC1:
          myCAM.OV5642_set_Mirror_Flip(FLIP);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to FLIP END"));
          break;
        case 0xC2:
          myCAM.OV5642_set_Mirror_Flip(MIRROR_FLIP);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to MIRROR&FLIP END"));
          break;
        case 0xC3:
          myCAM.OV5642_set_Mirror_Flip(Normal);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Normal END"));
          break;
        case 0xD0:
          myCAM.OV5642_set_Compress_quality(high_quality);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to high quality END"));
          break;
        case 0xD1:
          myCAM.OV5642_set_Compress_quality(default_quality);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to default quality END"));
          break;
        case 0xD2:
          myCAM.OV5642_set_Compress_quality(low_quality);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to low quality END"));
          break;

        case 0xE0:
          myCAM.OV5642_Test_Pattern(Color_bar);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Color bar END"));
          break;
        case 0xE1:
          myCAM.OV5642_Test_Pattern(Color_square);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Color square END"));
          break;
        case 0xE2:
          myCAM.OV5642_Test_Pattern(BW_square);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to BW square END"));
          break;
        case 0xE3:
          myCAM.OV5642_Test_Pattern(DLI);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to DLI END"));
          break;
      }
      if (start_capture == 2) {
        myCAM.flush_fifo();
        myCAM.clear_fifo_flag();
        //Start capture
        myCAM.start_capture();
        start_capture = 0;
      }
      if (myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK)) {
        uint32_t length = 0;
        length = myCAM.read_fifo_length();
        if ((length >= MAX_FIFO_SIZE) | (length == 0)) {
          myCAM.clear_fifo_flag();
          start_capture = 2;
          continue;
        }
        //SPI.beginTransaction(SPISettings(12000000, MSBFIRST, SPI_MODE0));
        myCAM.CS_LOW();
        myCAM.set_fifo_burst();  //Set fifo burst mode
        temp = SPI.transfer(0x00);
        length--;
        while (length--) {
          temp_last = temp;
          temp = SPI.transfer(0x00);
          if (is_header == true) {
            Serial.write(temp);
          } else if ((temp == 0xD8) & (temp_last == 0xFF)) {
            is_header = true;
            Serial.println(F("ACK IMG END"));
            Serial.write(temp_last);
            Serial.write(temp);
          }
          if ((temp == 0xD9) && (temp_last == 0xFF))  //If find the end ,break while,
            break;
          delayMicroseconds(4);
        }
        myCAM.CS_HIGH();
        myCAM.clear_fifo_flag();
        start_capture = 2;
        is_header = false;
      }
    }
  } else if (mode == 3) {
    if (start_capture == 3) {
      //Flush the FIFO
      myCAM.flush_fifo();
      myCAM.clear_fifo_flag();
      //Start capture
      myCAM.start_capture();
      start_capture = 0;
    }
    if (myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK)) {
      Serial.println(F("ACK CMD CAM Capture Done mode3. END"));
      delay(50);
      uint8_t temp, temp_last;
      uint32_t length = 0;
      length = myCAM.read_fifo_length();
      if (length >= MAX_FIFO_SIZE) {
        Serial.println(F("ACK CMD Over size. END"));
        myCAM.clear_fifo_flag();
        return;
      }
      if (length == 0)  //0 kb
      {
        Serial.println(F("ACK CMD Size is 0. END"));
        myCAM.clear_fifo_flag();
        return;
      }
      //SPI.beginTransaction(SPISettings(12000000, MSBFIRST, SPI_MODE0));
      myCAM.CS_LOW();
      myCAM.set_fifo_burst();  //Set fifo burst mode

      Serial.write(0xFF);
      Serial.write(0xAA);
      for (temp = 0; temp < BMPIMAGEOFFSET; temp++) {
        Serial.write(pgm_read_byte(&bmp_header[temp]));
      }
      //SPI.transfer(0x00);
      char VH, VL;
      int i = 0, j = 0;
      for (i = 0; i < 240; i++) {
        for (j = 0; j < 320; j++) {
          VH = SPI.transfer(0x00);
          ;
          VL = SPI.transfer(0x00);
          ;
          Serial.write(VL);
          delayMicroseconds(12);
          Serial.write(VH);
          delayMicroseconds(12);
        }
      }
      Serial.write(0xBB);
      Serial.write(0xCC);
      myCAM.CS_HIGH();

      //Clear the capture done flag
      myCAM.clear_fifo_flag();
    }
  }
}
uint8_t read_fifo_burst(ArduCAM myCAM) {
  uint8_t temp = 0, temp_last = 0;
  uint32_t length = 0;
  length = myCAM.read_fifo_length();
  Serial.println(length, DEC);
  if (length >= MAX_FIFO_SIZE)  //512 kb
  {
    Serial.println(F("ACK CMD Over size. END"));
    return 0;
  }
  if (length == 0)  //0 kb
  {
    Serial.println(F("ACK CMD Size is 0. END"));
    return 0;
  }
  //SPI.beginTransaction(SPISettings(12000000, MSBFIRST, SPI_MODE0));
  myCAM.CS_LOW();
  myCAM.set_fifo_burst();  //Set fifo burst mode
  temp = SPI.transfer(0x00);
  length--;
  while (length--) {
    temp_last = temp;
    temp = SPI.transfer(0x00);
    if (is_header == true) {
      Serial.write(temp);
    } else if ((temp == 0xD8) & (temp_last == 0xFF)) {
      is_header = true;
      Serial.println(F("ACK IMG END"));
      Serial.write(temp_last);
      Serial.write(temp);
    }
    if ((temp == 0xD9) && (temp_last == 0xFF))  //If find the end ,break while,
      break;
    //delayMicroseconds(15);
  }
  myCAM.CS_HIGH();

  is_header = false;
  return 1;
}
 
So now I have had interesting things happen. I used this most recent code, and I decided to use an oscilloscope to compare what happens on the Arduino to what happens on the Teensy. I also changed the lens to the 120 degree lens from this kit: https://www.arducam.com/product/m12-mount-camera-lens-kit-arduino-raspberry-pi/ . First I ran the default ArduCam library with the Arduino UNO R3, and I was able to get images, as expected. I took note of what the oscilloscope graph looked like when I connected the oscilloscope probe to various different pins of SPI and I2C. Then I ran mjs513's library on the Teensy 4.1, and connected the oscilloscope probe to various different pins of SPI and I2C. I also changed the "Pix" drop-down to 5642. No image window would show up unless I picked SetToBMP. For the first few tries, the image was all-black again, and the images would continuously come in, even though the drop-down is set to "Single". Then, I closed the port on the debug window and then in the following order: 1)reset the Teensy, 2)opened the port in the debug window, 3) placed an oscilloscope-connected jumper wire into the breadboard row of MISO (pin 12 on Teensy), and 4) pressed capture, I got images. It also acted as single mode, as would be expected from the drop-down being set to "Single."

working up Screenshot 2023-08-18 113219.jpg working hand Screenshot 2023-08-18 113240.jpg working me Screenshot 2023-08-18 113137.jpg

However, then I moved the breadboard jumper wire to the MOSI pin (pin 11), and it reverted to showing only black.

not working usual Screenshot 2023-08-18 113303.jpg

After this, I tried doing what I did before when I got the image, and still got all-black. I then tried a different breadboard, thinking it was a grounding/wiring problem but whenever I did that, I either got all-black or got this image, a very corrupted image looking up from my table. Whenever I press capture, even if I put my hand in front of the camera, the only thing that changes is the static bar at the bottom. This time, it does treat "Single" as single mode, and only sends an image when I press "Capture".
not working static Screenshot 2023-08-18 122822.jpg

So I can say my setup finally works, but extremely inconsistently.

EDIT: Keep in mind for all this time I was powering the camera by an external power supply to see how much current it draws.
 
Last edited:
I will also say that looking at the MISO signal on the Teensy on the oscilloscope, at the first tries did not look like that on the Arduino then when I got the images, and afterwards (even with the all-black and corrupted images) the oscilloscope looked like that of MISO on the Arduino.
 
I will also say that looking at the MISO signal on the Teensy on the oscilloscope, at the first tries did not look like that on the Arduino then when I got the images, and afterwards (even with the all-black and corrupted images) the oscilloscope looked like that of MISO on the Arduino.

Sorry havent got back to you sooner. Been a busy few days for me but I have been looking at Logic Analzer traces from the arduino R3, T3.2 and the T4. When the T4 fails to complete the image transfer its in the middle of the image transfer. It is getting the begin and end image command. Can see it on the LA.

Got it working but not perfect by making a change to sketch and adding a 4.7k pull-up resistor to the CS line.

Now when you start the capture if it fails what I have been doing is changing to lower resolution first and capture a bmp then switch to capture a jpeg and capture a image at higher resolution, but first I try a couple of times at lower resolution and once it seems like the camera is synched up then it works. Issue could be with the camera config as well.

NOTE it does work fine with the ov2640. Here is the updated sketch
Code:
// 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 Mini camera, and can run on any Arduino platform.
// This demo was made for ArduCAM_Mini_5MP_Plus.
// It needs to be used in combination with PC software.
// It can test OV5642 functions.
//

// This program requires the ArduCAM V4.0.0 (or later) library and ArduCAM_Mini_5MP_Plus
// and use Arduino IDE 1.6.8 compiler or above
#include <Wire.h>
#include <ArduCAM.h>
#include <SPI.h>
#include "memorysaver.h"
//This demo can only work on OV5642_MINI_5MP_Plus  platform.
#if !(defined OV5642_MINI_5MP_PLUS)
#error Please select the hardware platform and camera module in the ../libraries/ArduCAM/memorysaver.h file
#endif
#define BMPIMAGEOFFSET 66
const char bmp_header[BMPIMAGEOFFSET] PROGMEM = {
  0x42, 0x4D, 0x36, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x28, 0x00,
  0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x03, 0x00,
  0x00, 0x00, 0x00, 0x58, 0x02, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x1F, 0x00,
  0x00, 0x00
};
// set pin 7 as the slave select for the digital pot:
const int CS = 7;
bool is_header = false;
int mode = 0;
uint8_t start_capture = 0;
ArduCAM myCAM(OV5642, CS, &Wire, &SPI);
uint8_t read_fifo_burst(ArduCAM myCAM);

uint16_t image_delay = 500;  //delay in milliseconds

void setup() {
  // put your setup code here, to run once:
  uint8_t vid, pid;
  uint8_t temp;

  Wire.begin();
  SPI.begin();
  SPI.beginTransaction(SPISettings(6000000, MSBFIRST, SPI_MODE0));
  Serial.begin(921600);
  delay(5000);
  Serial.println(F("ACK CMD ArduCAM Start! END"));
  // set the CS as an output:
  pinMode(CS, OUTPUT);
  digitalWrite(CS, HIGH);

  //Reset the CPLD
  myCAM.write_reg(0x07, 0x80);
  delay(100);
  myCAM.write_reg(0x07, 0x00);
  delay(100);
  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("ACK CMD SPI interface Error! END"));
      delay(1000);
      continue;
    } else {
      Serial.println(F("ACK CMD SPI interface OK. END"));
      break;
    }
  }
  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("ACK CMD Can't find OV5642 module! END"));
      delay(1000);
      continue;
    } else {
      Serial.println(F("ACK CMD OV5642 detected. END"));
      break;
    }
  }
  //Change to JPEG capture mode and initialize the OV5642 module
  myCAM.set_format(JPEG);
  myCAM.InitCAM();

  myCAM.write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);  //VSYNC is active HIGH
  myCAM.OV5642_set_JPEG_size(OV5642_320x240);
  delay(1000);
  myCAM.clear_fifo_flag();
  myCAM.write_reg(ARDUCHIP_FRAMES, 0x00);

}

void loop() {
  // put your main code here, to run repeatedly:
  uint8_t temp = 0xff, temp_last = 0;
  bool is_header = false;
  if (Serial.available()) {
    temp = Serial.read();
    switch (temp) {
      case 0:
        myCAM.OV5642_set_JPEG_size(OV5642_320x240);
        image_delay = 500;
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_320x240 END"));
        temp = 0xff;
        break;
      case 1:
        myCAM.OV5642_set_JPEG_size(OV5642_640x480);
        image_delay = 500;
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_640x480 END"));
        temp = 0xff;
        break;
      case 2:
        myCAM.OV5642_set_JPEG_size(OV5642_1024x768);
        image_delay = 2000;
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_1024x768 END"));
        temp = 0xff;
        break;
      case 3:
        temp = 0xff;
        myCAM.OV5642_set_JPEG_size(OV5642_1280x960);
        image_delay = 2000;
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_1280x960 END"));
        break;
      case 4:
        temp = 0xff;
        myCAM.OV5642_set_JPEG_size(OV5642_1600x1200);
        image_delay = 2000;
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_1600x1200 END"));
        break;
      case 5:
        temp = 0xff;
        myCAM.OV5642_set_JPEG_size(OV5642_2048x1536);
        image_delay = 2000;
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_2048x1536 END"));
        break;
      case 6:
        temp = 0xff;
        myCAM.OV5642_set_JPEG_size(OV5642_2592x1944);
        image_delay = 2000;
        delay(1000);
        Serial.println(F("ACK CMD switch to OV5642_2592x1944 END"));
        break;
      case 0x10:
        mode = 1;
        temp = 0xff;
        start_capture = 1;
        Serial.println(F("ACK CMD CAM start single shoot. END"));
        break;
      case 0x11:
        temp = 0xff;
        myCAM.set_format(JPEG);
        myCAM.InitCAM();
#if !(defined(OV2640_MINI_2MP))
        myCAM.set_bit(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);
#endif
        break;
      case 0x20:
        mode = 2;
        temp = 0xff;
        start_capture = 2;
        Serial.println(F("ACK CMD CAM start video streaming. END"));
        break;
      case 0x30:
        mode = 3;
        temp = 0xff;
        start_capture = 3;
        Serial.println(F("ACK CMD CAM start single shoot. END"));
        break;
      case 0x31:
        temp = 0xff;
        myCAM.set_format(BMP);
        myCAM.InitCAM();
        myCAM.clear_bit(ARDUCHIP_TIM, VSYNC_LEVEL_MASK);
        myCAM.wrSensorReg16_8(0x3818, 0x81);
        myCAM.wrSensorReg16_8(0x3621, 0xA7);
        break;
      case 0x40:
        myCAM.OV5642_set_Light_Mode(Advanced_AWB);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Advanced_AWB END"));
        break;
      case 0x41:
        myCAM.OV5642_set_Light_Mode(Simple_AWB);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Simple_AWB END"));
        break;
      case 0x42:
        myCAM.OV5642_set_Light_Mode(Manual_day);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Manual_day END"));
        break;
      case 0x43:
        myCAM.OV5642_set_Light_Mode(Manual_A);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Manual_A END"));
        break;
      case 0x44:
        myCAM.OV5642_set_Light_Mode(Manual_cwf);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Manual_cwf END"));
        break;
      case 0x45:
        myCAM.OV5642_set_Light_Mode(Manual_cloudy);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Manual_cloudy END"));
        break;
      case 0x50:
        myCAM.OV5642_set_Color_Saturation(Saturation4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+4 END"));
        break;
      case 0x51:
        myCAM.OV5642_set_Color_Saturation(Saturation3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+3 END"));
        break;
      case 0x52:
        myCAM.OV5642_set_Color_Saturation(Saturation2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+2 END"));
        break;
      case 0x53:
        myCAM.OV5642_set_Color_Saturation(Saturation1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+1 END"));
        break;
      case 0x54:
        myCAM.OV5642_set_Color_Saturation(Saturation0);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation+0 END"));
        break;
      case 0x55:
        myCAM.OV5642_set_Color_Saturation(Saturation_1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation-1 END"));
        break;
      case 0x56:
        myCAM.OV5642_set_Color_Saturation(Saturation_2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation-2"));
        break;
      case 0x57:
        myCAM.OV5642_set_Color_Saturation(Saturation_3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation-3 END"));
        break;
      case 0x58:
        myCAM.OV5642_set_Light_Mode(Saturation_4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Saturation-4 END"));
        break;
      case 0x60:
        myCAM.OV5642_set_Brightness(Brightness4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+4 END"));
        break;
      case 0x61:
        myCAM.OV5642_set_Brightness(Brightness3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+3 END"));
        break;
      case 0x62:
        myCAM.OV5642_set_Brightness(Brightness2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+2 END"));
        break;
      case 0x63:
        myCAM.OV5642_set_Brightness(Brightness1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+1 END"));
        break;
      case 0x64:
        myCAM.OV5642_set_Brightness(Brightness0);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness+0 END"));
        break;
      case 0x65:
        myCAM.OV5642_set_Brightness(Brightness_1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness-1 END"));
        break;
      case 0x66:
        myCAM.OV5642_set_Brightness(Brightness_2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness-2 END"));
        break;
      case 0x67:
        myCAM.OV5642_set_Brightness(Brightness_3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness-3 END"));
        break;
      case 0x68:
        myCAM.OV5642_set_Brightness(Brightness_4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Brightness-4 END"));
        break;
      case 0x70:
        myCAM.OV5642_set_Contrast(Contrast4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+4 END"));
        break;
      case 0x71:
        myCAM.OV5642_set_Contrast(Contrast3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+3 END"));
        break;
      case 0x72:
        myCAM.OV5642_set_Contrast(Contrast2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+2 END"));
        break;
      case 0x73:
        myCAM.OV5642_set_Contrast(Contrast1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+1 END"));
        break;
      case 0x74:
        myCAM.OV5642_set_Contrast(Contrast0);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast+0 END"));
        break;
      case 0x75:
        myCAM.OV5642_set_Contrast(Contrast_1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast-1 END"));
        break;
      case 0x76:
        myCAM.OV5642_set_Contrast(Contrast_2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast-2 END"));
        break;
      case 0x77:
        myCAM.OV5642_set_Contrast(Contrast_3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast-3 END"));
        break;
      case 0x78:
        myCAM.OV5642_set_Contrast(Contrast_4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Contrast-4 END"));
        break;
      case 0x80:
        myCAM.OV5642_set_hue(degree_180);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -180 degree END"));
        break;
      case 0x81:
        myCAM.OV5642_set_hue(degree_150);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -150 degree END"));
        break;
      case 0x82:
        myCAM.OV5642_set_hue(degree_120);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -120 degree END"));
        break;
      case 0x83:
        myCAM.OV5642_set_hue(degree_90);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -90 degree END"));
        break;
      case 0x84:
        myCAM.OV5642_set_hue(degree_60);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -60 degree END"));
        break;
      case 0x85:
        myCAM.OV5642_set_hue(degree_30);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -30 degree END"));
        break;
      case 0x86:
        myCAM.OV5642_set_hue(degree_0);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 0 degree END"));
        break;
      case 0x87:
        myCAM.OV5642_set_hue(degree30);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 30 degree END"));
        break;
      case 0x88:
        myCAM.OV5642_set_hue(degree60);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 60 degree END"));
        break;
      case 0x89:
        myCAM.OV5642_set_hue(degree90);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 90 degree END"));
        break;
      case 0x8a:
        myCAM.OV5642_set_hue(degree120);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 120 degree END"));
        break;
      case 0x8b:
        myCAM.OV5642_set_hue(degree150);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 150 degree END"));
        break;
      case 0x90:
        myCAM.OV5642_set_Special_effects(Normal);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Normal END"));
        break;
      case 0x91:
        myCAM.OV5642_set_Special_effects(BW);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to BW END"));
        break;
      case 0x92:
        myCAM.OV5642_set_Special_effects(Bluish);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Bluish END"));
        break;
      case 0x93:
        myCAM.OV5642_set_Special_effects(Sepia);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Sepia END"));
        break;
      case 0x94:
        myCAM.OV5642_set_Special_effects(Reddish);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Reddish END"));
        break;
      case 0x95:
        myCAM.OV5642_set_Special_effects(Greenish);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Greenish END"));
        break;
      case 0x96:
        myCAM.OV5642_set_Special_effects(Negative);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Negative END"));
        break;
      case 0xA0:
        myCAM.OV5642_set_Exposure_level(Exposure_17_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -1.7EV"));
        break;
      case 0xA1:
        myCAM.OV5642_set_Exposure_level(Exposure_13_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -1.3EV END"));
        break;
      case 0xA2:
        myCAM.OV5642_set_Exposure_level(Exposure_10_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -1.0EV END"));
        break;
      case 0xA3:
        myCAM.OV5642_set_Exposure_level(Exposure_07_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -0.7EV END"));
        break;
      case 0xA4:
        myCAM.OV5642_set_Exposure_level(Exposure_03_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -0.3EV END"));
        break;
      case 0xA5:
        myCAM.OV5642_set_Exposure_level(Exposure_default);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to -Exposure_default END"));
        break;
      case 0xA6:
        myCAM.OV5642_set_Exposure_level(Exposure07_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 0.7EV END"));
        break;
      case 0xA7:
        myCAM.OV5642_set_Exposure_level(Exposure10_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 1.0EV END"));
        break;
      case 0xA8:
        myCAM.OV5642_set_Exposure_level(Exposure13_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 1.3EV END"));
        break;
      case 0xA9:
        myCAM.OV5642_set_Exposure_level(Exposure17_EV);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to 1.7EV END"));
        break;
      case 0xB0:
        myCAM.OV5642_set_Sharpness(Auto_Sharpness_default);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Sharpness default END"));
        break;
      case 0xB1:
        myCAM.OV5642_set_Sharpness(Auto_Sharpness1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Sharpness +1 END"));
        break;
      case 0xB2:
        myCAM.OV5642_set_Sharpness(Auto_Sharpness2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Sharpness +2 END"));
        break;
      case 0xB3:
        myCAM.OV5642_set_Sharpness(Manual_Sharpnessoff);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness off END"));
        break;
      case 0xB4:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness1);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +1 END"));
        break;
      case 0xB5:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness2);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +2 END"));
        break;
      case 0xB6:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness3);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +3 END"));
        break;
      case 0xB7:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness4);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +4 END"));
        break;
      case 0xB8:
        myCAM.OV5642_set_Sharpness(Manual_Sharpness5);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Auto Manual Sharpness +5 END"));
        break;
      case 0xC0:
        myCAM.OV5642_set_Mirror_Flip(MIRROR);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to MIRROR END"));
        break;
      case 0xC1:
        myCAM.OV5642_set_Mirror_Flip(FLIP);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to FLIP END"));
        break;
      case 0xC2:
        myCAM.OV5642_set_Mirror_Flip(MIRROR_FLIP);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to MIRROR&FLIP END"));
        break;
      case 0xC3:
        myCAM.OV5642_set_Mirror_Flip(Normal);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Normal END"));
        break;
      case 0xD0:
        myCAM.OV5642_set_Compress_quality(high_quality);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to high quality END"));
        break;
      case 0xD1:
        myCAM.OV5642_set_Compress_quality(default_quality);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to default quality END"));
        break;
      case 0xD2:
        myCAM.OV5642_set_Compress_quality(low_quality);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to low quality END"));
        break;

      case 0xE0:
        myCAM.OV5642_Test_Pattern(Color_bar);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Color bar END"));
        break;
      case 0xE1:
        myCAM.OV5642_Test_Pattern(Color_square);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to Color square END"));
        break;
      case 0xE2:
        myCAM.OV5642_Test_Pattern(BW_square);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to BW square END"));
        break;
      case 0xE3:
        myCAM.OV5642_Test_Pattern(DLI);
        temp = 0xff;
        Serial.println(F("ACK CMD Set to DLI END"));
        break;
      default:
        break;
    }
  }
  if (mode == 1) {
    if (start_capture == 1) {
      myCAM.flush_fifo();
      myCAM.clear_fifo_flag();
      //Start capture
      myCAM.start_capture();
      start_capture = 0;
    }
    if (myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK)) {
      Serial.println(F("ACK CMD CAM Capture Done Mode1. END"));
      delay(50);
      read_fifo_burst(myCAM);
      //Clear the capture done flag
      myCAM.clear_fifo_flag();
    }
    delay(image_delay);

  } else if (mode == 2) {
    while (1) {
      temp = Serial.read();
      if (temp == 0x21) {
        start_capture = 0;
        mode = 0;
        Serial.println(F("ACK CMD CAM stop video streaming Mode2. END"));
        break;
      }
      switch (temp) {
        case 0x40:
          myCAM.OV5642_set_Light_Mode(Advanced_AWB);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Advanced_AWB END"));
          break;
        case 0x41:
          myCAM.OV5642_set_Light_Mode(Simple_AWB);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Simple_AWB END"));
          break;
        case 0x42:
          myCAM.OV5642_set_Light_Mode(Manual_day);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Manual_day END"));
          break;
        case 0x43:
          myCAM.OV5642_set_Light_Mode(Manual_A);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Manual_A END"));
          break;
        case 0x44:
          myCAM.OV5642_set_Light_Mode(Manual_cwf);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Manual_cwf END"));
          break;
        case 0x45:
          myCAM.OV5642_set_Light_Mode(Manual_cloudy);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Manual_cloudy END"));
          break;
        case 0x50:
          myCAM.OV5642_set_Color_Saturation(Saturation4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+4 END"));
          break;
        case 0x51:
          myCAM.OV5642_set_Color_Saturation(Saturation3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+3 END"));
          break;
        case 0x52:
          myCAM.OV5642_set_Color_Saturation(Saturation2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+2 END"));
          break;
        case 0x53:
          myCAM.OV5642_set_Color_Saturation(Saturation1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+1 END"));
          break;
        case 0x54:
          myCAM.OV5642_set_Color_Saturation(Saturation0);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation+0 END"));
          break;
        case 0x55:
          myCAM.OV5642_set_Color_Saturation(Saturation_1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation-1 END"));
          break;
        case 0x56:
          myCAM.OV5642_set_Color_Saturation(Saturation_2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation-2 END"));
          break;
        case 0x57:
          myCAM.OV5642_set_Color_Saturation(Saturation_3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation-3 END"));
          break;
        case 0x58:
          myCAM.OV5642_set_Light_Mode(Saturation_4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Saturation-4 END"));
          break;
        case 0x60:
          myCAM.OV5642_set_Brightness(Brightness4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+4 END"));
          break;
        case 0x61:
          myCAM.OV5642_set_Brightness(Brightness3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+3 END"));
          break;
        case 0x62:
          myCAM.OV5642_set_Brightness(Brightness2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+2 END"));
          break;
        case 0x63:
          myCAM.OV5642_set_Brightness(Brightness1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+1 END"));
          break;
        case 0x64:
          myCAM.OV5642_set_Brightness(Brightness0);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness+0 END"));
          break;
        case 0x65:
          myCAM.OV5642_set_Brightness(Brightness_1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness-1 END"));
          break;
        case 0x66:
          myCAM.OV5642_set_Brightness(Brightness_2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness-2 END"));
          break;
        case 0x67:
          myCAM.OV5642_set_Brightness(Brightness_3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness-3 END"));
          break;
        case 0x68:
          myCAM.OV5642_set_Brightness(Brightness_4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Brightness-4 END"));
          break;
        case 0x70:
          myCAM.OV5642_set_Contrast(Contrast4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+4 END"));
          break;
        case 0x71:
          myCAM.OV5642_set_Contrast(Contrast3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+3 END"));
          break;
        case 0x72:
          myCAM.OV5642_set_Contrast(Contrast2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+2 END"));
          break;
        case 0x73:
          myCAM.OV5642_set_Contrast(Contrast1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+1 END"));
          break;
        case 0x74:
          myCAM.OV5642_set_Contrast(Contrast0);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast+0 END"));
          break;
        case 0x75:
          myCAM.OV5642_set_Contrast(Contrast_1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast-1 END"));
          break;
        case 0x76:
          myCAM.OV5642_set_Contrast(Contrast_2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast-2 END"));
          break;
        case 0x77:
          myCAM.OV5642_set_Contrast(Contrast_3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast-3 END"));
          break;
        case 0x78:
          myCAM.OV5642_set_Contrast(Contrast_4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Contrast-4 END"));
          break;
        case 0x80:
          myCAM.OV5642_set_hue(degree_180);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -180 degree END"));
          break;
        case 0x81:
          myCAM.OV5642_set_hue(degree_150);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -150 degree END"));
          break;
        case 0x82:
          myCAM.OV5642_set_hue(degree_120);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -120 degree END"));
          break;
        case 0x83:
          myCAM.OV5642_set_hue(degree_90);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -90 degree END"));
          break;
        case 0x84:
          myCAM.OV5642_set_hue(degree_60);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -60 degree END"));
          break;
        case 0x85:
          myCAM.OV5642_set_hue(degree_30);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -30 degree END"));
          break;
        case 0x86:
          myCAM.OV5642_set_hue(degree_0);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 0 degree END"));
          break;
        case 0x87:
          myCAM.OV5642_set_hue(degree30);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 30 degree END"));
          break;
        case 0x88:
          myCAM.OV5642_set_hue(degree60);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 60 degree END"));
          break;
        case 0x89:
          myCAM.OV5642_set_hue(degree90);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 90 degree END"));
          break;
        case 0x8a:
          myCAM.OV5642_set_hue(degree120);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 120 degree END"));
          break;
        case 0x8b:
          myCAM.OV5642_set_hue(degree150);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 150 degree END"));
          break;
        case 0x90:
          myCAM.OV5642_set_Special_effects(Normal);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Normal END"));
          break;
        case 0x91:
          myCAM.OV5642_set_Special_effects(BW);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to BW END"));
          break;
        case 0x92:
          myCAM.OV5642_set_Special_effects(Bluish);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Bluish END"));
          break;
        case 0x93:
          myCAM.OV5642_set_Special_effects(Sepia);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Sepia END"));
          break;
        case 0x94:
          myCAM.OV5642_set_Special_effects(Reddish);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Reddish END"));
          break;
        case 0x95:
          myCAM.OV5642_set_Special_effects(Greenish);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Greenish END"));
          break;
        case 0x96:
          myCAM.OV5642_set_Special_effects(Negative);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Negative END"));
          break;
        case 0xA0:
          myCAM.OV5642_set_Exposure_level(Exposure_17_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -1.7EV END"));
          break;
        case 0xA1:
          myCAM.OV5642_set_Exposure_level(Exposure_13_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -1.3EV END"));
          break;
        case 0xA2:
          myCAM.OV5642_set_Exposure_level(Exposure_10_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -1.0EV END"));
          break;
        case 0xA3:
          myCAM.OV5642_set_Exposure_level(Exposure_07_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -0.7EV END"));
          break;
        case 0xA4:
          myCAM.OV5642_set_Exposure_level(Exposure_03_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -0.3EV END"));
          break;
        case 0xA5:
          myCAM.OV5642_set_Exposure_level(Exposure_default);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to -Exposure_default END"));
          break;
        case 0xA6:
          myCAM.OV5642_set_Exposure_level(Exposure07_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 0.7EV END"));
          break;
        case 0xA7:
          myCAM.OV5642_set_Exposure_level(Exposure10_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 1.0EV END"));
          break;
        case 0xA8:
          myCAM.OV5642_set_Exposure_level(Exposure13_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 1.3EV END"));
          break;
        case 0xA9:
          myCAM.OV5642_set_Exposure_level(Exposure17_EV);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to 1.7EV END"));
          break;
        case 0xB0:
          myCAM.OV5642_set_Sharpness(Auto_Sharpness_default);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Sharpness default END"));
          break;
        case 0xB1:
          myCAM.OV5642_set_Sharpness(Auto_Sharpness1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Sharpness +1 END"));
          break;
        case 0xB2:
          myCAM.OV5642_set_Sharpness(Auto_Sharpness2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Sharpness +2 END"));
          break;
        case 0xB3:
          myCAM.OV5642_set_Sharpness(Manual_Sharpnessoff);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness off END"));
          break;
        case 0xB4:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness1);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +1 END"));
          break;
        case 0xB5:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness2);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +2 END"));
          break;
        case 0xB6:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness3);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +3 END"));
          break;
        case 0xB7:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness4);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +4 END"));
          break;
        case 0xB8:
          myCAM.OV5642_set_Sharpness(Manual_Sharpness5);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Auto Manual Sharpness +5 END"));
          break;
        case 0xC0:
          myCAM.OV5642_set_Mirror_Flip(MIRROR);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to MIRROR END"));
          break;
        case 0xC1:
          myCAM.OV5642_set_Mirror_Flip(FLIP);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to FLIP END"));
          break;
        case 0xC2:
          myCAM.OV5642_set_Mirror_Flip(MIRROR_FLIP);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to MIRROR&FLIP END"));
          break;
        case 0xC3:
          myCAM.OV5642_set_Mirror_Flip(Normal);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Normal END"));
          break;
        case 0xD0:
          myCAM.OV5642_set_Compress_quality(high_quality);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to high quality END"));
          break;
        case 0xD1:
          myCAM.OV5642_set_Compress_quality(default_quality);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to default quality END"));
          break;
        case 0xD2:
          myCAM.OV5642_set_Compress_quality(low_quality);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to low quality END"));
          break;

        case 0xE0:
          myCAM.OV5642_Test_Pattern(Color_bar);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Color bar END"));
          break;
        case 0xE1:
          myCAM.OV5642_Test_Pattern(Color_square);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to Color square END"));
          break;
        case 0xE2:
          myCAM.OV5642_Test_Pattern(BW_square);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to BW square END"));
          break;
        case 0xE3:
          myCAM.OV5642_Test_Pattern(DLI);
          temp = 0xff;
          Serial.println(F("ACK CMD Set to DLI END"));
          break;
      }
      if (start_capture == 2) {
        myCAM.flush_fifo();
        myCAM.clear_fifo_flag();
        //Start capture
        myCAM.start_capture();
        start_capture = 0;
      }
      if (myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK)) {
        uint32_t length = 0;
        length = myCAM.read_fifo_length();
        if ((length >= MAX_FIFO_SIZE) | (length == 0)) {
          myCAM.clear_fifo_flag();
          start_capture = 2;
          continue;
        }
        //SPI.beginTransaction(SPISettings(12000000, MSBFIRST, SPI_MODE0));
        myCAM.CS_LOW();
        myCAM.set_fifo_burst();  //Set fifo burst mode
        temp = SPI.transfer(0x00);
        length--;
        while (length--) {
          temp_last = temp;
          temp = SPI.transfer(0x00);
          if (is_header == true) {
            Serial.write(temp);
          } else if ((temp == 0xD8) & (temp_last == 0xFF)) {
            is_header = true;
            Serial.println(F("ACK IMG END"));
            Serial.write(temp_last);
            Serial.write(temp);
          }
          if ((temp == 0xD9) && (temp_last == 0xFF))  //If find the end ,break while,
            break;
          delayMicroseconds(15);
        }
        myCAM.CS_HIGH();
        myCAM.clear_fifo_flag();
        start_capture = 2;
        is_header = false;
      }
    }
  } else if (mode == 3) {
    if (start_capture == 3) {
      //Flush the FIFO
      myCAM.flush_fifo();
      myCAM.clear_fifo_flag();
      //Start capture
      myCAM.start_capture();
      start_capture = 0;
    }
    if (myCAM.get_bit(ARDUCHIP_TRIG, CAP_DONE_MASK)) {
      Serial.println(F("ACK CMD CAM Capture Done mode3. END"));
      delay(50);
      uint8_t temp, temp_last;
      uint32_t length = 0;
      length = myCAM.read_fifo_length();
      if (length >= MAX_FIFO_SIZE) {
        Serial.println(F("ACK CMD Over size. END"));
        myCAM.clear_fifo_flag();
        return;
      }
      if (length == 0)  //0 kb
      {
        Serial.println(F("ACK CMD Size is 0. END"));
        myCAM.clear_fifo_flag();
        return;
      }
      //SPI.beginTransaction(SPISettings(12000000, MSBFIRST, SPI_MODE0));
      myCAM.CS_LOW();
      myCAM.set_fifo_burst();  //Set fifo burst mode

      Serial.write(0xFF);
      Serial.write(0xAA);
      for (temp = 0; temp < BMPIMAGEOFFSET; temp++) {
        Serial.write(pgm_read_byte(&bmp_header[temp]));
      }
      //SPI.transfer(0x00);
      char VH, VL;
      int i = 0, j = 0;
      for (i = 0; i < 240; i++) {
        for (j = 0; j < 320; j++) {
          VH = SPI.transfer(0x00);
          ;
          VL = SPI.transfer(0x00);
          ;
          Serial.write(VL);
          delayMicroseconds(12);
          Serial.write(VH);
          delayMicroseconds(12);
        }
      }
      Serial.write(0xBB);
      Serial.write(0xCC);
      myCAM.CS_HIGH();

      //Clear the capture done flag
      myCAM.clear_fifo_flag();
    }
    delay(image_delay);
  }
}
uint8_t read_fifo_burst(ArduCAM myCAM) {
  uint8_t temp = 0, temp_last = 0;
  uint32_t length = 0;
  length = myCAM.read_fifo_length();
  Serial.println(length, DEC);
  if (length >= MAX_FIFO_SIZE)  //512 kb
  {
    Serial.println(F("ACK CMD Over size. END"));
    return 0;
  }
  if (length == 0)  //0 kb
  {
    Serial.println(F("ACK CMD Size is 0. END"));
    return 0;
  }
  myCAM.CS_LOW();
  myCAM.set_fifo_burst();  //Set fifo burst mode
  temp = SPI.transfer(0x00);
  length--;
  while (length--) {
    temp_last = temp;
    temp = SPI.transfer(0x00);
    if (is_header == true) {
      Serial.write(temp);
    } else if ((temp == 0xD8) & (temp_last == 0xFF)) {
      is_header = true;
      Serial.println(F("ACK IMG END"));
      Serial.write(temp_last);
      Serial.write(temp);
    }
    if ((temp == 0xD9) && (temp_last == 0xFF))  //If find the end ,break while,
      break;
    //delayMicroseconds(15);
  }
  myCAM.CS_HIGH();
  
  is_header = false;
  return 1;
}
 
I got frustrated that the library did not use SPI Tranactions so I modified the sketch and library so it now uses transactions. Also made some tweaks. Tested the OV2640 on the T3.2, T3.5, T3.6 and the T4.0 and all work. The OV5640 is another issue. Seems to work a lot better now on the T3.2 and the T4.0 but can not seem to get working on the T3.5 and the T3.6.

Anyway the library and sketches for the OV2640 and OV5640 are now updated in the library:

https://github.com/mjs513/ArduCAM_t4
 
Again, thank you for helping me out. I tried the tip for adding a pull-up resistor to CS (2K because I do not have 4.7K resistors on hand right now), and it works consistently with both the library from August 18, and the most recent version of the library. It works with the sketch you sent on August 18, but not the examples on the most recent library version. But I am glad to say that I have the Arducam OV5642 Plus module consistently working with the Teensy.

EDIT: I do not need to use SetBMP to get it to work.
 
Last edited:
Back
Top