Re: ESP32-CAM as doorbell with camera
Posted: Sunday 26 July 2020 10:32
Open source Home Automation System
https://forum.domoticz.com/
Code: Select all
sensor_t * s = esp_camera_sensor_get();
s->set_brightness(s, 0); // -2 to 2
s->set_contrast(s, 0); // -2 to 2
// s->set_saturation(s, 0); // -2 to 2
// s->set_special_effect(s, 0); // 0 to 6 (0 - No Effect, 1 - Negative, 2 - Grayscale, 3 - Red Tint, 4 - Green Tint, 5 - Blue Tint, 6 - Sepia)
// s->set_whitebal(s, 1); // 0 = disable , 1 = enable
// s->set_awb_gain(s, 1); // 0 = disable , 1 = enable
Code: Select all
// ESP32Cam Doorbell releases
// V1.1.1 (04-05-2020) - BETA - Start of code
// V1.1.2 (17-05-2020) - First release
// V1.2.1 (26-07-2020) - BETA - OV2640 camera options added
#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¶m=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¶m=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¶m=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¶m=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¶m=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¶m=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;
}
sensor_t * s = esp_camera_sensor_get();
s->set_brightness(s, 0); // -2 to 2
s->set_contrast(s, 0); // -2 to 2
// s->set_saturation(s, 0); // -2 to 2
// s->set_special_effect(s, 0); // 0 to 6 (0 - No Effect, 1 - Negative, 2 - Grayscale, 3 - Red Tint, 4 - Green Tint, 5 - Blue Tint, 6 - Sepia)
// s->set_whitebal(s, 1); // 0 = disable , 1 = enable
// s->set_awb_gain(s, 1); // 0 = disable , 1 = enable
// s->set_wb_mode(s, 0); // 0 to 4 - if awb_gain enabled (0 - Auto, 1 - Sunny, 2 - Cloudy, 3 - Office, 4 - Home)
// s->set_exposure_ctrl(s, 1); // 0 = disable , 1 = enable
// s->set_aec2(s, 0); // 0 = disable , 1 = enable
// s->set_ae_level(s, 0); // -2 to 2
// s->set_aec_value(s, 300); // 0 to 1200
// s->set_gain_ctrl(s, 1); // 0 = disable , 1 = enable
// s->set_agc_gain(s, 0); // 0 to 30
// s->set_gainceiling(s, (gainceiling_t)0); // 0 to 6
// s->set_bpc(s, 0); // 0 = disable , 1 = enable
// s->set_wpc(s, 1); // 0 = disable , 1 = enable
// s->set_raw_gma(s, 1); // 0 = disable , 1 = enable
// s->set_lenc(s, 1); // 0 = disable , 1 = enable
// s->set_hmirror(s, 0); // 0 = disable , 1 = enable
// s->set_vflip(s, 0); // 0 = disable , 1 = enable
// s->set_dcw(s, 1); // 0 = disable , 1 = enable
// s->set_colorbar(s, 0); // 0 = disable , 1 = enable
// 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
}
No sorry, this is something for version 2, where i want to use more the web interface to setup things. That is also not something which is added in an evening. The V2 is only on paper what there needs to be changed to V1, i didn't start with it. Don't expect it soon
You can use the commands:
thanks, unfortunately this doesn't work for me i also linked the esp32cam to motioneye.hoeby wrote: ↑Friday 31 July 2020 21:46You can use the commands:
http://IP/on = switch ledPin1 on
http://IP/off = switch ledPin1 off
Code: Select all
#include <ESP8266HTTPClient.h>
Code: Select all
if (text == "/lighton") {
HTTPClient http;
String url="http://192.168.XXX.XXX:8080/json.htm?type=command¶m=switchlight&idx=24&switchcmd=On";
http.begin(url);
http.addHeader("Content-Type", "text/plain");
int httpResponseCode = http.POST("POSTING from ESP8266-telegram");
}
Code: Select all
return {
on = {
customEvents = { 'myCustomEvent',},
--devices = {'Trigger device'}, -- De switch die dit scripts triggerd
httpResponses = { "Telegram_Callback"} -- Niet aanpassen
},
--[[
Custom event trigger json:
192.168.XXX.XXX:8080/json.htm?type=command¶m=customevent&event=myCustomEvent&data=myData
]]--
execute = function(dz, item)
local teleTok = 'xxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -- Jouw telegram token
local chatId = 'xxxxxxxxx' -- Jouw telegram ChatId
local tekstpost = 'Kies een optie.' -- De tekst voor het telegram tekst bericht
local tekstremove = 'KeuzeMenuWeg'
local disable_notify = 'true' -- Als het telegram bericht geen geluid mag maken, dan 'true'
-- Anders op 'false' zetten
local KeuzeMenuWeg = 30 -- Aantal seconden, waarna het keuzemenu verwijdert dient te worden.
debug = false -- Als debug nodig is, deze op true zetten, anders false
if item.isHTTPResponse then
if (item.ok) then
local id_message = item.json.result.message_id
if debug then
print (id_message)
end
os.execute('curl -s -X POST "https://api.telegram.org/bot'..teleTok..'/deleteMessage?chat_id='..chatId..'&message_id='..id_message..'"')
else
if debug then
print ('niet goed')
end
end
else
local myurl1 = 'https://api.telegram.org/bot'..teleTok..'/sendMessage?chat_id='..chatId..'&text='..tekstpost..'&reply_markup={"keyboard":[["Yes"],["No"]],"one_time_keyboard":true,"resize_keyboard":true}'
if debug then
print (myurl1)
end
dz.openURL(
{
url = myurl1,
method = "POST",
})
local myurl2 = 'https://api.telegram.org/bot'..teleTok..'/sendMessage?chat_id='..chatId..'&text='..tekstremove..'&reply_markup={"remove_keyboard":true}&disable_notification='..disable_notify..''
if debug then
print (myurl2)
end
dz.openURL(
{
url = myurl2,
method = "GET",
callback = "Telegram_Callback",
}).afterSec(KeuzeMenuWeg)
end
end
}