Who will help me?
In this case, helping is correcting the code below because it only sends lowercase pictures to the API, less than 10 Kb.
Just do it. Take the picture and send it to API.
But it's amazing, even having a 4 Mb PSRAM, it only sends very small pictures. Alright, the PSRAM is for another purpose but why not leave about 200 Kb free for work?
Anyway...
// ESP DEV MODULE PSRAM enable e Default 4 Mb with SPIFFS (1.2 mB APP / 1.5 mB SPIFFS)
#include "Arduino.h"
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"
#include "esp_camera.h"
#include "Base64.h"
int nowifi;
const char* ssid = "SXXXX_2Ghz";
const char* password = "sab56743";
#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
#define flash 4
void setup() {
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
Serial.begin(115200);
delay(100);
Serial.print("FreeHeap Ă©: ");Serial.println(ESP.getFreeHeap());
pinMode(flash,OUTPUT);
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;
config.frame_size = FRAMESIZE_CIF; // UXGA(1600x1200) / SXGA(1280x1024 / XGA(1024x768) / SVGA(800x600) / VGA(640x480) / CIF(352x288) / QVGA(320x240) / QQVGA(160x120)
config.jpeg_quality = 30;
config.fb_count = 2;
if(psramFound()){
Serial.println("PSRAM OK");
// config.frame_size = FRAMESIZE_CIF;
// config.jpeg_quality = 10;
// config.fb_count = 2;
// } else {
// Serial.print("not found");
// config.frame_size = FRAMESIZE_CIF;
// config.jpeg_quality = 10;
// config.fb_count = 1;
}
esp_err_t err = esp_camera_init(&config); //Inicialização da câmera
if (err != ESP_OK) {
Serial.printf("O inĂcio da câmera falhou com erro 0x%x", err);
delay(1000);
ESP.restart();
}
/*
sensor_t * s = esp_camera_sensor_get(); //see certs.h for more info
s->set_brightness(s, -1); // -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, 200); // 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
*/
sensor_t * s = esp_camera_sensor_get();
s->set_brightness(s, 2);
s->set_contrast(s, 1);
s->set_whitebal(s, 1);
s->set_special_effect(s, 0);
s->set_wb_mode(s, 1);
s->set_aec_value(s, 0);
s->set_lenc(s, 1);
s->set_hmirror(s, 0); // disable, 1 - enable
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
// Serial.print(".");
delay(1000);
nowifi++;
Serial.println(nowifi);
if(nowifi > 3) {
ESP.restart();
}
}
Serial.println(WiFi.localIP());
Serial.println(heap_caps_get_free_size(MALLOC_CAP_SPIRAM));
takeandsendphoto();
delay(2000);
}
void loop() {
}
const char* takeandsendphoto() {
camera_fb_t * fb = NULL;
uint8_t* _jpg_buf = NULL;
esp_err_t res = ESP_OK;
size_t frame_size = 0;
digitalWrite(flash,HIGH);
delay(100);
fb = esp_camera_fb_get();
digitalWrite(flash,LOW);
if (!fb) {
Serial.println("Camera capture failed");
delay(1000);
ESP.restart();
}
Serial.println(String("Photo size is = ")+String(fb->len));
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 += (String(output));
if (i%3==0) imageFile += urlencode(String(output));
}
// Serial.println(imageFile);
esp_camera_fb_return(fb);
const char* host = "app.hall-api.com";
String fLogin = "28QFGHTY-oWdqv7-FPOPIUJ2p-UPXODVM7NF62";
String phoneNumber = "55219XCVFBG314";
String message = "Teste API";
String image_base64 = imageFile;
String url = "/v1/instance/3RTF-000108-gIzE-lP4C-ZP97FGDXWHB9/token/38LYUTIHV-Ntht-aTUo-St62-JCEIUA4TUVSY/message"; // caminho da URL
String postStr = "fLogin="+fLogin+"&ACTION=IMAGE&destination="+phoneNumber+"&text="+message+"&image_name=img.jpg&image_base64="+imageFile;
// Serial.print("postStr Ă©: ");Serial.println(postStr);
if (WiFi.status() == WL_CONNECTED) {
WiFiClientSecure client;
client.setInsecure();
if (client.connect(host, 443)) {
Serial.println("Send start: "+String(postStr.length()));
client.print(String("POST ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Content-Type: application/x-www-form-urlencoded\r\n" +
"Content-Length: " + String(postStr.length()) + "\r\n\r\n" +
postStr + "\r\n");
while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
Serial.println("body response HTTPS:");
break;
}
}
String body = client.readString();
Serial.println(body);
} else {
Serial.println("No connect HTTPS");
}
}
return("");
}
//---------------------------------------------------------------------------------------------------
String urlencode(String str)
{
String encodedString="";
char c;
char code0;
char code1;
char code2;
for (int i =0; i < str.length(); i++){
c=str.charAt(i);
if (c == ' '){
encodedString+= '+';
} else if (isalnum(c)){
encodedString+=c;
} else{
code1=(c & 0xf)+'0';
if ((c & 0xf) >9){
code1=(c & 0xf) - 10 + 'A';
}
c=(c>>4)&0xf;
code0=c+'0';
if (c > 9){
code0=c - 10 + 'A';
}
code2='\0';
encodedString+='%';
encodedString+=code0;
encodedString+=code1;
//encodedString+=code2;
}
yield();
}
return encodedString;
}
/////////////////////////////// END
Photos smaller than 10Kb works. Larger than 10K approximately gives this error: