Connecting ESP32-Cam to blynk app

Below is my code


/*Tech Trends Shameer
//Live Streaming*/
/*

  This is a simple MJPEG streaming webserver implemented for AI-Thinker ESP32-CAM and
  ESP32-EYE modules.
  This is tested to work with VLC and Blynk video widget.

  Inspired by and based on this Instructable: $9 RTSP Video Streamer Using the ESP32-CAM Board
  (https://www.instructables.com/id/9-RTSP-Video-Streamer-Using-the-ESP32-CAM-Board/)

  Board: AI-Thinker ESP32-CAM

*/

#define BLYNK_TEMPLATE_ID "TMPL65f1BmD3D"
#define BLYNK_TEMPLATE_NAME "Live Streaming"
#define BLYNK_AUTH_TOKEN "FY9ZdUCEf9Yktuxn042aKzP8GZB6jm1A"

#define BLYNK_PRINT Serial

#include <Blynk.h>
#include <WiFi.h>
#include <WebServer.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
// Select camera model
//#define CAMERA_MODEL_WROVER_KIT
//#define CAMERA_MODEL_ESP_EYE
//#define CAMERA_MODEL_M5STACK_PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE
#define CAMERA_MODEL_AI_THINKER

#include "camera_pins.h"
#ifndef OV2640_H_
#define OV2640_H_

#include <Arduino.h>
#include <pgmspace.h>
#include <stdio.h>
#include "esp_log.h"
#include "esp_attr.h"
#include "esp_camera.h"

extern camera_config_t esp32cam_config, esp32cam_aithinker_config, esp32cam_ttgo_t_config;

class OV2640
{
public:
    OV2640(){
        fb = NULL;
    };
    ~OV2640(){
    };
    esp_err_t init(camera_config_t config);
    void run(void);
    size_t getSize(void);
    uint8_t *getfb(void);
    int getWidth(void);
    int getHeight(void);
    framesize_t getFrameSize(void);
    pixformat_t getPixelFormat(void);

    void setFrameSize(framesize_t size);
    void setPixelFormat(pixformat_t format);

private:
    void runIfNeeded(); // grab a frame if we don't already have one

    // camera_framesize_t _frame_size;
    // camera_pixelformat_t _pixel_format;
    camera_config_t _cam_config;

    camera_fb_t *fb;
};

#endif //OV2640_H_

char auth[] = BLYNK_AUTH_TOKEN;
const char* ssid = "123";
const char* password = "1313113.";


/*
Next one is an include with wifi credentials.
This is what you need to do:

1. Create a file called "home_wifi_multi.h" in the same folder   OR   under a separate subfolder of the "libraries" folder of Arduino IDE. (You are creating a "fake" library really - I called it "MySettings"). 
2. Place the following text in the file:
#define SSID1 "replace with your wifi ssid"
#define PWD1 "replace your wifi password"
3. Save.

Should work then
*/
//#include "home_wifi_multi.h"

OV2640 cam;

WebServer server(80);

const char HEADER[] = "HTTP/1.1 200 OK\r\n" \
                      "Access-Control-Allow-Origin: *\r\n" \
                      "Content-Type: multipart/x-mixed-replace; boundary=123456789000000000000987654321\r\n";
const char BOUNDARY[] = "\r\n--123456789000000000000987654321\r\n";
const char CTNTTYPE[] = "Content-Type: image/jpeg\r\nContent-Length: ";
const int hdrLen = strlen(HEADER);
const int bdrLen = strlen(BOUNDARY);
const int cntLen = strlen(CTNTTYPE);

void handle_jpg_stream(void)
{
  char buf[32];
  int s;

  WiFiClient client = server.client();

  client.write(HEADER, hdrLen);
  client.write(BOUNDARY, bdrLen);

  while (true)
  {
    if (!client.connected()) break;
    cam.run();
    s = cam.getSize();
    client.write(CTNTTYPE, cntLen);
    sprintf( buf, "%d\r\n\r\n", s );
    client.write(buf, strlen(buf));
    client.write((char *)cam.getfb(), s);
    client.write(BOUNDARY, bdrLen);
  }
}

const char JHEADER[] = "HTTP/1.1 200 OK\r\n" \
                       "Content-disposition: inline; filename=capture.jpg\r\n" \
                       "Content-type: image/jpeg\r\n\r\n";
const int jhdLen = strlen(JHEADER);

void handle_jpg(void)
{
  WiFiClient client = server.client();

  cam.run();
  if (!client.connected()) return;

  client.write(JHEADER, jhdLen);
  client.write((char *)cam.getfb(), cam.getSize());
}

void handleNotFound()
{
  String message = "Server is running!\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  server.send(200, "text / plain", message);
}

void setup()
{

  Serial.begin(115200);
  //while (!Serial);            //wait for serial connection.

  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;

  // Frame parameters
  //  config.frame_size = FRAMESIZE_UXGA;
  config.frame_size = FRAMESIZE_QVGA;
  config.jpeg_quality = 12;
  config.fb_count = 2;

#if defined(CAMERA_MODEL_ESP_EYE)
  pinMode(13, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);
#endif

  cam.init(config);

  IPAddress ip;

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(F("."));
  }
  ip = WiFi.localIP();
  Serial.println(F("WiFi connected"));
  Serial.println("");
    // Configure Blynk
  Blynk.config(auth);
  Serial.println("Connecting to Blynk");
  while (Blynk.connect() == false) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nConnected to Blynk");

  
  Serial.println(ip);
  Serial.print("Stream Link: http://");
  Serial.print(ip);
  Serial.println("/mjpeg/1");
  server.on("/mjpeg/1", HTTP_GET, handle_jpg_stream);
  server.on("/jpg", HTTP_GET, handle_jpg);
  server.onNotFound(handleNotFound);
  server.begin();
}

void loop()
{
  server.handleClient();
   Blynk.run(); 
}


c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/…/lib/gcc/xtensa-esp32-elf/12.2.0/…/…/…/…/xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\AppData\Local\Temp\arduino\sketches\0C72AFDE6E536486EDF4CB3B1DE16AF6\sketch\live-streaming.ino.cpp.o:(.literal._Z17handle_jpg_streamv+0x1c): undefined reference to OV2640::run()' c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/../lib/gcc/xtensa-esp32-elf/12.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\AppData\Local\Temp\arduino\sketches\0C72AFDE6E536486EDF4CB3B1DE16AF6\sketch\live-streaming.ino.cpp.o:(.literal._Z17handle_jpg_streamv+0x20): undefined reference to OV2640::getSize()’
c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/…/lib/gcc/xtensa-esp32-elf/12.2.0/…/…/…/…/xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\AppData\Local\Temp\arduino\sketches\0C72AFDE6E536486EDF4CB3B1DE16AF6\sketch\live-streaming.ino.cpp.o:(.literal._Z17handle_jpg_streamv+0x28): undefined reference to OV2640::getfb()' c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/../lib/gcc/xtensa-esp32-elf/12.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\AppData\Local\Temp\arduino\sketches\0C72AFDE6E536486EDF4CB3B1DE16AF6\sketch\live-streaming.ino.cpp.o:(.literal._Z5setupv+0x54): undefined reference to OV2640::init(camera_config_t)’
c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/…/lib/gcc/xtensa-esp32-elf/12.2.0/…/…/…/…/xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\AppData\Local\Temp\arduino\sketches\0C72AFDE6E536486EDF4CB3B1DE16AF6\sketch\live-streaming.ino.cpp.o: in function handle_jpg_stream()': C:\Users\yewki\Downloads\live-video-streaming-esp32-cam-blynk-iot\live-streaming/live-streaming.ino:126: undefined reference to OV2640::run()’
c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/…/lib/gcc/xtensa-esp32-elf/12.2.0/…/…/…/…/xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\Downloads\live-video-streaming-esp32-cam-blynk-iot\live-streaming/live-streaming.ino:127: undefined reference to OV2640::getSize()' c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/../lib/gcc/xtensa-esp32-elf/12.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\Downloads\live-video-streaming-esp32-cam-blynk-iot\live-streaming/live-streaming.ino:131: undefined reference to OV2640::getfb()’
c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/…/lib/gcc/xtensa-esp32-elf/12.2.0/…/…/…/…/xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\AppData\Local\Temp\arduino\sketches\0C72AFDE6E536486EDF4CB3B1DE16AF6\sketch\live-streaming.ino.cpp.o: in function handle_jpg()': C:\Users\yewki\Downloads\live-video-streaming-esp32-cam-blynk-iot\live-streaming/live-streaming.ino:145: undefined reference to OV2640::run()’
c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/…/lib/gcc/xtensa-esp32-elf/12.2.0/…/…/…/…/xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\Downloads\live-video-streaming-esp32-cam-blynk-iot\live-streaming/live-streaming.ino:149: undefined reference to OV2640::getfb()' c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/../lib/gcc/xtensa-esp32-elf/12.2.0/../../../../xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\Downloads\live-video-streaming-esp32-cam-blynk-iot\live-streaming/live-streaming.ino:149: undefined reference to OV2640::getSize()’
c:/users/yewki/appdata/local/arduino15/packages/esp32/tools/esp-x32/2302/bin/…/lib/gcc/xtensa-esp32-elf/12.2.0/…/…/…/…/xtensa-esp32-elf/bin/ld.exe: C:\Users\yewki\AppData\Local\Temp\arduino\sketches\0C72AFDE6E536486EDF4CB3B1DE16AF6\sketch\live-streaming.ino.cpp.o: in function setup()': C:\Users\yewki\Downloads\live-video-streaming-esp32-cam-blynk-iot\live-streaming/live-streaming.ino:204: undefined reference to OV2640::init(camera_config_t)’
collect2.exe: error: ld returned 1 exit status

exit status 1

Compilation error: exit status 1

It shows several red lines saying that I have undefined reference to _. Please help. Thank you in advance

Your sketch doesn’t include any library to handle the OV2640 calls within the sketch. You’d normally have an OV2640 library installed that you include like the other libraries that you’ve included in your sketch…

Your error message is telling you that it doesn’t ip understand the OV2640 calls because there’s no corresponding library.

Pete.