0% found this document useful (0 votes)
19 views7 pages

New Text Document

Uploaded by

yashw0121
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
19 views7 pages

New Text Document

Uploaded by

yashw0121
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 7

//Including the libraries.

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"
#include "Base64.h"
#include "esp_camera.h"

//CAMERA_MODEL_AI_THINKER GPIO.
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27

#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22

// LED Flash PIN (GPIO 4)


#define FLASH_LED_PIN 4

//Enter your WiFi ssid and password.


const char* ssid = "Nothing";
const char* password = "123456789";
//========================================

//Replace with your "Deployment ID" and Folder Name.


String myDeploymentID =
"AKfycbx9xFg1kDIuO0NqWF6FO8SFQFqStlbn9pdM73iw6Y8xqZLjj2ecTloMWZmiw7uRP_AI";
String myMainFolderName = "ESP32-CAM";
//========================================

//Variables for Timer/Millis.


unsigned long previousMillis = 0;
const int Interval = 10; //--> Capture and Send a photo every 20 seconds.

// Variable to set capture photo with LED Flash.


// Set to "false", then the Flash LED will not light up when capturing a photo.
// Set to "true", then the Flash LED lights up when capturing a photo.
bool LED_Flash_ON = true;

// Initialize WiFiClientSecure.
WiFiClientSecure client;

// Function to initialize the camera configuration


void initCamera() {
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;

// init with high specs to pre-allocate larger buffers


if (psramFound()) {
config.frame_size = FRAMESIZE_UXGA;
config.jpeg_quality = 20; //0-63 lower number means higher quality
config.fb_count = 1;
} else {
config.frame_size = FRAMESIZE_SVGA;
config.jpeg_quality = 20; //0-63 lower number means higher quality
config.fb_count = 1;
}

// camera init
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("Camera init failed with error 0x%x", err);
Serial.println();
Serial.println("Restarting the ESP32 CAM.");
delay(1000);
ESP.restart();
}

sensor_t* s = esp_camera_sensor_get();
s->set_framesize(s, FRAMESIZE_QVGA); //--> UXGA|SXGA|XGA|SVGA|VGA|CIF|QVGA|
HQVGA|QQVGA
}

// This subroutine is to test the connection to "script.google.com".


void Test_Con() {
const char* host = "script.google.com";
while(1) {
Serial.println("-----------");
Serial.println("Connection Test...");
Serial.println("Connect to " + String(host));

client.setInsecure();

if (client.connect(host, 443)) {
Serial.println("Connection successful.");
Serial.println("-----------");
client.stop();
break;
} else {
Serial.println("Connected to " + String(host) + " failed.");
Serial.println("Wait a moment for reconnecting.");
Serial.println("-----------");
client.stop();
}

delay(10);
}
}

// Subroutine for capturing and sending photos to Google Drive.


void SendCapturedPhotos() {
const char* host = "script.google.com";
Serial.println();
Serial.println("-----------");

//Record the start time


unsigned long startTime = millis();

Serial.println("Connect to " + String(host));


client.setInsecure();

//---------------------------------------- The Flash LED blinks once to indicate


connection start.
digitalWrite(FLASH_LED_PIN, HIGH);
delay(10);
digitalWrite(FLASH_LED_PIN, LOW);
delay(10);
//----------------------------------------

//---------------------------------------- The process of connecting, capturing


and sending photos to Google Drive.
if (client.connect(host, 443)) {
Serial.println("Connection successful.");

if (LED_Flash_ON == true) {
digitalWrite(FLASH_LED_PIN, HIGH);
delay(10);
}

//.............................. Taking a photo.


Serial.println();
Serial.println("Taking a photo...");

for (int i = 0; i <= 1; i++) {


camera_fb_t * fb = NULL;
fb = esp_camera_fb_get();
if(!fb) {
Serial.println("Camera capture failed");
Serial.println("Restarting the ESP32 CAM.");
delay(10);
ESP.restart();
return;
}
esp_camera_fb_return(fb);
delay(10);
}

// Record the time taken for capturing photos


Serial.print("Time taken for capturing photos: ");
Serial.println(millis() - startTime);

camera_fb_t * fb = NULL;
fb = esp_camera_fb_get();
if(!fb) {
Serial.println("Camera capture failed");
Serial.println("Restarting the ESP32 CAM.");
delay(10);
ESP.restart();
return;
}

if (LED_Flash_ON == true) digitalWrite(FLASH_LED_PIN, LOW);

Serial.println("Taking a photo was successful.");


//..............................

//.............................. Sending image to Google Drive.


Serial.println();
Serial.println("Sending image to Google Drive.");
Serial.println("Size: " + String(fb->len) + "byte");

String url = "/macros/s/" + myDeploymentID + "/exec?folder=" +


myMainFolderName;

client.println("POST " + url + " HTTP/1.1");


client.println("Host: " + String(host));
client.println("Transfer-Encoding: chunked");
client.println();

int fbLen = fb->len;


char *input = (char *)fb->buf;
int chunkSize = 3 * 100; //--> must be multiple of 3.
int chunkBase64Size = base64_enc_len(chunkSize);
char output[chunkBase64Size + 1];

Serial.println();
int chunk = 0;
for (int i = 0; i < fbLen; i += chunkSize) {
int l = base64_encode(output, input, min(fbLen - i, chunkSize));
client.print(l, HEX);
client.print("\r\n");
client.print(output);
client.print("\r\n");
delay(10);
input += chunkSize;
Serial.print(".");
chunk++;
if (chunk % 50 == 0) {
Serial.println();
}
}
client.print("0\r\n");
client.print("\r\n");
esp_camera_fb_return(fb);
//..............................

//.............................. Waiting for response.


Serial.println("Waiting for response.");
long int StartTime = millis();
while (!client.available()) {
Serial.print(".");
delay(10);
if ((StartTime + 10 * 1000) < millis()) {
Serial.println();
Serial.println("No response.");
break;
}
}
Serial.println();
while (client.available()) {
Serial.print(char(client.read()));
}
//..............................

//.............................. Flash LED blinks once as an indicator of


successfully sending photos to Google Drive.
digitalWrite(FLASH_LED_PIN, HIGH);
delay(10);
digitalWrite(FLASH_LED_PIN, LOW);
delay(10);
//..............................
// Record the time taken for the entire process
Serial.print("Total time taken for the entire process: ");
Serial.println(millis() - startTime);
}
else {
Serial.println("Connected to " + String(host) + " failed.");

//.............................. Flash LED blinks twice as a failed connection


indicator.
digitalWrite(FLASH_LED_PIN, HIGH);
delay(10);
digitalWrite(FLASH_LED_PIN, LOW);
delay(10);
digitalWrite(FLASH_LED_PIN, HIGH);
delay(10);
digitalWrite(FLASH_LED_PIN, LOW);
delay(10);
//..............................
}
//----------------------------------------

Serial.println("-----------");

client.stop();
}
//________________________________________________________________________________

//________________________________________________________________________________
VOID SETUP()
void setup() {
// put your setup code here, to run once:

// Disable brownout detector.


WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);

Serial.begin(115200);
Serial.println();
delay(1000);

pinMode(FLASH_LED_PIN, OUTPUT);

// Setting the ESP32 WiFi to station mode.


Serial.println();
Serial.println("Setting the ESP32 WiFi to station mode.");
WiFi.mode(WIFI_STA);

//The process of connecting ESP32 CAM with WiFi Hotspot / WiFi Router.
Serial.println();
Serial.print("Connecting to : ");
Serial.println(ssid);
WiFi.begin(ssid, password);

// The process timeout of connecting ESP32 CAM with WiFi Hotspot / WiFi Router is
20 seconds.
// If within 20 seconds the ESP32 CAM has not been successfully connected to
WiFi, the ESP32 CAM will restart.
// I made this condition because on my ESP32-CAM, there are times when it seems
like it can't connect to WiFi, so it needs to be restarted to be able to connect to
WiFi.
int connecting_process_timed_out = 20; //--> 20 = 20 seconds.
connecting_process_timed_out = connecting_process_timed_out * 2;
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
digitalWrite(FLASH_LED_PIN, HIGH);
delay(250);
digitalWrite(FLASH_LED_PIN, LOW);
delay(250);
if(connecting_process_timed_out > 0) connecting_process_timed_out--;
if(connecting_process_timed_out == 0) {
Serial.println();
Serial.print("Failed to connect to ");
Serial.println(ssid);
Serial.println("Restarting the ESP32 CAM.");
delay(100);
ESP.restart();
}
}

digitalWrite(FLASH_LED_PIN, LOW);

Serial.println();
Serial.print("Successfully connected to ");
Serial.println(ssid);

// Initialize the camera configuration only once during setup


initCamera();
}
void loop() {
// put your main code here, to run repeatedly:
// Timer/Millis to capture and send photos to Google Drive every 20 seconds (see
Interval variable).
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= Interval) {
previousMillis = currentMillis;
SendCapturedPhotos();
}
}

You might also like