captura fecha actual

Buen día, he capturado fotos y las he guardado en una SD , el problema es que todas quedan con fecha
01/01/2000 1:00.... quiero capturar la fecha del dia y guardarlo en una variable para renombrar el archivo...
Estoy utilizando la libreria Time.h pero la duda que tengo es que se puede setear y calcular la fecha del dia del seteo , pero que pasa cuando se reinicia el arduino se reinicia la fecha segun seteo...

Pueden ayudarme a aclarar esta duda...

No coloco el codigo por que en la libreria se incluyen ejemplos... pero si tienen un codigo diferente donde garantice que se actualizara la fecha del dia seria bueo verlo

atento a sus comentarios...

Hola dimates.
Para actualizar la fecha debes tener un RTC. De lo contrario se apaga Arduino y al reiniciar, lo hace con el valor que le diste para que inicie la fecha.
Quieres garantizar fecha y hora, compra un RTC DS3231 y fecha y hora garantizados

Ok muchas gracias por tu respuesta... así lo haré...

saludos

estimado surbyte realice la compra de un Tiny RTC I2C modules es muy economico ...
Lo trabaje e un arduino mega y funciona aunque en ocasiones el funcionamiento no es tan constante.. es decir a veces se descontrolaba la fecha y tenia que volver a configuraro...

Tengo un problema... cuando lo integro con algun programa que tengo hecho , se queda pegado justo en la linea donde se instancia la RTC...

Tengo un proyecto con una camara que guarda en una SD y debo incluir el rtc para que la foto que guarda quede con la fecha y hora...

Si ya la tengo configurada por que la inicialice con la linea RTC.adjust(DateTime(DATE, TIME)) ya para sacar la fechay hora cuales serian las lineas minimas...

#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
 
void setup () {
 Serial.begin(9600);
 Wire.begin();
 RTC.begin();

}
  
void loop () {

 DateTime now = RTC.now();
 String fec ;
 fec = (String(now.day()) +  '/' +  String(now.month()) +  '/' +  String(now.year())  +  ' ' +  String(now.hour())  +  ':' +  String(now.minute())   +  ':' +  String(now.second())  );
 Serial.print("fecha es  :");
 Serial.print(fec);
 delay(3000);
}

Cuando integro con la camara se queda parado en la linea DateTime now = RTC.now() , he optado
por quitar lineas y resumirlo al maximo pero nada sigue pegado en esa linea ...

Cabe anotar que en mi ejemplo se usan muchos elementos con el begin

Wire.begin(); // Inicia el puerto I2C
RTC.begin(); // Inicia la comunicación con el RTC
Serial.begin(9600) // MONITOR SERIAL
SD.begin(4) // SD CARD
cam.begin() // CAMERA

Aunque son diferentes no se si estan causando conflicto ....

agradezco me puedas dar una ayuda si necesitas que coloque el codigo de la camara me dices....

Eres el segundo que habla que RTClib que creo que es la rutina que usas se queda colgada.
Usa la rutina DS1307RTC que soporta DS1307, DS 1337 y DS3231 y al estar hecha por la misma gente esta bien integrada con Time y TimeAlarm.
Mira bien porque tendras que hacer algunos cambios pero no son tan complicados.

Buenas noches Surbyte... logre poner a funcionar el rtc con un arduino nano sin problemas.....
Al parecer tenia problemas con el programa lo desinstale e instala la nueva version y funciono...

Ahora el inconveniente que tengo es el siguiente...

Cuando paso el rtc al arduino uno con camara + sd card... se frena...

Este es un programa que toma una foto y la guarda en una SD ... El nombre del archivo guardado es image00, 01....n Lo que necesito es reemplazar el nombre del archivo por la fecha del etc....

Adjunto el codigo hasta donde se para el programa...

No alcanza a ejecutar esta sentencia
DateTime now = RTC.now(); // no alcanza a llegar a este punto

Por cual otro llamado a la función puedo reemplazarlo

#include <SoftwareSerial.h>
#include <Adafruit_VC0706.h>
#include <SPI.h>
#include <SD.h>
#include <Wire.h> 
#include "RTClib.h"

RTC_DS1307 RTC;

#define chipSelect 10

int led = 7;
int j = 0;
int inPin = 8;  
int state = 0;   
String fec ;   
//A4 SDA    A5 SCL   5VCC   GND

#if ARDUINO >= 100
SoftwareSerial cameraconnection = SoftwareSerial(2, 3);
#else
NewSoftSerial cameraconnection = NewSoftSerial(2, 3);
#endif

Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection);

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

  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);    
  Wire.begin(); 
  RTC.begin(); 
  Serial.begin(9600);
  Serial.println("VC0706 Camera snapshot test");
  digitalWrite(inPin, 0);
 
  if (!SD.begin(4)) {
    Serial.println("Card failed, or not present");
    return;
  }
}

void loop() 
{ 
  Serial.print("calcule fecha :");  // muestra este mensaje en el monitor serial

  DateTime now = RTC.now();    // no alcanza a llegar a este punto

   Serial.print("rtc now");

  fec = (String(now.day()));   

       Serial.print("calculo");  
       Serial.print(fec);
  
       if(Serial.available() > 0)
       {
      state = Serial.read();
       }

Viendo el foro donde se mensiona un sensor de temperatura veo que sugieres un cambio este :

#include <SoftwareSerial.h>
#include <Adafruit_VC0706.h>
#include <SPI.h>
#include <SD.h>
#include <Wire.h> 
#include "RTClib.h"

RTC_DS1307 RTC;
DateTime now;

#define chipSelect 10

int led = 7;
int j = 0;
int inPin = 8;  
int state = 0;   
String fec ;   
//A4 SDA    A5 SCL   5VCC   GND

#if ARDUINO >= 100
SoftwareSerial cameraconnection = SoftwareSerial(2, 3);
#else
NewSoftSerial cameraconnection = NewSoftSerial(2, 3);
#endif

Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection);

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

  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);    
  
  Wire.begin(); 
  RTC.begin(); 
  
  Serial.begin(9600);
  Serial.println("VC0706 Camera snapshot test");
  digitalWrite(inPin, 0);
 
  if (!SD.begin(4)) {
    Serial.println("Card failed, or not present");
    return;
  }
}

void loop() 
{ 
  Serial.print("calcule fecha :");
  now = RTC.now(); 
  Serial.print("rtc now");
  fec = (String(now.day()));   
  //fec = (String(now.day())+  '/' +  String(now.month()) +  '/' +  String(now.year())  +  ' ' +  String(now.hour())  +  ':' +  String(now.minute())   +  ':' +  String(now.second())  );
  delay (2000);
       Serial.print("calculo");
       Serial.print(fec);

pero sigue igual exactamente es esa linea no sigue al instanciar el rtc..

No se que pasa pero RTCLib no me compila. Me da un error en un en una definición de un macro #define day_of_week si mal recuerdo.
Por ello lo eliminé y uso la librería que antes te dije.
Asi que empezando por ahi
Porque todo el mundo abusa de String?
Es mas facil armar algo de este modo.
define un vector de caracteres de tamaño conocido

char buffer[20]; // por ejemplo. dale el tamaño que corresponda al nombre del archivo.
// luego usando sprintf haces esto
sprintf(buffer, "%2d/%02d/%02d %d:%02d:%02d", now.day(),now.month(),now.year(),now.hour(),now.minute(),now.second());
Serial.println(buffer);

%d se usa para imprimer enteros
%2d imprime reservando dos espacios
%02d imprime con dos espacios pero si la variable es de un digito agrega un 0 a la izquierda.
como en los dias de 1 digitos por ejemplo.

Estimado Surbyte , lo que dices es cierto todo el mundo abusa del string por que en .net , java y otros lenguajes no cuestan...
Pero ahora que administro programas en Cobol y C++ , se lo importante del manejo de definición de variables , memoria y cursores .. lastimosamente todavía no lo domino pero soporto esas aplicaciones ...ajaja..

Ahora la pregunta que tengo es por que definiste que el error era por el tamaño de la definición del variables, si se esta quedando pegada es la instancia del datetime...
en el monitor seria me arroja solo el mensaje
"calcule fecha :"
pero el mensaje del "rtc now" no aparece ...

disculpa la ignorancia pero me parece que debería haber otra forma de llamar la función de fecha, de pronto mas directa... que opinas ???

Serial.print("calcule fecha :"); // muestra este mensaje en el monitor serial
DateTime now = RTC.now(); // no alcanza a llegar a este punto
Serial.print("rtc now");

No se si con la libreria que te he dicho se usa RTC.now()
claro se usa if (RTC.read(tm)) {

Por favor ve el ejemplo

#include <DS1307RTC.h>
#include <Time.h>
#include <Wire.h>

void setup() {
  Serial.begin(9600);
  while (!Serial) ; // wait for serial
  delay(200);
  Serial.println("DS1307RTC Read Test");
  Serial.println("-------------------");
}

void loop() {
  tmElements_t tm;

  if (RTC.read(tm)) {
    Serial.print("Ok, Time = ");
    print2digits(tm.Hour);
    Serial.write(':');
    print2digits(tm.Minute);
    Serial.write(':');
    print2digits(tm.Second);
    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    Serial.write('/');
    Serial.print(tm.Month);
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.println();
  } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(9000);
  }
  delay(1000);
}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}

Entonces no funciona del mismo modo.

Estimado Surbay,
He realizado avances con el tema , ya estabilice la fecha del rtc ; puedo crear el archivo y lo
hago con el nombre de la fecha sin problemas pero ahora el problema que tengo es que la
imagen de la camara no la esta guardando. El programa de la foto funciona bien si le quito el rtc...
Pero cuando le pongo el rtc no logra guardar la imagen, aunque en el seguimiento del programa
dice que ha creado el archivo de x tamaño... se ve bien .. solo no comprendo por que en el ultimo
paso no logra hacerlo bien....

Asi se ve en el monitor serial

VC0706 Camera snapshot test
RTC iniciando

fecha everifica
222154.JPGCamera Found:
Picture taken!
Storing 46384 byte image.......................state
49

fecha everifica
222155.JPGCamera Found:
Picture taken!
Storing 48724 byte image........................state
49

fecha everifica
222156.JPGCamera Found:
Picture taken!
Storing 48672 byte image........................state
49

Adjunto el programa por si puedes darme una mano..

#include <SoftwareSerial.h>
#include <Adafruit_VC0706.h>
#include <SPI.h>
#include <SD.h>
#include <Wire.h> 
#include "RTClib.h"

RTC_DS1307 RTC;

#define chipSelect 10

int led = 7;
int j = 0;
int inPin = 8;  
int state = 0;   
char filename[13];
String fec2 = " " ;

//A4 SDA    A5 SCL   5VCC   GND

#if ARDUINO >= 100
SoftwareSerial cameraconnection = SoftwareSerial(2, 3);
#else
NewSoftSerial cameraconnection = NewSoftSerial(2, 3);
#endif

Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection);

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

  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);    
  
  
  
  Serial.begin(9600);
  Wire.begin(); 
  RTC.begin(); 

  
  Serial.println("VC0706 Camera snapshot test");
  digitalWrite(inPin, 0);
 
  if (!SD.begin(4)) {  
    Serial.println("Card failed, or not present");
    return;
                    }
   Serial.println("RTC iniciando");                 
}

void loop() 
{ 
      

       
       
  
       if(Serial.available() > 0)
       {
      state = Serial.read();
       }
    
    if (state == '1') 
    {        
              DateTime now2 = RTC.now();            
              fec2 = ( String(now2.day())  +   String(now2.hour())  +   String(now2.minute())  + ".JPG"  );
              Serial.println();                
              Serial.print("fecha everifica");         
              Serial.println();  
              Serial.print(fec2);         
              
               delay(500);
              digitalWrite ( led , HIGH) ;
              take_photo();
              digitalWrite( led , LOW) ;
              Serial.println("state");



         
         Serial.println(state);         
    }    
    
    else if (state == '0') 
    {    
      digitalWrite( led , LOW) ;
    }
    delay(500);      
}

void take_photo() 
{
  if (cam.begin()) {
    Serial.println("Camera Found:");
  } else {
    Serial.println("No camera found?");
    return;
  }

  /*
  char *reply = cam.getVersion();
  if (reply == 0) {
    Serial.print("Failed to get version");
  } else {
   // Serial.println("-----------------");
    Serial.print(reply);
  //  Serial.println("-----------------");
  }
  */

   
  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
   
   fec2.toCharArray(filename, 13) ;
  // Serial.println("filename");
   //Serial.println(filename);
  
  /*
  strcpy(filename, "IMAGE00.JPG");
  //delay(900);
  
  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;
    }
  }
  */
  delay(1000);
  
  // Open the file for writing
  File imgFile = SD.open(filename, FILE_WRITE);
  // Serial.println("escribio");
  // 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");
  
  //j = j+1;
  
  
//   Serial.println("Snap in 3 secs.continua..");
//   Serial.println( j);
   
  delay(9000);
  }

Cómo es el programa cuando quitas el rtc que si funciona?

si correcto cuando no tiene el rtc , acomodo el programa de la siguiente forma y funciona bien...
Pero incluso en el programa anterior se puede ver que los datos si estan llegando por que se
esta generando un tamaño en kb de la imagen , pero no se por que no la guarda..

Pensaba que esta haciendo falta un delay o que al crear el archivo con un nombre que se obtiene
de una conversion string a char seria lo que esta afectando...

Al siguiente programa lo unico que le hace falta es que guarde el archivo con la fecha y hora , no
como esta actualmente que guarda un archivo con el nombre IMAGE00.JPG y lo que hace es que
reemplaza el 00 por un numero consecutivo que no se repite...

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

// comment out this line if using Arduino V23 or earlier


// uncomment this line if using Arduino V23 or earlier
// #include <NewSoftSerial.h>       

// SD card chip select line varies among boards/shields:
// Adafruit SD shields and modules: pin 10
// Arduino Ethernet shield: pin 4
// Sparkfun SD shield: pin 8
// Arduino Mega w/hardware SPI: pin 53
// Teensy 2.0: pin 0
// Teensy++ 2.0: pin 20
#define chipSelect 10

int led = 7;
int j = 0;
int inPin = 8;  
int state = 0;      // Variable lectrura serial
// Pins for camera connection are configurable.
// With the Arduino Uno, etc., most pins can be used, except for
// those already in use for the SD card (10 through 13 plus
// chipSelect, if other than pin 10).
// With the Arduino Mega, the choices are a bit more involved:
// 1) You can still use SoftwareSerial and connect the camera to
//    a variety of pins...BUT the selection is limited.  The TX
//    pin from the camera (RX on the Arduino, and the first
//    argument to SoftwareSerial()) MUST be one of: 62, 63, 64,
//    65, 66, 67, 68, or 69.  If MEGA_SOFT_SPI is set (and using
//    a conventional Arduino SD shield), pins 50, 51, 52 and 53
//    are also available.  The RX pin from the camera (TX on
//    Arduino, second argument to SoftwareSerial()) can be any
//    pin, again excepting those used by the SD card.
// 2) You can use any of the additional three hardware UARTs on
//    the Mega board (labeled as RX1/TX1, RX2/TX2, RX3,TX3),
//    but must specifically use the two pins defined by that
//    UART; they are not configurable.  In this case, pass the
//    desired Serial object (rather than a SoftwareSerial
//    object) to the VC0706 constructor.

// Using SoftwareSerial (Arduino 1.0+) or NewSoftSerial (Arduino 0023 & prior):
#if ARDUINO >= 100
// On Uno: camera TX connected to pin 2, camera RX to pin 3:
SoftwareSerial cameraconnection = SoftwareSerial(2, 3);
// On Mega: camera TX connected to pin 69 (A15), camera RX to pin 3:
//SoftwareSerial cameraconnection = SoftwareSerial(69, 3);
#else
NewSoftSerial cameraconnection = NewSoftSerial(2, 3);
#endif

Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection);

// Using hardware serial on Mega: camera TX conn. to RX1,
// camera RX to TX1, no SoftwareSerial object is required:
//Adafruit_VC0706 cam = Adafruit_VC0706(&Serial1);

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 != 10) pinMode(10, OUTPUT); // SS on Uno, etc.
#endif
#endif

    pinMode(led, OUTPUT);
    digitalWrite(led, LOW);    
  Serial.begin(9600);
  Serial.println("VC0706 Camera snapshot test");
  digitalWrite(inPin, 0);
 
  // see if the card is present and can be initialized:
  if (!SD.begin(4)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }  

}

void loop() 
{ 
       if(Serial.available() > 0)
       {
      state = Serial.read();
       } // esta parte del código es para solo 1 Carácter o Unidad.  
    // si el estado es 0 ese sería Apagado “OFF”
    if (state == '1') 
    {
         digitalWrite ( led , HIGH) ;
         take_photo();
         digitalWrite( led , LOW) ;

         Serial.println("state");
         Serial.println(state);
         
    }    
    // si el estado es 1 ese sería Encendido “ON”
    else if (state == '0') 
    {    
      digitalWrite( led , LOW) ;
    }
    delay(500);      
}


void take_photo() 
{
  // 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");
  
  j = j+1;
  
  
   Serial.println("Snap in 3 secs.continua..");
   Serial.println( j);
   
  delay(9000);
  }

Surbyte,
Te comento que ya solucione el problema antes estaba colocando el nombre
22112056.JPG no funcionaba lo cambie por I24220.JPG y el tamaño del nombre
de char 13 y funciono...

raro pero funciono por ahí leí en la librería SD que le nombre debía ser menor que 12....

ahora le incorporare el wifi .... sera posible que la foto pueda ser enviada por wifi a
un servidor... estoy pidiendo mucho del WIFI ESP8266... Por ahora solo he visto ejemplos
donde a través del wifi activan mediante un 1 o 0.. pero enviar una foto no he visto algo
así...

puedes darme tu opinión ?

Disculpa que no te pude responder. Yo intento en la medida de lo posible simular las cosas y me lleva tiempo si es que no conozco la respuesta inmediata.

Un nombre de archivo FAT debe ser de 8 caracteres de longitud y 3 de extensión.

no te preocupes no hay problema.... técnicamente es por que es un archivo tipo FAT ..
umm que interesante... entonces si yo quisiera aumentar el tamaño de ese archivo
seria complejo ?

Que opinas de este otro punto ?

ahora le incorporare el wifi .... sera posible que la foto pueda ser enviada por wifi a
un servidor... estoy pidiendo mucho del WIFI ESP8266... Por ahora solo he visto ejemplos
donde a través del wifi activan mediante un 1 o 0 para encender un led.. pero enviar una foto
no he visto algo así...

No veo porque no se pueda, limitando el tamaÑo del buffer o sea de la trama a enviar por el ESP8266 no veo porque no puedas.
He visto muchas cosas interesantes enviando archivos grandes sobre canales que tienen limitaciones y lo hacen con independencia de ellas. Asi que estoy seguro que si es posible.
Mirá esto, Sending image over ESP8266, lo hace a la increíble velocidad de 921600 bps usando 2048 bytes por byte pero su foto le toma 20 segundos en ser enviada y justamente plantea otra alternativa.
Pero ves que es posible.

Otro link Sending raw camera data directly

Son comentarios del foro ESP8266 asi que no vas a encontrar códigos arduino pero si sigues buscando seguro encontrarás.
Lo importante que prueba que se puede hacer.

Si señor perfecto esto era lo que buscaba....

Te pregunto si se puede para delimitar el alcance de mi proyecto, perdí mucho tiempo tratando de configurar el Módulo de Cámara OV7670 , que dolor de cabeza; primero con arduino uno y no se pudo por que al parecer los pines no son suficientes para esta cámara y después la configure con arduino mega y tampoco se pudo no hay muchos ejemplos y los que hay no funcionan.. En cambio compre la camara de adafruit y el mismo día que llego ya estaba tomando fotos..Algún día la pondré a funcionarla por que la economía se nota un 80% mas económica...

gracias por la ayuda , ya mi proyecto va tomando el rumbo que quiero...

probaste hacer esto en Google: Arduino OV7670 y luego ir a imágenes? Yo acabo de ver al menos 20 esquemas con diferentes arduinos.
Por ejemplo este en modo paralelo con el UNO


o este en modo serial con cualquiera

por lo visto hay varias alternativas.

Pues yo diría que realice prueba con todos los ejemplos posibles , en ese tiempo también estaba muy nuevo
con este tema y pienso que también influyo.. aquí se maneja el concepto de FIFO asi mismo se debe buscar el ejemplo...
Pero lo retomare cuando logre enviar la foto por wifi....Tengo la cámara sin uso..

Aquí también es donde me pierdo si la cámara utiliza el 100% de los pines ... como conecto un bluethoo y sensor pir por ejemplo...

Se comparten pines o solo podría conectar 1 cámara ???