ESP Cam Stromverbrauch zu groß

Hallo,

wenn meine Schaltung eingeschaltet wird, dann benötigt sie 80mA. Wenn ich ein Foto gemacht habe steigt es auf 400mA und geht dann wieder auf 200mA runter, aber leider nicht mehr auf 80...

Die OV5640 wird dabei dann auch heiß und da es eine akkubetriebene Anwendung ist, ist das nicht gut.

Ein esp_camera_deinit() oder ESP Restart bringt da leider auch nichts.

Also die Frage: wie kann ich nach einem Bild die Stromaufnahme wieder verringern?

Ich habe dieses Tutorial gemacht:

und das ist der Code:



//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ESP32_CAM_Send_Photo_to_Server
//======================================== Including the libraries.
#include <WiFi.h>
#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"
#include "esp_camera.h"
//========================================

//======================================== CAMERA_MODEL_AI_THINKER GPIO.
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27

#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
//========================================

// LED Flash PIN (GPIO 4)
#define FLASH_LED_PIN 4
#define Ausloser 13
#define blitzschalter 14
#define Blitzindikator 12
#define bereitschaftsindikator 15
#define Bilder_alle_X_sekunden 5
//======================================== Insert your network credentials.
const char* ssid = "xxxx";
const char* password = "xxxxxxx";
//========================================

//======================================== Variables for Timer/Millis.
unsigned long previousMillis = 0;
const int Interval = Bilder_alle_X_sekunden * 1000;  //--> Photo capture every 20 seconds.
//========================================

// Server Address or Server IP.
String serverName = "192.168.178.22";  //--> Change with your server computer's IP address or your Domain name.
// The file path "upload_img.php" on the server folder.
String serverPath = "/ESP32CAM/upload_img.php";
// Server Port.
const int serverPort = 80;

// Variable to set capture photo with LED Flash.
// Set to "false", then the Flash LED will not light up when capturing a photo.
// Set to "true", then the Flash LED lights up when capturing a photo.
bool LED_Flash_ON = false;
bool Kamera_bereit = true;

// Initialize WiFiClient.
WiFiClient client;

//________________________________________________________________________________ sendPhotoToServer()
void sendPhotoToServer() {

  //---------------------------------------- Set the camera ESP32 CAM.
  Serial.println();
  Serial.print("Set the camera ESP32 CAM...");

  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_QSXGA;
    config.jpeg_quality = 10;  //--> 0-63 lower number means higher quality
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 8;  //--> 0-63 lower number means higher quality
    config.fb_count = 1;
  }


  // camera init
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    Serial.println();
    Serial.println("Restarting the ESP32 CAM.");
    delay(1000);
    ESP.restart();
  }

  sensor_t* s = esp_camera_sensor_get();

  // Selectable camera resolution details :
  // -QSXGA  = 2560 x 1920 pixels
  // -UXGA   = 1600 x 1200 pixels
  // -SXGA   = 1280 x 1024 pixels
  // -XGA    = 1024 x 768  pixels
  // -SVGA   = 800 x 600   pixels
  // -VGA    = 640 x 480   pixels
  // -CIF    = 352 x 288   pixels
  // -QVGA   = 320 x 240   pixels
  // -HQVGA  = 240 x 160   pixels
  // -QQVGA  = 160 x 120   pixels
  s->set_framesize(s, FRAMESIZE_QSXGA);  //--> UXGA|SXGA|XGA|SVGA|VGA|CIF|QVGA|HQVGA|QQVGA

  Serial.println();
  Serial.println("Set camera ESP32 CAM successfully.");
  //----------------------------------------
  String AllData;
  String DataBody;

  Serial.println();
  Serial.println("-----------");

  //---------------------------------------- Pre capture for accurate timing.
  Serial.println("Taking a photo...");

  if (LED_Flash_ON == true) {
    digitalWrite(FLASH_LED_PIN, HIGH);
    delay(100);
  }

  for (int i = 0; i <= 3; i++) {
    camera_fb_t* fb = NULL;
    fb = esp_camera_fb_get();
    if (!fb) {
      Serial.println("Camera capture failed");
      Serial.println("Restarting the ESP32 CAM.");
      delay(1000);
      ESP.restart();
      return;
    }
    esp_camera_fb_return(fb);
    delay(200);
  }

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

  if (LED_Flash_ON == true) digitalWrite(FLASH_LED_PIN, LOW);

  Serial.println("Taking a photo was successful.");
  //----------------------------------------

  Serial.println("Connecting to server: " + serverName);

  if (client.connect(serverName.c_str(), serverPort)) {
    Serial.println("Connection successful!");

    String post_data = "--dataMarker\r\nContent-Disposition: form-data; name=\"imageFile\"; filename=\"ESP32CAMCap.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n";
    String head = post_data;
    String boundary = "\r\n--dataMarker--\r\n";

    uint32_t imageLen = fb->len;
    uint32_t dataLen = head.length() + boundary.length();
    uint32_t totalLen = imageLen + dataLen;

    client.println("POST " + serverPath + " HTTP/1.1");
    client.println("Host: " + serverName);
    client.println("Content-Length: " + String(totalLen));
    client.println("Content-Type: multipart/form-data; boundary=dataMarker");
    client.println();
    client.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.write(fbBuf, 1024);
        fbBuf += 1024;
      } else if (fbLen % 1024 > 0) {
        size_t remainder = fbLen % 1024;
        client.write(fbBuf, remainder);
      }
    }
    client.print(boundary);

    esp_camera_fb_return(fb);

    int timoutTimer = 10000;
    long startTimer = millis();
    boolean state = false;
    Serial.println("Response : ");
    while ((startTimer + timoutTimer) > millis()) {
      Serial.print(".");
      delay(200);

      // Skip HTTP headers
      while (client.available()) {
        char c = client.read();
        if (c == '\n') {
          if (AllData.length() == 0) { state = true; }
          AllData = "";
        } else if (c != '\r') {
          AllData += String(c);
        }
        if (state == true) { DataBody += String(c); }
        startTimer = millis();
      }
      if (DataBody.length() > 0) { break; }
    }
    client.stop();
    Serial.println(DataBody);
    Serial.println("-----------");
    Serial.println();

  } else {
    client.stop();
    DataBody = "Connection to " + serverName + " failed.";
    Serial.println(DataBody);
    Serial.println("-----------");
  }

  Serial.println(esp_camera_deinit());
  digitalWrite(PWDN_GPIO_NUM, HIGH);
  Kamera_bereit = true;
  ESP.restart();
  digitalWrite(bereitschaftsindikator, HIGH);
}
//________________________________________________________________________________

//________________________________________________________________________________ VOID SETUP()
void setup() {
  // put your setup code here, to run once:

  // Disable brownout detector.
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);

  Serial.begin(115200);
  Serial.println();

  pinMode(FLASH_LED_PIN, OUTPUT);
  pinMode(Ausloser, INPUT_PULLUP);
  pinMode(blitzschalter, INPUT_PULLUP);
  pinMode(Blitzindikator, OUTPUT);
  pinMode(bereitschaftsindikator, OUTPUT);
  pinMode(PWDN_GPIO_NUM, OUTPUT);
  digitalWrite(PWDN_GPIO_NUM, HIGH);
  // Setting the ESP32 WiFi to station mode.
  WiFi.mode(WIFI_STA);
  Serial.println();

  //---------------------------------------- The process of connecting ESP32 CAM with WiFi Hotspot / WiFi Router.
  Serial.println();
  Serial.print("Connecting to : ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);

  // The process timeout of connecting ESP32 CAM with WiFi Hotspot / WiFi Router is 20 seconds.
  // If within 20 seconds the ESP32 CAM has not been successfully connected to WiFi, the ESP32 CAM will restart.
  // I made this condition because on my ESP32-CAM, there are times when it seems like it can't connect to WiFi, so it needs to be restarted to be able to connect to WiFi.
  int connecting_process_timed_out = 20;  //--> 20 = 20 seconds.
  connecting_process_timed_out = connecting_process_timed_out * 2;
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
    if (connecting_process_timed_out > 0) connecting_process_timed_out--;
    if (connecting_process_timed_out == 0) {
      Serial.println();
      Serial.print("Failed to connect to ");
      Serial.println(ssid);
      Serial.println("Restarting the ESP32 CAM.");
      delay(1000);
      ESP.restart();
    }
  }

  Serial.println();
  Serial.print("Successfully connected to ");
  Serial.println(ssid);
  //Serial.print("ESP32-CAM IP Address: ");
  //Serial.println(WiFi.localIP());
  //----------------------------------------
  digitalWrite(bereitschaftsindikator, HIGH);

  Serial.println(digitalRead(PWDN_GPIO_NUM));
}
//________________________________________________________________________________

//________________________________________________________________________________ VOID LOOP()
void loop() {
  // put your main code here, to run repeatedly:

  //---------------------------------------- Timer/Millis to capture and send photos to server every 20 seconds (see Interval variable).
  unsigned long currentMillis = millis();

  if (Kamera_bereit == true && digitalRead(Ausloser) == LOW) {
    previousMillis = currentMillis;
    Kamera_bereit = false;
    digitalWrite(bereitschaftsindikator, LOW);
    sendPhotoToServer();
  }
  if (digitalRead(blitzschalter) == LOW) {
    delay(500);
    LED_Flash_ON = !LED_Flash_ON;
    digitalWrite(Blitzindikator, LED_Flash_ON);
  }


  //----------------------------------------
}
//________________________________________________________________________________
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Dir ist bekannt, dass 20 mA kleiner als 80 mA ist?

Gruß Tommy

???

oh, 200mA

Der Stromverbrauch einer ESP32-CAM, wenn sie mit dem Internet verbunden ist, liegt normalerweise zwischen 160 mA und 250 mA im aktiven Modus. Vielleicht sollte man das WLAN ausschalten, wenn man es nicht braucht?

Was heißt "heiß" ?
Bei meiner ESP32 Cam sind das 42 - 46 Grad Celsius.
Und das ist der Spannungsregler auf dem Board. Auch das ist normal.

Ja, das sie so warm ist, ist denke ich nicht das grundsätzliche Problem, sondern dass sie nicht in den Standby geht und deswegen warm bleibt.

vor dem ersten Bild ist die Kamera im WLAN, da sind noch nur die 80mA.

Was ist nach dem ersten Bild machen anders, als davor, obwohl ich einen ESP Restart mache?

Der Modem-Sleep-Modus wird aktiviert, wenn sich der ESP8266 im Station-Modus mit dem Router verbindet und die Verbindung über den DTIM-Beacon-Mechanismus aufrechterhält. In diesem Modus sind alle Komponenten aktiv, außer den Funkmodulen.

Um die Verbindung aufrechtzuerhalten, werden Wi-Fi, Bluetooth und das Funkmodul in regelmäßigen Abständen, die als "Association Sleep Pattern" bezeichnet werden, periodisch aktiviert. Der ESP32 wechselt zwischen dem aktiven Modus und dem Modem-Sleep-Modus und verbindet sich über DTIM-Beacons mit dem Router. Das Wi-Fi-Modul wird zwischen den DTIM-Intervallen deaktiviert und kurz vor dem nächsten Beacon wieder aktiviert, was zur Energieeinsparung beiträgt. Die Schlafdauer hängt vom DTIM-Intervall des Routers ab, das normalerweise zwischen 100 ms und 1000 ms liegt.

Ich glaube jedoch, dass der Energiesparmodus deaktiviert wird, sobald eine Verbindung gezwungen wird, und das Modem nicht mehr in den Schlafmodus geht, was erklären würde, warum Sie einen Anstieg des Stromverbrauchs sehen.

Weitere Informationen zu den Schlafmodi finden Sie hier

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.