2
respostas

Erro ESP32 Arduino IDE: E (2559) ledc: ledc_get_duty(740): LEDC is not initialized

Estou fazendo um projeto simples no esp32 cam de 16 pinos, sendo o GPIO 4 o do flash nativo, a ideia dele é tirar fotos a cada tanto tempo e enviar ao google drive. Através de um script do google scripts que conecta os esp e o google drive. código do script do google

E o código que está dando erro seguinte:

E (2559) ledc: ledc_get_duty(740): LEDC is not initialized
Connect to script.google.com
Connected to script.google.com failed.
Connect to script.google.com
Connection successful

Código:

// Enter your WiFi ssid and password
const char* ssid = "d BRASIL VIVO";
const char* password = "020802";

String myScript =  "AKfycbEFO2QTxUAE8Dvp9JGYQmxLc8jSB4hpiICNlAeHcBb_4WblU8yk3RqA";    //Create your Google Apps Script and replace the "myScript" path.
String myLineNotifyToken = "";     //Line Notify Token. You can set the value of xxxxxxxxxx empty if you don't want to send picture to Linenotify.
String myFoldername = "&myFoldername=ESP32-CAM";
String myFilename = "&myFilename=ESP32-CAM.jpg";
String myImage = "&myFile=";

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"
#include "Base64.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()
{
2 respostas

Restante do código:

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_VGA);  // UXGA|SXGA|XGA|SVGA|VGA|CIF|QVGA|HQVGA|QQVGA
}

void loop()
{
 SendCapturedImage();
 delay(60000);
}

String SendCapturedImage() {
 const char* myDomain = "script.google.com";
 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;
 client_tcp.setInsecure();   //run version 1.0.5 or above
 
 if (client_tcp.connect(myDomain, 443)) {
   Serial.println("Connection successful");
   
   char *input = (char *)fb->buf;
   char output[base64_enc_len(3)];
   String imageFile = "data:image/jpeg;base64,";
   for (int i=0;i<fb->len;i++) {
     base64_encode(output, (input++), 3);
     if (i%3==0) imageFile += urlencode(String(output));
   }
   String Data = myLineNotifyToken+myFoldername+myFilename+myImage;
   
   client_tcp.println("POST " + myScript + " HTTP/1.1");
   client_tcp.println("Host: " + String(myDomain));
   client_tcp.println("Content-Length: " + String(Data.length()+imageFile.length()));
   client_tcp.println("Content-Type: application/x-www-form-urlencoded");
   client_tcp.println("Connection: keep-alive");
   client_tcp.println();
   
   client_tcp.print(Data);
   int Index;
   for (Index = 0; Index < imageFile.length(); Index = Index+1000) {
     client_tcp.print(imageFile.substring(Index, Index+1000));
   }
   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 (state==true) getBody += String(c);        
         if (c == '\n') 
         {
           if (getAll.length()==0) state=true; 
           getAll = "";
         } 
         else if (c != '\r')
           getAll += String(c);
         startTime = millis();
      }
      if (getBody.length()>0) break;
   }
   client_tcp.stop();
   Serial.println(getBody);
 }
 else {
   getBody="Connected to " + String(myDomain) + " failed.";
   Serial.println("Connected to " + String(myDomain) + " failed.");
 }
 
 return getBody;
}

Olá Mateus! Como vai?

O erro parece estar localizado na inicialização do canal LEDC utilizado para controlar recursos como PWM (Modulação por Largura de Pulso) no ESP32. Esse erro geralmente ocorre quando tentamos configurar ou acessar um canal LEDC que não foi devidamente inicializado.

No seu código, você não mostrou a parte onde o LEDC é configurado, mas o erro indica que em algum ponto, você está tentando obter o valor do duty cycle de um canal LEDC sem antes inicializá-lo corretamente.

Aqui está o que você deve verificar e fazer:

  1. Certifique-se de que você está chamando a função ledcSetup para configurar o canal LEDC com a frequência e resolução desejadas antes de usar qualquer outra função LEDC, como ledcWrite ou ledcRead.

  2. Verifique se você está chamando a função ledcAttachPin para associar um GPIO ao canal LEDC configurado.

  3. Confirme se o GPIO que você está usando (no caso, o GPIO 4 para o flash) é compatível com as funcionalidades do LEDC no ESP32.

Aqui está um exemplo de como você poderia inicializar o LEDC para um GPIO no ESP32:

#define LEDC_CHANNEL 0
#define LEDC_TIMER   LEDC_TIMER_0
#define LEDC_PIN     4 // O pino que você está usando para o flash
#define LEDC_FREQ    5000 // Frequência em Hz
#define LEDC_RES     8 // Resolução em bits

void setup() {
  // Configuração do LEDC
  ledcSetup(LEDC_CHANNEL, LEDC_FREQ, LEDC_RES);
  ledcAttachPin(LEDC_PIN, LEDC_CHANNEL);
  // ...
}

Certifique-se de que essas etapas estão sendo seguidas no seu código antes de tentar controlar o flash ou ler o duty cycle do canal LEDC.

Quanto ao script do Google Apps Script que você compartilhou, ele parece estar correto e é responsável por criar arquivos no Google Drive a partir dos dados recebidos. O problema não parece estar relacionado a essa parte do seu projeto.

Espero que essas dicas ajudem a resolver o problema que você está enfrentando com o ESP32.

No mais, boa sorte nos estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.