Excesive storing time using SD card

Hi,

we're using a VC0706 camera along with a 8 GB Trascend SD card to take a snapshot and store it. You can find the library we're using here (GitHub - adafruit/Adafruit-VC0706-Serial-Camera-Library: Library for VC0706-based Serial JPEG Cameras). The problem is, when we run the example sketch "Snapshot" on our Arduino Mega, it takes up to 25 seconds to store a 48 K image. It seems too much time to us, so we're thinking maybe we're doing something wrong or maybe exists another way to store it faster.

Hope you can help us, thanks in advance.

Did you read the Notes on SPI in the Snapshot.ino?

Maybe your code is the problem. You might try posting it.

Hey Paul, thanks for your answer,

as I said, I ran the "Snapshot" example in the following library: GitHub - adafruit/Adafruit-VC0706-Serial-Camera-Library: Library for VC0706-based Serial JPEG Cameras

Anyway, here's the code:

#include <Adafruit_VC0706.h>
#include <SPI.h>
#include <SD.h>

#include <SoftwareSerial.h> // comment out this line if using Arduino V23 or earlier        

#define chipSelect 4 // SD breakout board CS

SoftwareSerial cameraconnection = SoftwareSerial(69, 3); // On Mega: camera TX connected to pin 69 (A15), camera RX to pin 3:

Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection);

void setup() {

  // When using hardware SPI, the SS pin MUST be set to an
  // output (even if not connected or used).  If left as a
  // floating input w/SPI on, this can cause lockuppage.

#if !defined(SOFTWARE_SPI)
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  if (chipSelect != 53) pinMode(53, OUTPUT); // SS on Mega
#else
  if (chipSelect != 4) pinMode(4, OUTPUT); // SS on Uno, etc.
#endif
#endif

  Serial.begin(9600);
  Serial.println("VC0706 Camera snapshot test");

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }

  // Try to locate the camera
  if (cam.begin()) {
    Serial.println("Camera Found:");
  } else {
    Serial.println("No camera found?");
    return;
  }
  // Print out the camera version information (optional)
  char *reply = cam.getVersion();
  if (reply == 0) {
    Serial.print("Failed to get version");
  } else {
    Serial.println("-----------------");
    Serial.print(reply);
    Serial.println("-----------------");
  }

  // Set the picture size - you can choose one of 640x480, 320x240 or 160x120
  // Remember that bigger pictures take longer to transmit!

  cam.setImageSize(VC0706_640x480);        // biggest
  //cam.setImageSize(VC0706_320x240);        // medium
  //cam.setImageSize(VC0706_160x120);          // small

  // You can read the size back from the camera (optional, but maybe useful?)
  uint8_t imgsize = cam.getImageSize();
  Serial.print("Image size: ");
  if (imgsize == VC0706_640x480) Serial.println("640x480");
  if (imgsize == VC0706_320x240) Serial.println("320x240");
  if (imgsize == VC0706_160x120) Serial.println("160x120");

  Serial.println("Snap in 3 secs...");
  delay(3000);

  if (! cam.takePicture())
    Serial.println("Failed to snap!");
  else
    Serial.println("Picture taken!");

  // Create an image with the name IMAGExx.JPG
  char filename[13];
  strcpy(filename, "IMAGE00.JPG");
  for (int i = 0; i < 100; i++) {
    filename[5] = '0' + i / 10;
    filename[6] = '0' + i % 10;
    // create if does not exist, do not open existing, write, sync after write
    if (! SD.exists(filename)) {
      break;
    }
  }

  // Open the file for writing
  File imgFile = SD.open(filename, FILE_WRITE);

  // Get the size of the image (frame) taken
  uint16_t jpglen = cam.frameLength();
  Serial.print("Storing ");
  Serial.print(jpglen, DEC);
  Serial.print(" byte image.");

  int32_t time = millis();
  pinMode(8, OUTPUT);
  // Read all the data up to # bytes!
  byte wCount = 0; // For counting # of writes
  while (jpglen > 0) {
    // read 32 bytes at a time;
    uint8_t *buffer;
    uint8_t bytesToRead = min(32, jpglen); // change 32 to 64 for a speedup but may not work with all setups!
    buffer = cam.readPicture(bytesToRead);
    imgFile.write(buffer, bytesToRead);
    if (++wCount >= 64) { // Every 2K, give a little feedback so it doesn't appear locked up
      Serial.print('.');
      wCount = 0;
    }
    //Serial.print("Read ");  Serial.print(bytesToRead, DEC); Serial.println(" bytes");
    jpglen -= bytesToRead;
  }
  imgFile.close();

  time = millis() - time;
  Serial.println("done!");
  Serial.print(time); Serial.println(" ms elapsed");
}

void loop() {
}

pito:
Did you read the Notes on SPI in the Snapshot.ino?

Hey pito, thanks for your comment.

Yes, I've read the whole sketch and haven't found anything helpful. What do you mean?

    uint8_t bytesToRead = min(32, jpglen); // change 32 to 64 for a speedup but may not work with all setups!

There's a clue right there.

PaulS:

    uint8_t bytesToRead = min(32, jpglen); // change 32 to 64 for a speedup but may not work with all setups!

There's a clue right there.

Already changed that line for speeding it up, but the proccess still takes more than 20 secs.

Already changed that line for speeding it up, but the proccess still takes more than 20 secs.

You have a Mega. Make it 128 or 256.

640 pixels x 480 pixels x n bits/pixel is how many bytes of data?