Problemas con guardar fotos en tarjeta microSD con arduino UNO

Hola a toda la gente del foro, soy bastante nuevo en el mundo de Arduino pero lo he encontrado muy interesante y por eso es que llegué acá ya que esto supera mis conocimientos.

Estoy diseñando un proyecto que consiste en la toma de fotos con una cámara al momento de activar un sensor de proximidad, y luego que se almacenen en una tarjeta microSD. el modelo de la cámara es LS-Y201-2MP, el sensor es un sharp 2Y0A02F19 y estoy usando el shield ethernet para conectar la tarjeta microSD a mi Arduino UNO.

El asunto funciona muy bien para la primera fotografía, pero al momento de sacar la siguiente me guarda archivos tipo jpg pero vaciós (pesan 0 kb), es como si no pasara de la memoria interna de la cámara a la microSD después de la primera foto.

adjunto el código para que lo vean y me puedan orientar ya que, como les decía, soy bastante nuevo en esto (de hecho este es mi primer proyecto) y esto ya superó mi conocimiento. De antemano muchas gracias.

el_tata.ino (5.21 KB)

Saludos.

He revisado el código pero sin implementarlo porque no poseo ni cámara ni el sensor.

Pero puede ver varias cosas, primero inicias el puerto dos veces primero con 9600 y luego otra velocidad. Define primero cual vas a usar.
Segundo utilizas una variable long llamada i, que primero comienza con el valor 0x0000, luego vas sumandole 0x20 cuando tomas la foto, pero nunca la retornas a 0x0000, cuando terminas de tomar las fotos.

    Serial.print(F("mensajes"));   // usa este en lugar de 
    Serial.print("mensajes");      //  este, ya que consume RAM

Y bueno hice otras correcciones menores.

el_tata.ino (4.55 KB)

Muchas gracias por la ayudad Max_saeta, pero sigue el mismo problema, leyendo en la página de donde saqué el código al parecer si j=0 el loop para leer bytes de la instantánea leerá más allá del comienzo de la matriz de 32 - bytes

eso sería acá

if((a[j-1]==0xFF)&&(a[j]==0xD9))

Pero no tengo idea de como solucionar eso.

Coloca

if( j>0 &&(a[j-1]==0xFF)&&(a[j]==0xD9))

algunos cambios

//*******************************************************
//              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>
#define SP 3


 
SoftwareSerial mySerial(5,6);          // 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;
int foto_numero = 13; 
int sensor = 3;
int distancia;
int has = 1;

 
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 tomaFoto(File myFile)
{
  byte a[32];
  int ii;
  
  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(ii=0; ii<count; ii++)
          myFile.write(a[ii]);
        
 }
}
 
void setup()
{
 
  Serial.begin(9600);
  pinMode(SP,INPUT);
    
  Serial.begin(38400);
    while (!Serial)
    {
        ; // wait for serial port to connect. 
    }
 
    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(4))    {
        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() {
  
  distancia=analogRead(sensor);
  Serial.println (distancia);
  delay(100);
  
  if (distancia > 110)  {
    SendResetCmd();
    delay(2000);                            //Wait 1-2 second to send take picture command
    SendTakePhotoCmd();
    delay(1000);
    while(mySerial.available()>0)  {
      //Serial.println("mySerial available"); 
      incomingbyte=mySerial.read();
    }
    
    //Serial.println("llalal");
    String Auxiliar ="numero";       // adding a constant integer to a string:
    Auxiliar.concat(h);
    Auxiliar.concat("jpg");
    //Serial.print("Filename is: ");
    Serial.println(Auxiliar);
  
 
   
    char foto[Auxiliar.length()+1];
    Auxiliar.toCharArray(foto, sizeof(foto));
    if (!SD.exists(filename)) {
       myFile = SD.open(foto, FILE_WRITE); //The file name should not be too long
    }
    else {
     Serial.println("Ya existe ")
     Serial.pirnt("")
    }

    // while (z <Auxiliar.length())
    //  foto[z]=Auxiliar.charAt(z++);
    // myFile = SD.open(foto, FILE_WRITE); 

    tomaFoto(myFile); 
    myFile.close();
      
    Serial.println();
    Serial.print("Finished writing data to file");
    // while(1);
    StopTakePhotoCmd();
    h++;   // incremento contador de foto para la próxima
  }

  //if (sensor <= 110) {  // esto esta mal y se ejecuta siempre
   else {  // que es en realidad distancia <= 110 
    Serial.println();
    Serial.print("los tengo identificados");
  }
}