CE 432 Robotics II Fall 2021
ESP32-CAM Practice - Take Photos
Sean Eaton

ESP32-CAM Practice - Take Photos


In this second tutorial we were introduced to various different methods of taking photos available to the ESP32-CAM in addition to using a micro SD card. They ranged from taking a photo once every 10 seconds, then using a pushbutton, to using a web server, and even using a Telegram bot. Along with these different methods, the format of the photo filename was modified to provide date and time information. The web server functions were also expanded upon. At first the webserver functioned as an online push button basically before an SD card management function was added and later a button to email a photo. The final task introduced how a Telegram bot can be used to take photos and control the flash of the ESP32-CAM.

Task 1: Take some photos by itself

For task 1 the ESP32-CAM was programmed with the provided example code that takes a picture every 10 seconds and saves it to the micro SD card. The code was easy to understand and we needed to change the quality of the JPEG picture to 40 to ensure pictures were of a decent quality for viewing. I used a 4GB micro SD card and a reader I had laying around for this homework. Figure 1 below shows the 5 pictures taken for Task 1. The first picture has a strange error that has no fix currently.

Figure 1. The 5 task 1 pictures that were saved to the micro SD card.

Task 2: Customize the photo names

For task 2, additional code allowed the picture file names to contain the date as well as the time the picture was taken. The ESP32-CAM is able to obtain what time it is by connecting to a NTP server. Some modifications to the code were needed because the server send GMT time by default. In order to get MST 6 hours must be subtracted. There is a section in the code for a GMT Offset value in seconds, so this was set to -6 * 3600. There is also an offset for daylight savings time but should remain zero at this time of the year.
As you can see in Figure 2 below, the file names have the correct date and time for when the pictures were taken.

Figure 2. The 5 task 2 pictures that have correct date and time file names.

Task 3: Take photos with a push button

For task 3 a push button needed to be connected to GPIO 16. A software debouncing solution is implemented in the example code so that the button must be in a stable state after 50 ms to activate the ESP32-CAM camera. The push button defaults to a HIGH state and when the button is pressed it will go LOW.
I unfortunately had issues getting good pictures using the example code. For the push button connections I followed the circuit diagram exactly, even connecting the button to 3.3V and using a 10k Ω resistor. I also tried using 5V, connecting the grounds together, and using 3.3V from my power supply in case that was the problem but I didn't see any improvement in the results. My hardware connections are shown below in Figure 3.

Figure 3. Hardware connections for using the push button.

When completing this task I had errors in the resulting pictures. Most of the picture wasn't able to be seen and was made up of gray pixels. Sometimes the file became corrupted as shown with picture 5. I originally thought I had ruined the ESP32-CAM board or the camera module somehow with my push button wiring but this wasn't the case. I experimented with the power supply wiring in case the ESP32-CAM wasn't receiving enough power but the pictures still came out like this.

Figure 4. Contents of the micro SD card when taking pictures with the push button.

According to the serial monitor the ESP32-CAM was functioning as expected. The camera module and micro SD card module were able to be set up successfully. Button presses were recognized and the pictures were saving. This was also a good attempt, prior to this the push button would not be recognized a majority of the time. I'm not sure why this task had so many issues since a push button was successfully used in homework 1.

Figure 5. Serial monitor output when taking pictures using the push button.

Task 4: Use a web server to take pictures

For task 4 some new libraries needed to be installed in order for the example code to function correctly. These libraries were the ESPAsyncWebServer library and the AsyncTCP library. The provided download links in the ebook were used to install these libraries. Relevant sections of the code such as image quality and network credentials were edited prior to uploading to the ESP32-CAM.
In order to take pictures using this web server you have to navigate to the IP address shown in the serial monitor, for me it was You then need to capture a photo and then refresh the page to see it. A rotate button is also included so that the ESP32-CAM's rotation doesn't matter as much.

Figure 6. Result of using a web server to take a photo of my living room.

Task 5: Web Server SD Card Photo Manager

For task 5 a manager for the micro SD card was added to the web server example code. The ability to capture photos is retained along with the added ability to view and delete the contents of the micro SD card. The date and time used for the photo file names should also be implemented as well. Using the calculations from task 2 I was able to set the correct time for my photo. I had taken photos previous to this so the first two are incorrect but the third and latest photo has the correct date and time as shown in Figures 7 and 8. The second photo uses an incorrect GMT offset and the first photo uses no GMT offset.

Figure 7. The red boxed photo correctly reports the date and time the photo was taken.

Figure 8. Screenshot of my computer's current time when taking the third photo.

Task 6: Take photos and send notifications

For task 6 the functionality for the ESP32-CAM to send an email with the photo taken was added. This new example code would take a photo shortly after the ESP32-CAM was turned on. In order to do this the ESP32 Mail Client library had to be installed. For some reason, when using the most up to date version of this library I was receiving an error that there was no member called timesstamp in this line of code:

localtime_r(&result.timesstamp, &dt);

I thought maybe there was typo and changed it to timestamp, but this led to another error with the types involved. After researching how this error could be fixed I found that the most up to date version of the library must've changed something and it isn't compatible with the exmaple code. The solution was to install v1.1.6 of the library using the Arduino Library Manager rather than verison 1.5.0 which the textbook link directs to. Other versions may work but v1.1.6 was the recommended version I saw so I went with it for simplicity.

In addition to having to install this library, a new email account had to be created specifically for the ESP32-CAM to email me notifications. I decided to make a gmail account since it was supported by the example code by default. I edited the code to include the login credentials, my personal email, and uploaded it to the ESP32-CAM. As shown in Figure 9 below, the ESP32-CAM was able to successfully send me an email of the photo that was taken.

Figure 9. Screenshot of the email and photo sent via the ESP32-CAM board.

Task 7: Take photo and email photo with a web server

For task 7, the web server was used once again with the added functionality of being able to send the photo to in an email. I edited the code so that my personal email was the default one but there is a text box at the bottom of the page that can be used to send it to any other email. To send the email you have to click the email photo button. Figure 10 below shows the web server along with the serial monitor showing that the photo was successfully emailed. Figure 11 shows the email I received.

Figure 10. Screenshot of the web server along with the serial monitor displaying successful results.

Figure 11. Screenshot of the email and photo sent by the ESP32-CAM web server code.

Task 8: Take and send photo to Telegram app

For task 8 the Telegram app was used to control the ESP32-CAM. In order to do this I had to create a Telegram account for this tutorial. In the Telegram app you are able to search for the 'botfather' account which creates a bot for you to use for whatever you want. After doing this the BOT token needs to be saved for use in the example code. After this another bot called 'IDBot' was used to get the chat ID for my own account. These are necessary for getting the example code to function correctly. After editing the code to connect to my WiFi and changing the JPEG quality to 40, I was able to control the ESP32-CAM using the Telegram app. Figure 12 shows that I am able to turn on the flash using Telegram. Figure 13 shows that I am able to take a photo and see the results in the Telegram app.

Figure 12. Turning on the flash using the Telegram app.

Figure 13. Using the Telegram app to take a photo on the ESP32-CAM.


This tutorial was very interesting to me, I wasn't aware that the ESP32-CAM was able to be controlled remotely using so many different methods. I think the email notifications and the Telegram examples would be the most useful since the camera can be controlled remotely so easily. I also have never used the Telegram app and I am interested in seeing how it can be used in other projects now. It is unforuntate that task 3 wasn't able to function like it waws supposed to, I am interested in why it wasn't working exactly  but I wasn't able to figure out what was going on. I also ran into a brown out detection error when attempting to complete task 4 even though the brown out detection was set to 0. I don't know exactly why this was happening. My only idea is that it might've been caused by the PCB protoboard I was using due to the 5V power supply not connecting directly to the ESP32-CAM board. I was able to get rid of the brown out error by using the breadboard instead.