So you're a Noob? Post your questions here until you graduate! Don't be shy.

User avatar
By BlackCode
#69090 Hey,

So after many frustrating hours of coding I decided to seek some help.
I have my ArduCam 2MP Mini connected to my ESP8266 as follows :

Image

Image

What I like to do is taking a picture and saving it as a JPG image without creating any local server/html script.
Just take a picture and save it to the internal storage of the ESP.

Then I like to load the picture so I can send it over the network (via Telegram-messenger).

Can someone explain me how this can be achieved?
I already did a lot of research and checked out the examples I found online - they work, but they all are either
streaming video or using a local server to display the image.
I simply want to take snap and save the raw data of the jpg image.

The code I am currently trying to get running somehow :

Code: Select allvoid myCAMSaveToSPIFFS() {

  SPIFFS.begin();
  delay(10);

  myCAM.set_format(JPEG);
  myCAM.InitCAM();
  setCamResolution(resolution);
  // as file space is used, capturing images will get slower. At a certain point, the images will become distored
  // or they will not save at all due to lack of space. To avoid this we set a limit and allow some free space to remain
  if ((fileTotalKB - fileUsedKB) < fileSpaceOffset)
  {
    String maxStr = "====== Maximum Data Storage Reached =========";
    Serial.println(maxStr);
    HomeBot.sendMessage(HomeBot.message[1][4], EncodeURL("Data storage is full! Failed to take picture!") , "");
    errMsg = maxStr;
    return;
  }

  String str;
  byte buf[256];
  static int i = 0;

  static int n = 0;
  uint8_t temp, temp_last;

  //  File file;
  //Flush the FIFO
  myCAM.flush_fifo();
  //Clear the capture done flag
  myCAM.clear_fifo_flag();
  //Start capture
  myCAM.start_capture();

  while (!myCAM.get_bit(ARDUCHIP_TRIG , CAP_DONE_MASK));
  Serial.println("File Capture Done!");

  fileCount++;

  str = "/pics/" + String(fileCount)  + ".jpg";

  File f = SPIFFS.open(str, "w");
  if (!f) {
    Serial.println("prop file open failed");
  }
  else
  {
    Serial.println(str);
  }


  i = 0;
  myCAM.CS_LOW();
  myCAM.set_fifo_burst();
#if !(defined (ARDUCAM_SHIELD_V2) && defined (OV2640_CAM))
  SPI.transfer(0xFF);
#endif
  //Read JPEG data from FIFO
  while ( (temp != 0xD9) | (temp_last != 0xFF)) {
    temp_last = temp;
    temp = SPI.transfer(0x00);

    //Write image data to buffer if not full
    if ( i < 256)
      buf[i++] = temp;
    else {
      //Write 256 bytes image data to file
      myCAM.CS_HIGH();
      f.write(buf , 256);
      i = 0;
      buf[i++] = temp;
      myCAM.CS_LOW();
      myCAM.set_fifo_burst();
    }
    //delay(0);
  }

  //Write the remain bytes in the buffer
  if (i > 0) {
    myCAM.CS_HIGH();
    f.write(buf, i);
  }
  //Close the file
  f.close();
  Serial.println("CAM Save Done!");
}


I received the storage is full warning when executing the function, which makes very little sense since
there should be more then enough free space available on the ESP for a low res picture.

Can someone help me out? :/
User avatar
By Djoy1
#76022 Hello,
I dont know if you have already solved the problem but I have tried using your code without this part
if ((fileTotalKB - fileUsedKB) < fileSpaceOffset)
{
String maxStr = "====== Maximum Data Storage Reached =========";
Serial.println(maxStr);
HomeBot.sendMessage(HomeBot.message[1][4], EncodeURL("Data storage is full! Failed to take picture!") , "");
errMsg = maxStr;
return;
}

and instead of using str = "/pics/" + String(fileCount) + ".jpg"; I used str = "/" + String(fileCount) + ".jpg";
I did not get any error message and picture was successfully saved I just need to work on the resolution