0% found this document useful (0 votes)
6 views

New Text Document (2)

Uploaded by

yashw0121
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
6 views

New Text Document (2)

Uploaded by

yashw0121
Copyright
© © All Rights Reserved
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