ESP32-CAM as doorbell with camera Topic is solved

Moderator: leecollings

Larsoss
Posts: 65
Joined: Friday 18 March 2016 10:11
Target OS: Raspberry Pi / ODroid
Domoticz version: 2020.2
Location: Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by Larsoss »

hoeby wrote: Tuesday 05 May 2020 16:48 Today i made the start with the new housing.
But i can't finish it yet. Wanting on some new parts, which i need to measure, before i can finish the drawing.
Also looking for the option to add the VAC -> VDC converter, don't know how to solve that.

The drawing idea is made with black housing and aluminium cover.
Some asked to get a copy of the drawings, this is no problem, but than i need to be sure that things could fit. Be patience
Image
You should sell them by default. ;-)

I am interested in it.
Raspberry 4 - USB boot Domoticz /|\ Raspberry 2B - Dashticz /|\ Tasmota device's /|\ Philips Hue & Yeelight
azonneveld
Posts: 160
Joined: Wednesday 02 October 2019 7:37
Target OS: Raspberry Pi / ODroid
Domoticz version: 2024.4
Location: Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by azonneveld »

hoeby wrote: Wednesday 13 May 2020 17:25 The code is not that fare finished, that i can share it.
It is different with the code from the first message, first need to finish some things. Also like your experiance, because i changed the code i first want to test it for a few days, before sharing the code.
Are you sure the code is still running on a connection error? Usually a watchdog on a system runs in a seperate thread, that's why I added another esp with a NC relais. In case the ping to the doorbell fails, a command to cut the power is send to the watchdog esp. This command is repeated every minute until the doorbell responds to the ping again.
rpi4 - zigbee2mqtt - roborock - espeasy - rfxcom - homewizard p1 - otgw - homebridge - surveillance station - egardia - goodwe - open weather map - wol - BBQ detection - rsync backup
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

azonneveld wrote: Friday 15 May 2020 15:28Are you sure the code is still running on a connection error?
This is how i tested it:
Configure a separate wifi router. Connected my pc with cable to router. Setup an ssid and connected the esp.
Camera stream is working. After that i modified the ssid name. Cmd ping is lost after that. Let it go for 10 minutes with the wrong ssid name. Then set back the ssid name and the esp connected again. Only stream needs a refresh in the browser, but than worked again.

Is my test correct, or would you like that i test it with a different methode?
Last edited by hoeby on Friday 15 May 2020 20:52, edited 2 times in total.
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

Larsoss wrote: Friday 15 May 2020 15:01 You should sell them by default. ;-)

I am interested in it.
Thanks Larsoss,

The finale design is not finished. Still waiting on 120 degree camera. On the background i am working on the code, but that isn't going that fast, but getting there. Mqtt needs to be added before i post the new code.

I don't know yet if i give the option to sell complete kits, i don't know that at the moment. Lets first have a finished design, after that we can look if there are more people wo are interested, to keep cost down.

Just a question to you: could you program an esp? Or does it need to work out of the box? Don't know what most people can do by themself
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

Just an update on the code.

- Added MQTT, but it is not finished yet. MQTT connects to broker.
* It can receive messages, but need to make a part in the code, that does something with the message.
* Controlling domoticz dummy switch works
- Need to add define for HTTP/JSON or MQTT. That users can choose which way to use commands, for triggering domoticz dummy
- Added webserver function. This is untill now very basic. The idea is to go index page and see all settings you made in de code.

I first finish the above points.
After that i stop adding things in this code and start with a V2 code.
The idea with the V2 code. That you upload the code in de ESP and after that go to the webbrowser and do all settings in de browser.
But that is long term.
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
azonneveld
Posts: 160
Joined: Wednesday 02 October 2019 7:37
Target OS: Raspberry Pi / ODroid
Domoticz version: 2024.4
Location: Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by azonneveld »

hoeby wrote: Friday 15 May 2020 19:11
azonneveld wrote: Friday 15 May 2020 15:28Are you sure the code is still running on a connection error?
Is my test correct, or would you like that i test it with a different methode?
Sounds good!
But for now I will stick to the external watchdog because it is working fine, and also because I have to open the doorbell to update the code.
rpi4 - zigbee2mqtt - roborock - espeasy - rfxcom - homewizard p1 - otgw - homebridge - surveillance station - egardia - goodwe - open weather map - wol - BBQ detection - rsync backup
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

I finished the V1 code today.
Tested it for 24hours now. Works for me stable.
The wifi test is done. Let the device trying for 15 minutes, to connect to a non available ssid. After that i made the ssid available and it connected. Same test for MQTT.

The ledPin1 is ON at standby, 2x flash after that pause = wifi error, 4x flash after that pause = mqtt error
WS2812 rgb is not supported. The RGB is 4-pin LED in 1 housing (sorry, don't know the type)

Webserver to show all settings you made and 4 hyperlinks for the functions is not added.
Somehow this let the esp crash after a few hours running. Removed that part of the script, this will be a future project and will be back in V2.

Code: Select all

#include "esp_camera.h"
#include <WiFi.h>
#include "esp_timer.h"
#include "img_converters.h"
#include "Arduino.h"
#include "fb_gfx.h"
#include "soc/soc.h" 
#include "soc/rtc_cntl_reg.h"  
#include "esp_http_server.h"
#include <PubSubClient.h>
#ifndef MQTT_MAX_PACKET_SIZE 
 #define MQTT_MAX_PACKET_SIZE 512 
#endif
#include <HTTPClient.h>

//**************************************************************************************************************************************************
//**                                                         Welke URL worden aangemaakt                                                          **
//**************************************************************************************************************************************************
//   http://IP/stream  = live camera stream
//   http://IP/capture = capture image 
//   http://IP/on      = switch ledPin1 on (light from flash button, or standby light from rgb button)
//   http://IP/off     = switch ledPin1 off (light from flash button, or standby light from rgb button)

//   The idea about the last 2 functions, is to disable the led in the button at night situation. 

//**************************************************************************************************************************************************
//**                                                             START SETTINGS START                                                             **
//**************************************************************************************************************************************************

//**************************************************************************************************************************************************
//**                                                           Setting Wifi credentials                                                           **
//**************************************************************************************************************************************************
const char* ssid       = "Wifi-SSID";                           //Wifi SSID waarop ESP32-cam zich moet aanmelden.
const char* password   = "Wifi-password";                       //Bijbehorend wachtwoord welke bij het gekozen SSID behoort.

//**************************************************************************************************************************************************
//**                                                              IP settings device                                                              **
//**************************************************************************************************************************************************
//#define FixedIP                                               //Haal de // weg om fixed IP te gebruiken, anders staat deze op DHCP.
#define IPaddr            192,168,***,***                       //Voer IP adres is, digits tussen komma's invoeren.
#define SubnetAddr        255,255,255,0                         //Voer subnet mask in, digits tussen de komma's invoeren.
#define GatewayAddr       192,168,***,***                       //Voer Gateway adres in, digits tussen de komma's invoeren. 
                                                                //Als device geen internet nodig heeft, voer een fake gateway in. 

//**************************************************************************************************************************************************
//**                                                          Setting Domotcz credentials                                                         **
//**************************************************************************************************************************************************
String DomoticzIP      = "192.168.***.***";                     //Domoticz Server IP adres.
String DomoticzPort    = "8080";                                //Domoticz Server poort adres.
#define DomoticzIDX      "***"                                  //Domoticz IDX nummer welke geschakeld moet worden.
String DomoticzSwitch  = "On";                                  //Domoticz IDX state. Bij activeren ingang, moet IDX dan On of Off gestuurd worden?  
#define DomoticzResetSwitch                                     //Haal de // weg, dan wordt er een tegengesteld commando van DomoticzSwitch gestuurd 

//**************************************************************************************************************************************************
//**                                                         Setting Domoticz data-signal                                                         **
//**************************************************************************************************************************************************
#define DomoticzHttpJson                                        //Haal // weg om HTTP/JSON commando te gebruiken naar Domoticz
//#define DomoticzMQTT                                          //Haal // weg om MQTT commando te gebruiken naar Broker/Domoticz

//**************************************************************************************************************************************************
//**                                                                 Setting MQTT                                                                 **
//**************************************************************************************************************************************************
const char* mqtt_server = "192.168.***.***";                    //MQTT Broker IP adres
#define mqtt_port 1883                                          //MQTT Broker port adres
#define MQTT_USER ""                                            //MQTT username
#define MQTT_PASSWORD ""                                        //MQTT password
const char* Subscriber  = "ESP32CAM/Input";                     //MQTT Subscriber name
const char* topicin     = "domoticz/in";                        //MQTT Topic name
// For switching ledPin1 ON, payload = on
// For switching ledPin1 OFF, payload = off
 
//**************************************************************************************************************************************************
//**                                                              Setting PUSH button                                                             **
//**************************************************************************************************************************************************
#define FlashButton                                             //Verwijder de // om Button met enkele LED te gebruiken
// #define RgbButton                                            //Verwijder de // om RGB LED Button te gebruiken
const int buttonPin1 = 12;                                      //GPIO nummer voor de ingang van drukknop.
#define ButtonTimer 10000                                       //De tijd dat LED aangestuurd is. 

//**************************************************************************************************************************************************
//**                                                              Setting LED button                                                              **
//**************************************************************************************************************************************************
const int ledPin1 =  13;                                        //ledPin1 is gebruikt voor flashbutton en standby licht RGB knop
const int ledPin2 =  14;                                        //ledPin2 schakelt bij drukken RGB knop
const int ledPin3 =  15;                                        //ledPin3 schakelt bij drukken RGB knop

//**************************************************************************************************************************************************
//**                                                              Setting Camera type                                                             **
//**************************************************************************************************************************************************
#define CAMERA_MODEL_AI_THINKER
//#define CAMERA_MODEL_M5STACK_PSRAM
//#define CAMERA_MODEL_M5STACK_WITHOUT_PSRAM

// Not tested with this model
//#define CAMERA_MODEL_WROVER_KIT

//**************************************************************************************************************************************************
//**                                                                END SETTINGS END                                                              **
//**************************************************************************************************************************************************

char msgToDomoticZ[120];  
const char* msgContact  = "{\"command\": \"switchlight\", \"idx\": ";  
const char* msgContactOn = ", \"switchcmd\": \"On\"}";  
const char* msgContactOff = ", \"switchcmd\": \"Off\"}";  

int buttonState1 = 0;        
String ledState;
WiFiClient wifiClient;
PubSubClient client(wifiClient);
unsigned long check_wifi = 30000;
int repeatflash;

#define PART_BOUNDARY "123456789000000000000987654321"

typedef struct {
        httpd_req_t *req;
        size_t len;
} jpg_chunking_t;

static size_t jpg_encode_stream(void * arg, size_t index, const void* data, size_t len){
    jpg_chunking_t *j = (jpg_chunking_t *)arg;
    if(!index){
        j->len = 0;
    }
    if(httpd_resp_send_chunk(j->req, (const char *)data, len) != ESP_OK){
        return 0;
    }
    j->len += len;
    return len;
}

#if defined(CAMERA_MODEL_WROVER_KIT)
  #define PWDN_GPIO_NUM    -1
  #define RESET_GPIO_NUM   -1
  #define XCLK_GPIO_NUM    21
  #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      19
  #define Y4_GPIO_NUM      18
  #define Y3_GPIO_NUM       5
  #define Y2_GPIO_NUM       4
  #define VSYNC_GPIO_NUM   25
  #define HREF_GPIO_NUM    23
  #define PCLK_GPIO_NUM    22

#elif defined(CAMERA_MODEL_M5STACK_PSRAM)
  #define PWDN_GPIO_NUM     -1
  #define RESET_GPIO_NUM    15
  #define XCLK_GPIO_NUM     27
  #define SIOD_GPIO_NUM     25
  #define SIOC_GPIO_NUM     23
  
  #define Y9_GPIO_NUM       19
  #define Y8_GPIO_NUM       36
  #define Y7_GPIO_NUM       18
  #define Y6_GPIO_NUM       39
  #define Y5_GPIO_NUM        5
  #define Y4_GPIO_NUM       34
  #define Y3_GPIO_NUM       35
  #define Y2_GPIO_NUM       32
  #define VSYNC_GPIO_NUM    22
  #define HREF_GPIO_NUM     26
  #define PCLK_GPIO_NUM     21

#elif defined(CAMERA_MODEL_M5STACK_WITHOUT_PSRAM)
  #define PWDN_GPIO_NUM     -1
  #define RESET_GPIO_NUM    15
  #define XCLK_GPIO_NUM     27
  #define SIOD_GPIO_NUM     25
  #define SIOC_GPIO_NUM     23
  
  #define Y9_GPIO_NUM       19
  #define Y8_GPIO_NUM       36
  #define Y7_GPIO_NUM       18
  #define Y6_GPIO_NUM       39
  #define Y5_GPIO_NUM        5
  #define Y4_GPIO_NUM       34
  #define Y3_GPIO_NUM       35
  #define Y2_GPIO_NUM       17
  #define VSYNC_GPIO_NUM    22
  #define HREF_GPIO_NUM     26
  #define PCLK_GPIO_NUM     21

#elif defined(CAMERA_MODEL_AI_THINKER)
  #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
#else
  #error "Camera model not selected"
#endif

static const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;
static const char* _STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n";
static const char* _STREAM_PART = "Content-Type: image/jpeg\r\nContent-Length: %u\r\n\r\n";

httpd_handle_t stream_httpd = NULL;

static esp_err_t stream_handler(httpd_req_t *req){
  camera_fb_t * fb = NULL;
  esp_err_t res = ESP_OK;
  size_t _jpg_buf_len = 0;
  uint8_t * _jpg_buf = NULL;
  char * part_buf[64];

  res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);
  if(res != ESP_OK){
    return res;
  }

  while(true){
    fb = esp_camera_fb_get();
    if (!fb) {
      Serial.println("------- New message: Camera failure -----");
      Serial.println("Camera capture failed");
      Serial.println("");
      res = ESP_FAIL;
    } else {
      if(fb->width > 400){
        if(fb->format != PIXFORMAT_JPEG){
          bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len);
          esp_camera_fb_return(fb);
          fb = NULL;
          if(!jpeg_converted){
            Serial.println("------- New message: JPEG Compression -----");
            Serial.println("JPEG compression failed");
            Serial.println("");
            res = ESP_FAIL;
          }
        } else {
          _jpg_buf_len = fb->len;
          _jpg_buf = fb->buf;
        }
      }
    }
    if(res == ESP_OK){
      size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len);
      res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);
    }
    if(res == ESP_OK){
      res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);
    }
    if(res == ESP_OK){
      res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));
    }
    if(fb){
      esp_camera_fb_return(fb);
      fb = NULL;
      _jpg_buf = NULL;
    } else if(_jpg_buf){
      free(_jpg_buf);
      _jpg_buf = NULL;
    }
    if(res != ESP_OK){
      break;
    }
    //Serial.printf("MJPG: %uB\n",(uint32_t)(_jpg_buf_len));
  }
  return res;
}

static esp_err_t on_handler(httpd_req_t *req){
        #define OKon "HTTP/1.1 200 OK, Output On"
        httpd_resp_send(req, OKon, strlen(OKon));
        GpioVarOn();
        }  

static esp_err_t off_handler(httpd_req_t *req){
        #define OKoff "HTTP/1.1 200 OK, Output OFF"
        httpd_resp_send(req, OKoff, strlen(OKoff));
        GpioVarOff();
        }  

static esp_err_t capture_handler(httpd_req_t *req){
    camera_fb_t * fb = NULL;
    esp_err_t res = ESP_OK;
    int64_t fr_start = esp_timer_get_time();

    fb = esp_camera_fb_get();
    if (!fb) {
        Serial.println("------- New message: Camera capture failure -----");
        Serial.println("Camera capture failed");
        Serial.println("");
        httpd_resp_send_500(req);
        return ESP_FAIL;
    }

    httpd_resp_set_type(req, "image/jpeg");
    httpd_resp_set_hdr(req, "Content-Disposition", "inline; filename=capture.jpg");

    size_t out_len, out_width, out_height;
    uint8_t * out_buf;
    bool s;
    {
        size_t fb_len = 0;
        if(fb->format == PIXFORMAT_JPEG){
            fb_len = fb->len;
            res = httpd_resp_send(req, (const char *)fb->buf, fb->len);
        } else {
            jpg_chunking_t jchunk = {req, 0};
            res = frame2jpg_cb(fb, 80, jpg_encode_stream, &jchunk)?ESP_OK:ESP_FAIL;
            httpd_resp_send_chunk(req, NULL, 0);
            fb_len = jchunk.len;
        }
        esp_camera_fb_return(fb);
        int64_t fr_end = esp_timer_get_time();
        Serial.println("------- New message: Camera capture return -----");
        Serial.printf("JPG: %uB %ums\n", (uint32_t)(fb_len), (uint32_t)((fr_end - fr_start)/1000));
        Serial.println("");
        return res;
    }
}

void startCameraServer(){
  httpd_config_t config = HTTPD_DEFAULT_CONFIG();
  config.server_port = 80;

  httpd_uri_t stream_uri = {
    .uri       = "/stream",
    .method    = HTTP_GET,
    .handler   = stream_handler,
    .user_ctx  = NULL
  };

  httpd_uri_t capture_uri = {
    .uri       = "/capture",
    .method    = HTTP_GET,
    .handler   = capture_handler,
    .user_ctx  = NULL
  };

  httpd_uri_t on_uri = {
    .uri       = "/on",
    .method    = HTTP_GET,
    .handler   = on_handler,
    .user_ctx  = NULL
  };

  httpd_uri_t off_uri = {
    .uri       = "/off",
    .method    = HTTP_GET,
    .handler   = off_handler,
    .user_ctx  = NULL
  };

  //Serial.printf("Starting web server on port: '%d'\n", config.server_port);
  if (httpd_start(&stream_httpd, &config) == ESP_OK) {
    httpd_register_uri_handler(stream_httpd, &stream_uri);
    httpd_register_uri_handler(stream_httpd, &on_uri);  //voor LED ON
    httpd_register_uri_handler(stream_httpd, &off_uri); //voor LED OFF
    httpd_register_uri_handler(stream_httpd, &capture_uri); //Still image capture
  }
}

void GpioVarOn() {
   Serial.println("------- New message: GpioVarON -----");
   Serial.println("Output On");   
   Serial.println("");
   digitalWrite(ledPin1, HIGH);
 }

void GpioVarOff() {
   Serial.println("------- New message: GpioVarOFF -----");
   Serial.println("Output Off");   
   Serial.println("");
   digitalWrite(ledPin1, LOW);
 }

void RgbBut(){
   Serial.println("------- New message: RGB Button start -----");
   Serial.println("Start RGB Button Pushed");   
   Serial.println("");
     digitalWrite(ledPin1, HIGH);
     digitalWrite(ledPin2, HIGH);
     digitalWrite(ledPin3, HIGH);
       #if defined(DomoticzHttpJson)
       Serial.println("------- New message: RGB Button HTTP/JSON Command  -----");
       Serial.println("Send HTTP/JSON command to Domoticz for switch controle"); 
       Serial.println("");  
       HTTPClient http;   
       String url="http://" + DomoticzIP + ":" + DomoticzPort + "/json.htm?type=command&param=switchlight&idx=" + DomoticzIDX + "&switchcmd=" + DomoticzSwitch + "";
       http.begin(url);  //Specify destination for HTTP request
       http.addHeader("Content-Type", "text/plain");             
       int httpResponseCode = http.POST("POSTING from ESP32");   
     #elif defined(DomoticzMQTT)
       if (DomoticzSwitch == "On") {
         Serial.println("------- New message: RGB Button MQTT On Command -----");
         Serial.println("Send MQTT command to Domoticz for switch ON");
         Serial.println("");
         strcpy(msgToDomoticZ, msgContact); 
         strcat(msgToDomoticZ, DomoticzIDX);  
         strcat(msgToDomoticZ, msgContactOn);  
         client.publish(topicin, msgToDomoticZ);
       } else {    
         Serial.println("------- New message: RGB Button MQTT Off Command -----");
         Serial.println("Send MQTT command to Domoticz for switch OFF");
         Serial.println("");
         strcpy(msgToDomoticZ, msgContact); 
         strcat(msgToDomoticZ, DomoticzIDX);  
         strcat(msgToDomoticZ, msgContactOff);  
         client.publish(topicin, msgToDomoticZ);
        }
     #endif
     delay(ButtonTimer);
     digitalWrite(ledPin2, LOW);
     digitalWrite(ledPin3, LOW);
     #if defined(DomoticzHttpJson)
       #if defined(DomoticzResetSwitch)
         if (DomoticzSwitch == "On") {
           Serial.println("------- New message: RGB Button HTTP/JSON Command  -----");
           Serial.println("Send HTTP/JSON command to Domoticz for switch OFF");   
           Serial.println("");
           String url="http://" + DomoticzIP + ":" + DomoticzPort + "/json.htm?type=command&param=switchlight&idx=" + DomoticzIDX + "&switchcmd=Off";
           http.begin(url); 
           http.addHeader("Content-Type", "text/plain");            
           int httpResponseCode = http.POST("POSTING from ESP32");  
       } else {
           Serial.println("------- New message: RGB Button HTTP/JSON Command  -----");
           Serial.println("Send HTTP/JSON command to Domoticz for switch ON");   
           Serial.println("");
           String url="http://" + DomoticzIP + ":" + DomoticzPort + "/json.htm?type=command&param=switchlight&idx=" + DomoticzIDX + "&switchcmd=On";
           http.begin(url); 
           http.addHeader("Content-Type", "text/plain");            
           int httpResponseCode = http.POST("POSTING from ESP32");  
       }    
       #endif
      #elif defined(DomoticzMQTT) 
       #if defined(DomoticzResetSwitch)
         if (DomoticzSwitch == "On") {
           Serial.println("------- New message: RGB Button MQTT Off Command -----");
           Serial.println("Send MQTT command to Domoticz switch OFF command");
           Serial.println("");
           strcpy(msgToDomoticZ, msgContact); 
           strcat(msgToDomoticZ, DomoticzIDX);  
           strcat(msgToDomoticZ, msgContactOff);  
           client.publish(topicin, msgToDomoticZ);
         } else {    
           Serial.println("------- New message: RGB Button MQTT On Command -----");
           Serial.println("Send MQTT command to Domoticz switch ON command");
           Serial.println("");
           strcpy(msgToDomoticZ, msgContact); 
           strcat(msgToDomoticZ, DomoticzIDX);  
           strcat(msgToDomoticZ, msgContactOn);  
           client.publish(topicin, msgToDomoticZ);
         }
       #endif 
     #endif
   Serial.println("------- New message: RGB Button end -----");
   Serial.println("End RGB Button Pushed"); 
   Serial.println("");
}

void FlashBut(){
   Serial.println("------- New message: Flash Button start -----");
   Serial.println("Start Flash Button Pushed");   
   Serial.println("");
     #if defined(DomoticzHttpJson)
       Serial.println("------- New message: Flash Button HTTP/JSON Command  -----");
       Serial.println("Send HTTP/JSON command to Domoticz for switch controle");   
       Serial.println("");
       HTTPClient http;   
       String url="http://" + DomoticzIP + ":" + DomoticzPort + "/json.htm?type=command&param=switchlight&idx=" + DomoticzIDX + "&switchcmd=" + DomoticzSwitch + "";
       http.begin(url);  //Specify destination for HTTP request
       http.addHeader("Content-Type", "text/plain");             
       int httpResponseCode = http.POST("POSTING from ESP32");   
     #elif defined(DomoticzMQTT)
       if (DomoticzSwitch == "On") {
         Serial.println("------- New message: Flash Button MQTT On Command  -----");
         Serial.println("Send MQTT command to Domoticz for switch ON");
         Serial.println("");
         strcpy(msgToDomoticZ, msgContact); 
         strcat(msgToDomoticZ, DomoticzIDX);  
         strcat(msgToDomoticZ, msgContactOn);  
         client.publish(topicin, msgToDomoticZ);  
       } else {    
         Serial.println("------- New message: Flash Button MQTT Off Command  -----");
         Serial.println("Send MQTT command to Domoticz for switch OFF");
         Serial.println("");
         strcpy(msgToDomoticZ, msgContact); 
         strcat(msgToDomoticZ, DomoticzIDX);  
         strcat(msgToDomoticZ, msgContactOff);  
         client.publish(topicin, msgToDomoticZ);
        }
     #endif  
      int Flashcount = (ButtonTimer / 1000) * 2;
      for (int i = 0; i <= Flashcount; i++) {
      digitalWrite(ledPin1, LOW);  
      delay(300);
      digitalWrite(ledPin1, HIGH); 
      delay(300);
      }
      #if defined(DomoticzHttpJson)
       #if defined(DomoticzResetSwitch)
         if (DomoticzSwitch == "On") {
           Serial.println("------- New message: Flash Button HTTP/JSON Command  -----");
           Serial.println("Send HTTP/JSON command to Domoticz for switch OFF");   
           Serial.println("");
           String url="http://" + DomoticzIP + ":" + DomoticzPort + "/json.htm?type=command&param=switchlight&idx=" + DomoticzIDX + "&switchcmd=Off";
           http.begin(url); 
           http.addHeader("Content-Type", "text/plain");            
           int httpResponseCode = http.POST("POSTING from ESP32");  
       } else {
           Serial.println("------- New message: Flash Button HTTP/JSON Command  -----");
           Serial.println("Send HTTP/JSON command to Domoticz for switch ON");   
           Serial.println("");
           String url="http://" + DomoticzIP + ":" + DomoticzPort + "/json.htm?type=command&param=switchlight&idx=" + DomoticzIDX + "&switchcmd=On";
           http.begin(url); 
           http.addHeader("Content-Type", "text/plain");            
           int httpResponseCode = http.POST("POSTING from ESP32");  
       }    
       #endif
      #elif defined(DomoticzMQTT) 
       #if defined(DomoticzResetSwitch)
         if (DomoticzSwitch == "On") {
           Serial.println("------- New message: Flash Button MQTT Off Command  -----");
           Serial.println("Send MQTT command to Domoticz switch OFF");
           Serial.println("");
           strcpy(msgToDomoticZ, msgContact); 
           strcat(msgToDomoticZ, DomoticzIDX);  
           strcat(msgToDomoticZ, msgContactOff);  
           client.publish(topicin, msgToDomoticZ);
         } else {    
          Serial.println("------- New message: Flash Button MQTT On Command  -----");
           Serial.println("Send MQTT command to Domoticz switch ON");
           Serial.println("");
           strcpy(msgToDomoticZ, msgContact); 
           strcat(msgToDomoticZ, DomoticzIDX);  
           strcat(msgToDomoticZ, msgContactOn);  
           client.publish(topicin, msgToDomoticZ);
         }
       #endif 
      #endif 
   Serial.println("------- New message: Flash Button end  -----");
   Serial.println("End Flash Button Pushed"); 
   Serial.println("");
}

void startWIFI(void) {
    Serial.println("------- New message: Wifi Disconnect  -----");
    Serial.println("WiFi Disconnected, trying restart connection.");
    Serial.println("");
    WiFi.disconnect();
    delay(5000);
    WiFi.begin(ssid, password);
    
    #if defined(FixedIP)
      IPAddress ip(IPaddr);   
      IPAddress gateway(GatewayAddr);   
      IPAddress subnet(SubnetAddr);   
      WiFi.config(ip, gateway, subnet);
    #endif

    while (WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        delay(500);
        int WaitFlash = 1;
          for (int i = 0; i <= WaitFlash; i++) {
          digitalWrite(ledPin1, HIGH);   // Turn the LED on (Note that LOW is the voltage level
          delay(150);
          digitalWrite(ledPin1, LOW);  // Turn the LED off by making the voltage HIGH
          delay(150);
          WaitFlash = 1;
        }
   
    Serial.println("Trying reconnect WiFi void startWifi");
    Serial.println("");
    delay(300);
    check_wifi = millis() + 30000;

    if (WiFi.status() == WL_CONNECTED) {
        Serial.print(".");
        Serial.println("WiFi reconnected void startWifi");
        delay(500);
    }
    
    }
}

void wififlash(){
  for (int j = 0; j <= repeatflash; j++) {
    int WaitFlash = 1;
    for (int i = 0; i <= WaitFlash; i++) {
      digitalWrite(ledPin1, HIGH);   // Turn the LED on (Note that LOW is the voltage level
      delay(150);
      digitalWrite(ledPin1, LOW);  // Turn the LED off by making the voltage HIGH
      delay(150);
      WaitFlash = 1;
      }
    delay(800);
  }
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP32-Cam-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str(),MQTT_USER,MQTT_PASSWORD)) {
      Serial.println("connected");
      client.subscribe(Subscriber);
    } else {
      for (int i = 0; i <= 4; i++) {
      digitalWrite(ledPin1, HIGH);  
      delay(200);
      digitalWrite(ledPin1, LOW); 
      delay(200);
      }
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void callback(char* topic, byte *payload, unsigned int length) {
    Serial.println("------- new message from broker -------");
    Serial.print("channel:");
    Serial.println(topic);
    Serial.print("data:");  
    Serial.write(payload, length);
    Serial.println("");
    Serial.println("");

    char rawvalue[length];
    for (int i = 0; i < length; i++)
    {
    //Serial.print((char)payload[i]);
    rawvalue[i] = (char)payload[i];
    }

    rawvalue[length]= '\0';
    String svalue = String((char*)rawvalue);
    //Serial.print(svalue);

    if (svalue == "on"){
      Serial.println("------- New message: MQTT On -------");
      Serial.println("Output on by MQTT");
      Serial.println("");
        digitalWrite(ledPin1, HIGH);
    }

    if (svalue == "off"){
      Serial.println("------- New message: MQTT Off -------");
      Serial.println("Output off by MQTT");
      Serial.println("");
        digitalWrite(ledPin1, LOW);
    }
}

void setup() {
  //WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector

  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  
  Serial.begin(115200);
  Serial.setDebugOutput(false);
  Serial.println();
 
  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; 
  
  if(psramFound()){
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_VGA;
    config.jpeg_quality = 12;
    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);
    return;
  }
 
  // Wi-Fi connection
  repeatflash = 0;
  wififlash();
  WiFi.begin(ssid, password);
  
  #if defined(FixedIP)
    IPAddress ip(IPaddr);   
    IPAddress gateway(GatewayAddr);   
    IPAddress subnet(SubnetAddr);   
    WiFi.config(ip, gateway, subnet);
  #endif

  repeatflash = 3;
  wififlash();
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  randomSeed(micros());
  Serial.println("");
  Serial.println("WiFi connected void setup");
  
  Serial.print("Camera Stream Ready! Go to: http://");
  Serial.print(WiFi.localIP());
  Serial.println("");

  #if defined(DomoticzMQTT)
    client.setServer(mqtt_server, mqtt_port);
    client.setCallback(callback);
    reconnect();
  #endif
  
  startCameraServer();
  digitalWrite(ledPin1, HIGH);  
    
}

void loop() {
  buttonState1 = digitalRead(buttonPin1);
  
  if ((WiFi.status() != WL_CONNECTED) && (millis() > check_wifi)) {
    startWIFI();
    return;
  } else {
    if (buttonState1 == LOW) {
      #if defined(RgbButton)
         RgbBut();
      #elif defined(FlashButton)
         FlashBut();
      #endif
    }
  }
  
  #if defined(DomoticzMQTT) 
    if (!client.connected()){
      reconnect();
    } else {
    client.loop();
    }
  #endif
}  

Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

Made a test code. The start is the same as i posted.
But this has the webbrowser enabled to posted the uptime of the ESP.
Instead of trying to reconnect the wifi, it reboots on wifi loss. This will reset the timer.
Just to know how stable it runs

Tommorow i will start running and see how long it runs without issues
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
User avatar
gielie
Posts: 290
Joined: Tuesday 12 January 2016 11:40
Target OS: Raspberry Pi / ODroid
Domoticz version: latest β
Location: The Netherlands (Alkmaar)
Contact:

Re: ESP32-CAM as doorbell with camera

Post by gielie »

I’m following this tread with much interest. I managed to use the code but I have one question?
How do I connect the push button, which pins? In the code I see pin 12? And the other ones?
I don’t have a button yet but I’d like to simulate the push.
- Aeon Labs USB Stick met Z-wave plus
- Aeotec MultiSensor 6
- FIBARO FGS223
- FIBARO FGWPE Wall Plug
- Neo CoolCam Power plug
- Popp Smoke Detector
- Toon
- Kodi Media Server
User avatar
jvdz
Posts: 2328
Joined: Tuesday 30 December 2014 19:25
Target OS: Raspberry Pi / ODroid
Domoticz version: 4.107
Location: Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by jvdz »

gielie wrote: Wednesday 20 May 2020 10:32 How do I connect the push button, which pins? In the code I see pin 12? And the other ones?
I don’t have a button yet but I’d like to simulate the push.
I assume that you need to connect it to ground (Low) to trigger as the pin 12 is defined with Pullup (High).

Jos
New Garbage collection scripts: https://github.com/jvanderzande/GarbageCalendar
User avatar
gielie
Posts: 290
Joined: Tuesday 12 January 2016 11:40
Target OS: Raspberry Pi / ODroid
Domoticz version: latest β
Location: The Netherlands (Alkmaar)
Contact:

Re: ESP32-CAM as doorbell with camera

Post by gielie »

jvdz wrote: Wednesday 20 May 2020 11:37
gielie wrote: Wednesday 20 May 2020 10:32 How do I connect the push button, which pins? In the code I see pin 12? And the other ones?
I don’t have a button yet but I’d like to simulate the push.
I assume that you need to connect it to ground (Low) to trigger as the pin 12 is defined with Pullup (High).

Jos
Yes, this is what I was looking for. It works great.
Is there a way to include the webcam server page to adjust camera settings and resolution?
Now I must wait on my doorbell button from China.
- Aeon Labs USB Stick met Z-wave plus
- Aeotec MultiSensor 6
- FIBARO FGS223
- FIBARO FGWPE Wall Plug
- Neo CoolCam Power plug
- Popp Smoke Detector
- Toon
- Kodi Media Server
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

gielie wrote: Thursday 21 May 2020 12:55 Is there a way to include the webcam server page to adjust camera settings and resolution?
For now, the quick answer is no. Maybe in the future
But, the resolution is in the code, you can change it by replacing the resolution description.

But just you noticed. I choosed these resolution and not bigger, because it takes to much memory from the esp. Going with bigger resolutions will give wifi drops. Also pushing the doorbell button doesn't work propperly, the esp freezes because it is busy making the large image.


Search for this code. The FRAMESIZE makes the resolution size

Code: Select all

if(psramFound()){ config.frame_size = FRAMESIZE_SVGA; config.jpeg_quality = 10; config.fb_count = 2; } else { config.frame_size = FRAMESIZE_VGA; config.jpeg_quality = 12; config.fb_count = 1; }
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

Are there people with electronics know how?
I want to convert 8vac to 5vdc. A lot of information can be found, but i am looking for a small solutions, that it can fit inside the housing. But the capacitors make it big.

Looking for help with this, wo can help me?
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
User avatar
jvdz
Posts: 2328
Joined: Tuesday 30 December 2014 19:25
Target OS: Raspberry Pi / ODroid
Domoticz version: 4.107
Location: Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by jvdz »

hoeby wrote: Thursday 21 May 2020 15:13 Are there people with electronics know how?
Done MTS Electronics 42 years ago.... does that still count? :roll:
hoeby wrote: Thursday 21 May 2020 15:13 I want to convert 8vac to 5vdc. A lot of information can be found, but i am looking for a small solutions, that it can fit inside the housing. But the capacitors make it big.
Just so I understand: Why do you need to bring the 8v ac to your DoorBelCamera and convert it there?
Couldn't you simply transform the 8V ac to 5v dc earlier and only bring that to your ESP?

Jos
New Garbage collection scripts: https://github.com/jvanderzande/GarbageCalendar
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

jvdz wrote: Thursday 21 May 2020 17:08Couldn't you simply transform the 8V ac to 5v dc earlier and only bring that to your ESP?
That is also possible.
The thoughed was to have 1 device which needs to replaced by this doorbell. And not replacing it with 2 components.
But thinking about it, it is an DIY project and that could be a reason that the there is a little more head breaking necessary.
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
User avatar
jvdz
Posts: 2328
Joined: Tuesday 30 December 2014 19:25
Target OS: Raspberry Pi / ODroid
Domoticz version: 4.107
Location: Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by jvdz »

hoeby wrote: Thursday 21 May 2020 23:19 The thoughed was to have 1 device which needs to replaced by this doorbell. And not replacing it with 2 components.
How would that be possible without a battery in the device, as the current switch only gets one of the 2 power leads directly as the other comes through the bell. This means that you have 8 v on the switch leads until you press the button and short-circuit them to make the bell ring?
New Garbage collection scripts: https://github.com/jvanderzande/GarbageCalendar
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

Your right about that.
The thoughed was to have everything together, when looking to the hardware. Not de powersupply indoor and the doorbell outdoor.
But the easiest way is to go for a separed power supply indoor.

Today i made a new housing an 3D printed it.
The housing is made for a 160 degree camera lens and a 16mm button (max length 20mm).
I test printed one and put the parts in it. Worked without issues.
Need to make a backside, that it is also closed when mounted.

Made a thingiverse code, but as a new user it is not allowerd to update drawings the first 24 hours.
After that, the download is open.

When i received the 120 degree camera lens. I modify the housing to fit that.
The size and look for the 120 degree lens will be the same. But the 120 degree lens is longer, therefor the mounting position of the ESP will be different.

Links of hardware that is used untill now:
The ESP32-cam with 160 degree lens:
https://www.aliexpress.com/item/4000589 ... 4c4dTfkQ0i

Button blank version:
https://www.aliexpress.com/item/3268623 ... 4c4dc58F8M

Button black version:
https://www.aliexpress.com/item/3268561 ... 4c4dTfkQ0i

When going for a different button. Advice to search for one, where the push button sticks out of the housing. This way it is easier to push the button. When it is flush, a 16mm button is small the get i pushed with your fingers.

The new housing with the black button installed
Little changes where made. Like to rond tubes where the mounting screws go through. So the screws can't damage the cables.
Position from camera to esp was not correctly line-out. This is corrected.
Mounting holes for screws esp are more close to the esp, easier to mount.

the 4 small rounds are undernead the ESP. This is for mounting a PCB, which is optional if someone want to experiment something.
Image

The ESP installed with the 160degree lens
Sorry, the housing is made that the headers will be gone and the cables will be directly soldered to the ESP. This to minimize space
Image

The front side. Don't look how its finish is. This is becauase of my hobby printer and offset on the first layers
Image

The finished layer placed. This also covers the mounting holes
Image
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
hoeby
Posts: 531
Joined: Saturday 02 June 2018 11:05
Target OS: Raspberry Pi / ODroid
Domoticz version: V2022.1
Location: Echt, Netherlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by hoeby »

The drawing is online

What can you download:
.stl file with all products in it.
.stl file with only the front part.
.stl file with only main part.
.stl file with only back part.

So be carefull if you send the drawings to an online 3D service.
Because when you send them all, you have 2 printed housings.

The link for 3D files
https://www.thingiverse.com/thing:4385496

What drawing needs to be made:
- Make angled wedges, so you can direct the doorbell to what you want to view
Thin-client --> Docker Domoticz main environment
Pi3A+ --> Google home (GAssistPi)
Pi3B+ --> Docker (P1monitor, Domoticz test environment, Ubiquity controller)
snellejellep
Posts: 241
Joined: Tuesday 16 May 2017 13:05
Target OS: Raspberry Pi / ODroid
Domoticz version: 2020.2
Location: The Neterlands
Contact:

Re: ESP32-CAM as doorbell with camera

Post by snellejellep »

hi, this project is really awesome

i just tried to upload your code using arduino ide to my esp32 camera but i get the following error, how do i resolve this?

Code: Select all

Build options changed, rebuilding all
sketch_may23a:1:24: error: esp_camera.h: No such file or directory

 #include "esp_camera.h"

                        ^

compilation terminated.

exit status 1
esp_camera.h: No such file or directory
i searched for a library called esp_camera but it does not exist
raspberry pi | xiaomi vacuum | yeelight | philips hue | zwave | ubiquiti unifi | harmony | sonoff | zigbee2mqtt | https://www.youtube.com/channel/UC2Zidl ... m1OLuNldfQ
User avatar
gielie
Posts: 290
Joined: Tuesday 12 January 2016 11:40
Target OS: Raspberry Pi / ODroid
Domoticz version: latest β
Location: The Netherlands (Alkmaar)
Contact:

Re: ESP32-CAM as doorbell with camera

Post by gielie »

snellejellep wrote: Saturday 23 May 2020 19:21 hi, this project is really awesome

i just tried to upload your code using arduino ide to my esp32 camera but i get the following error, how do i resolve this?

Code: Select all

Build options changed, rebuilding all
sketch_may23a:1:24: error: esp_camera.h: No such file or directory

 #include "esp_camera.h"

                        ^

compilation terminated.

exit status 1
esp_camera.h: No such file or directory
i searched for a library called esp_camera but it does not exist
You have to install the esp32 Addons via tools -> board-> boards manager and search for esp32 and install

Try again.
- Aeon Labs USB Stick met Z-wave plus
- Aeotec MultiSensor 6
- FIBARO FGS223
- FIBARO FGWPE Wall Plug
- Neo CoolCam Power plug
- Popp Smoke Detector
- Toon
- Kodi Media Server
Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest