SD Card can't save new Pictures

Hello, I am currently using a NodeMCU,SDCard Module and a UART JPEG Camera. My goal is to snap a picture and then save it into the SDCard. The problem that I am having is that I can take the first picture and save it, but when it comes the 2nd, 3rd, 4th and so on, the picture is not saved into the SDCard.

Below is the code.

//*******************************************************
// www.linksprite.com
// Note:
// 1. SD must be formated to FAT16
// 2. As the buffer of softserial has 64 bytes,
// so the code read 32 bytes each time
// 3. Please add the libaray to the lib path
//
// * SD card attached to SPI bus as follows:
// * MOSI - pin 11
// * MISO - pin 12
// * CLK - pin 13
// * CS - pin 4
//*******************************************************
#include <SoftwareSerial.h>
#include <SPI.h>
#include <SD.h>

SoftwareSerial mySerial(D4,D3); // Set Arduino pin 4 and 5 as softserial

byte ZERO = 0x00;
byte incomingbyte;
long int j=0,k=0,count=0,i=0x0000;
uint8_t MH,ML;
boolean EndFlag=0;
File myFile;

void SendResetCmd()
{
mySerial.write(0x56);
mySerial.write(ZERO);
mySerial.write(0x26);
mySerial.write(ZERO);
}

//
/
Set ImageSize :
/
<1> 0x22 : 160
120
/
<2> 0x11 : 320
240
/
<3> 0x00 : 640
480
/
<4> 0x1D : 800
600
/
<5> 0x1C : 1024
768
/
<6> 0x1B : 1280
960
/
<7> 0x21 : 1600
1200
/
**************/
void SetImageSizeCmd(byte Size)
{
mySerial.write(0x56);
mySerial.write(ZERO);
mySerial.write(0x54);
mySerial.write(0x01);
mySerial.write(Size);
}

//
/
Set BaudRate :
/
<1>¡¡0xAE : 9600
/
<2>¡¡0x2A : 38400
/
<3>¡¡0x1C : 57600
/
<4>¡¡0x0D : 115200
/
<5>¡¡0xAE : 128000
/
<6>¡¡0x56 : 256000
/
*******/
void SetBaudRateCmd(byte baudrate)
{
mySerial.write(0x56);
mySerial.write(ZERO);
mySerial.write(0x24);
mySerial.write(0x03);
mySerial.write(0x01);
mySerial.write(baudrate);
}
int number = 23;
void SendTakePhotoCmd()
{
mySerial.write(0x56);
mySerial.write(ZERO);
mySerial.write(0x36);
mySerial.write(0x01);
mySerial.write(ZERO);
number = number + 1;
}

void SendReadDataCmd()
{
MH=i/0x100;
ML=i%0x100;
mySerial.write(0x56);
mySerial.write(ZERO);
mySerial.write(0x32);
mySerial.write(0x0c);
mySerial.write(ZERO);
mySerial.write(0x0a);
mySerial.write(ZERO);
mySerial.write(ZERO);
mySerial.write(MH);
mySerial.write(ML);
mySerial.write(ZERO);
mySerial.write(ZERO);
mySerial.write(ZERO);
mySerial.write(0x20);
mySerial.write(ZERO);
mySerial.write(0x0a);
i+=0x20;
}

void StopTakePhotoCmd()
{
mySerial.write(0x56);
mySerial.write(ZERO);
mySerial.write(0x36);
mySerial.write(0x01);
mySerial.write(0x03);
}

void setup()
{
Serial.begin(38400);
while (!Serial)
{
; // wait for serial port to connect. Needed for Leonardo only
}

Serial.print("Initializing SD card...");
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
pinMode(10, OUTPUT);
if (!SD.begin(D8))
{
    Serial.println("initialization failed!");
    return;
}
Serial.println("initialization done.");
Serial.println("please waiting ....");

mySerial.begin(115200);
delay(100);
SendResetCmd();
delay(2000);
SetBaudRateCmd(0x2A);
delay(500);
mySerial.begin(38400);
delay(100);

}

void loop()
{
byte a[32];
int ii;

SendResetCmd();
delay(2000);                            //Wait 2-3 second to send take picture command
SendTakePhotoCmd();
delay(1000);
while(mySerial.available()>0)
{
    incomingbyte=mySerial.read();
}

myFile = SD.open(String(number)+"pic.jpg", FILE_WRITE); //The file name should not be too long

while(!EndFlag)
{
    j=0;
    k=0;
    count=0;
    //mySerial.flush();
    SendReadDataCmd();
    delay(20);
    while(mySerial.available()>0)
    {
        incomingbyte=mySerial.read();
        k++;
        delay(1); //250 for regular
        if((k>5)&&(j<32)&&(!EndFlag))
        {
            a[j]=incomingbyte;
            if((a[j-1]==0xFF)&&(a[j]==0xD9))     //tell if the picture is finished
            {
                EndFlag=1;
            }
            j++;
            count++;
        }
    }

    for(j=0;j<count;j++)
    {
        if(a[j]<0x10)  Serial.print("0");
        Serial.print(a[j],HEX);           // observe the image through serial port
        Serial.print(" ");
    }

    for(ii=0; ii<count; ii++)
    myFile.write(a[ii]);
    Serial.println();
}

myFile.close();
Serial.print("Finished writing data to file");
while(1);

}

Welcome

Maybe you have to reset EndFlag to 0 ?

What is EndFlag for? Sorry, I am new to Arduino

In loop you have this

while(!EndFlag)
{
  ...
  if((a[j-1]==0xFF)&&(a[j]==0xD9))     //tell if the picture is finished
  {
    EndFlag=1;
  }

So when the first image finished, EndFlag is 1, so the while loop will never run again, until you set EndFlag to 0

Try this

...
myFile.close();
Serial.print("Finished writing data to file");
EndFlag = 0;

Okay, I will try it now.

It still only saves the first picture it snapped, it does not save the following picture.

if you were to indent the Code and use code tags in your first post (hint = read How to get the best out of this forum and modify your first post accordingly) then it might be easier to get an advice.

Your next problem is that you have an infinite while loop at the end of loop. But my advice is to not use this code at all because it's very low quality code..

Hello everyone, this is the working code. I have added "//Change" to the changes I made to the code.

#include <SoftwareSerial.h>

#include <SPI.h>

#include <SD.h>

SoftwareSerial mySerial(D4, D3); // Set Arduino pin 4 and 5 as softserial (RxD, TxD)

byte ZERO = 0x00;

byte incomingbyte;

long int j = 0, k = 0, count = 0, i = 0x0000;

uint8_t MH, ML;

boolean EndFlag = 0;

File myFile;

void SendResetCmd()

{

mySerial.write(0x56);

mySerial.write(ZERO);

mySerial.write(0x26);

mySerial.write(ZERO);

}

/*************************************/

/* Set ImageSize :

/* <1> 0x22 : 160*120

/* <2> 0x11 : 320*240

/* <3> 0x00 : 640*480

/* <4> 0x1D : 800*600

/* <5> 0x1C : 1024*768

/* <6> 0x1B : 1280*960

/* <7> 0x21 : 1600*1200

/************************************/

void SetImageSizeCmd(byte Size)

{

mySerial.write(0x56);

mySerial.write(ZERO);

mySerial.write(0x54);

mySerial.write(0x01);

mySerial.write(Size);

}

/*************************************/

/* Set BaudRate :

/* <1> 0xAE : 9600

/* <2> 0x2A : 38400

/* <3> 0x1C : 57600

/* <4> 0x0D : 115200

/* <5> 0xAE : 128000

/* <6> 0x56 : 256000

/*************************************/

void SetBaudRateCmd(byte baudrate)

{

mySerial.write(0x56);

mySerial.write(ZERO);

mySerial.write(0x24);

mySerial.write(0x03);

mySerial.write(0x01);

mySerial.write(baudrate);

}

void SendTakePhotoCmd()

{

mySerial.write(0x56);

mySerial.write(ZERO);

mySerial.write(0x36);

mySerial.write(0x01);

mySerial.write(ZERO);

}

void SendReadDataCmd()

{

MH = i / 0x100;

ML = i % 0x100;

mySerial.write(0x56);

mySerial.write(ZERO);

mySerial.write(0x32);

mySerial.write(0x0c);

mySerial.write(ZERO);

mySerial.write(0x0a);

mySerial.write(ZERO);

mySerial.write(ZERO);

mySerial.write(MH);

mySerial.write(ML);

mySerial.write(ZERO);

mySerial.write(ZERO);

mySerial.write(ZERO);

mySerial.write(0x20);

mySerial.write(ZERO);

mySerial.write(0x0a);

i += 0x20;

}

void StopTakePhotoCmd()

{

mySerial.write(0x56);

mySerial.write(ZERO);

mySerial.write(0x36);

mySerial.write(0x01);

mySerial.write(0x03);

}

void setup() {
Serial.begin(115200);

Serial.print("Initializing SD card...");

}

int intNameCount = 0;

void loop() {

if (!SD.begin(D8)) { //D8 stands for SD_CS

Serial.println("initialization failed!");

return;

}
else
{
Serial.println("initialization done.");
Serial.println("please waiting ....");

byte a[32];

int ii;
i = 0x0000; //Change
intNameCount ++;

mySerial.begin(115200);

delay(200);

SendResetCmd(); //Wait 2-3 second to send take picture command

delay(2000);

SetBaudRateCmd(0x2A);

delay(100);

mySerial.begin(38400);

delay(100);

SetImageSizeCmd(0x11); //Change Image Bit Size (Currently: 320 * 240)

delay(100);

SendTakePhotoCmd();

delay(3000);

while (mySerial.available() > 0)

{

  incomingbyte = mySerial.read();

}

myFile = SD.open(String(intNameCount) + "pic.jpg", FILE_WRITE); //<strong><span style="color: #ff0000;">The file name should not be too long</span></strong>

while (!EndFlag)

{

  j = 0;

  k = 0;

  count = 0;

  SendReadDataCmd();

  delay(5);

  while (mySerial.available() > 0)

  {

    incomingbyte = mySerial.read();

    k++;

    delayMicroseconds(100);

    if ((k > 5) && (j < 32) && (!EndFlag))

    {

      a[j] = incomingbyte;

      if ((a[j - 1] == 0xFF) && (a[j] == 0xD9)) //tell if the picture is finished

        EndFlag = 1;

      j++;

      count++;

    }

  }

  for (j = 0; j < count; j++)

  {

    if (a[j] < 0x10) Serial.print("0");

    Serial.print(a[j], HEX); // observe the image through serial port

    Serial.print(" ");

  }

  for (ii = 0; ii < count; ii++)

    myFile.write(a[ii]);

  Serial.println();

}

myFile.close();

Serial.print("Finished writing data to file");
StopTakePhotoCmd();
EndFlag = 0; //Change
delay(2500);

}
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.