raphaelbs / esp32-cam-ai-thinker

Informations and examples about A.I. Thinker ESP32-CAM using ESP-IDF
Apache License 2.0
483 stars 100 forks source link

Adaptando para motion detect #33

Open eldimar opened 4 years ago

eldimar commented 4 years ago

Ola pessoal... atualmente eu estou utilizando esse código pra envio de foto capturada pelo telegram...ele tira uma foto baseado em um intervalo de tempo...porem queria adaptar pra tirar uma foto via detecção.

/ ESP32-CAM save a captured photo to Telegram Author : ChungYi Fu (Kaohsiung, Taiwan) 2020-1-18 19:00 https://www.facebook.com/francefu /

// Enter your WiFi ssid and password const char ssid = "XXXXX"; //your network SSID const char password = "XXXXXX"; //your network password

String token = "XXXXXXXXXXXXXXX"; // Create your bot and get the token -> https://telegram.me/fatherbot String chat_id = "XXXXXXX"; // Get chat_id -> https://telegram.me/userinfobot

include

include

include "soc/soc.h"

include "soc/rtc_cntl_reg.h"

include "esp_camera.h"

// WARNING!!! Make sure that you have either selected ESP32 Wrover Module, // or another board which has PSRAM enabled

//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

void setup() { WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);

Serial.begin(115200); delay(10);

WiFi.mode(WIFI_STA);

Serial.println(""); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password);

long int StartTime=millis(); while (WiFi.status() != WL_CONNECTED) { delay(500); if ((StartTime+10000) < millis()) break; }

Serial.println(""); Serial.println("STAIP address: "); Serial.println(WiFi.localIP());

Serial.println("");

if (WiFi.status() != WL_CONNECTED) { Serial.println("Reset");

ledcAttachPin(4, 3);
ledcSetup(3, 5000, 8);
ledcWrite(3,10);
delay(200);
ledcWrite(3,0);
delay(200);    
ledcDetachPin(3);

delay(1000);
ESP.restart();

} else { ledcAttachPin(4, 3); ledcSetup(3, 5000, 8); for (int i=0;i<5;i++) { ledcWrite(3,10); delay(200); ledcWrite(3,0); delay(200);
} ledcDetachPin(3);
}

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 = 10; //0-63 lower number means higher quality config.fb_count = 2; } else { config.frame_size = FRAMESIZE_SVGA; config.jpeg_quality = 12; //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); delay(1000); ESP.restart(); }

//drop down frame size for higher initial frame rate sensor_t * s = esp_camera_sensor_get(); s->set_framesize(s, FRAMESIZE_CIF); // UXGA|SXGA|XGA|SVGA|VGA|CIF|QVGA|HQVGA|QQVGA }

void loop() { sendCapturedImage2Telegram(token, chat_id); delay(72000); }

String sendCapturedImage2Telegram(String token, String chat_id) { const char* myDomain = "149.154.167.220"; String getAll="", getBody = "";

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

Serial.println("Connect to " + String(myDomain)); WiFiClientSecure client_tcp;

if (client_tcp.connect(myDomain, 443)) { Serial.println("Connection successful");

String head = "--Taiwan\r\nContent-Disposition: form-data; name=\"chat_id\"; \r\n\r\n" + chat_id + "\r\n--Taiwan\r\nContent-Disposition: form-data; name=\"photo\"; filename=\"esp32-cam.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n";
String tail = "\r\n--Taiwan--\r\n";

uint16_t imageLen = fb->len;
uint16_t extraLen = head.length() + tail.length();
uint16_t totalLen = imageLen + extraLen;

client_tcp.println("POST /bot"+token+"/sendPhoto HTTP/1.1");
client_tcp.println("Host: " + String(myDomain));
client_tcp.println("Content-Length: " + String(totalLen));
client_tcp.println("Content-Type: multipart/form-data; boundary=Taiwan");
client_tcp.println();
client_tcp.print(head);

uint8_t *fbBuf = fb->buf;
size_t fbLen = fb->len;
for (size_t n=0;n<fbLen;n=n+1024) {
  if (n+1024<fbLen) {
    client_tcp.write(fbBuf, 1024);
    fbBuf += 1024;
  }
  else if (fbLen%1024>0) {
    size_t remainder = fbLen%1024;
    client_tcp.write(fbBuf, remainder);
  }
}  

client_tcp.print(tail);

esp_camera_fb_return(fb);

int waitTime = 10000;   // timeout 10 seconds
long startTime = millis();
boolean state = false;

while ((startTime + waitTime) > millis())
{
  Serial.print(".");
  delay(100);      
  while (client_tcp.available()) 
  {
      char c = client_tcp.read();
      if (c == '\n') 
      {
        if (getAll.length()==0) state=true; 
        getAll = "";
      } 
      else if (c != '\r')
        getAll += String(c);
      if (state==true) getBody += String(c);
      startTime = millis();
   }
   if (getBody.length()>0) break;
}
client_tcp.stop();
Serial.println(getBody);

} else { getBody="Connected to api.telegram.org failed."; Serial.println("Connected to api.telegram.org failed."); }

return getBody; }

raphaelbs commented 4 years ago

Olá @eldimar

Você chegou a testar o exemplo change detection?