[Bluetooth + microSD = Sending Image - Using Arduino / Storage - Arduino Forum](https://forum.arduino.cc/t/bluetooth-mi ... mage/81195)
im having similar problem above, but im using esp32 board
i sent the image as jpeg using bluetooth Serial function
`SerialBT.write` and `SerialBT.flush`
to smartphone app
and also i saved the same image to the SD card
(using same image buffer)
But the most of the image was gone.. in both method
for example, this image is sent(or saved)
1111111111
1111111111
1111111111
1111111111
but i recieved(or what was saved on sd card is..) like this..
1111111111
1100000000
0000000000
0000000000
half or 3/4 of the image data is going somewhere..
is this software problem? or hardware problem?
i think it caused by 4MB flash (image buffer size was almost 2.5MB when i tested it)
Code: Select all
#include "esp_camera.h"
#define CAMERA_MODEL_AI_THINKER
#include "camera_pins.h"
#include "SD_MMC.h"
#include "Arduino.h"
#include "BluetoothSerial.h"
//#include <EEPROM.h>
//#include "Base64.h"
BluetoothSerial SerialBT;
//RTC_DATA_ATTR static int cbCount = 0;
void initSD(){
Serial.println("Starting SD Card");
if(!SD_MMC.begin()){
Serial.println("SD Card Mount Failed");
ESP.restart();
}else{
Serial.println("SD Card Mount Succes");
}
uint8_t cardType = SD_MMC.cardType();
if(cardType == CARD_NONE){
Serial.println("No SD Card attached");
return;
}
}
void initCamera(){
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 = 2;
config.fb_count = 2;
} else {
config.frame_size = FRAMESIZE_SVGA;
config.jpeg_quality = 2;
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);
ESP.restart();
}
}
void initBT(){
if(!SerialBT.begin("ESP32CAM-CLASSIC-BT")){
Serial.println("An error occurred initializing Bluetooth");
ESP.restart();
}else{
Serial.println("Bluetooth initialized");
}
//Bluetooth를 통한 Serial Port Profile을 시작 -> bluetooth 통신이 이루어질 때마다 실행되는 함수
SerialBT.register_callback(btCallback);
Serial.println("The device started, now you can pair it with bluetooth");
}
void btCallback(esp_spp_cb_event_t event, esp_spp_cb_param_t *param){
if(event == ESP_SPP_SRV_OPEN_EVT){ // BT Server가 처음 시작되면 발생하는 Event
Serial.println("Client Connected!");
}else if(event == ESP_SPP_DATA_IND_EVT){ // BT SPP로 data를 수신하면 발생하는 Event
// len : Length of data handle : Information of which is(are) connected
Serial.printf("ESP_SPP_DATA_IND_EVT len=%d, handle=%d\n\n", param->data_ind.len, param->data_ind.handle);
// 수신한 Data는 String 형식이므로 이를 int로 바꾸어 주는 작업
String stringRead = String(*param->data_ind.data);
int paramInt = stringRead.toInt() - 48;
Serial.printf("paramInt: %d\n", paramInt);
setCameraParam(paramInt);
}
}
void setCameraParam(int paramInt){
sensor_t *s = esp_camera_sensor_get();
switch(paramInt){
case 5:{
s->set_framesize(s, FRAMESIZE_UXGA);
pinMode(12,INPUT);
for(int i=0;i<10;i++){
if(digitalRead(12)==HIGH){
capture();
delay(500);
}
}
break;
}
case 4:
s->set_framesize(s, FRAMESIZE_UXGA);
break;
case 3:
s->set_framesize(s, FRAMESIZE_SXGA);
break;
case 2:
s->set_framesize(s, FRAMESIZE_XGA);
break;
case 1:
s->set_framesize(s, FRAMESIZE_SVGA);
break;
case 0:
default:
s->set_framesize(s, FRAMESIZE_VGA);
break;
}
capture();
}
void capture(){
camera_fb_t *fb = NULL;
esp_err_t res = ESP_OK;
fb = esp_camera_fb_get();
if(!fb){
esp_camera_fb_return(fb);
return;
}
if(fb->format != PIXFORMAT_JPEG){
return;
}
writeSerialBT(fb);
saveSD(fb);
esp_camera_fb_return(fb);
}
void writeSerialBT(camera_fb_t *fb){
SerialBT.write(fb->buf, fb->len);
SerialBT.flush();
}
void saveSD(camera_fb_t *fb){
fs::FS &fs = SD_MMC;
String path = "/picture" + ((String) cbCount++) +".jpg";
Serial.printf("Picture file name: %s\n", path.c_str());
File file = fs.open(path.c_str(), FILE_WRITE);
if(!file){
Serial.println("Failed to open file in writing mode");
Serial.println("Exiting now");
ESP.restart();
}
else {
file.write(fb->buf, fb->len);
Serial.printf("Saved file to path in SD card : %s\n", path.c_str());
}
file.close();
}
void setup() {
Serial.begin(115200);
initCamera();
initSD();
initBT();
}
void loop() { }