esp32cam拍照並存儲到SD卡

修改ssid、password即可。

#include "esp_camera.h"
#include "FS.h"
#include <SPI.h>
#include <SD.h>
#include "SD_MMC.h"
#include <time.h> 
#include <WiFi.h>
#include "string.h"

const char* ntpServer = "cn.pool.ntp.org";  //pool.ntp.org爲獲取時間得接口,可以嘗試更多得接口。比如微軟的time.windows.com,美國國家標準與技術研究院的time.nist.gov
const long  gmtOffset_sec = 8*60*60;//這裏採用UTC計時,中國爲東八區,就是 8*60*60
const int   daylightOffset_sec = 0*60*60;
struct tm timeinfo;  //創建一個結構體用於存儲時間
char * path = "/2020_6_18_TIME_19_0_47.jpg";
char timr_str[40] = "test.jpg";
//以下是WIFI的鏈接用戶名和密碼
#define ssid "xxx"
#define password "xxx" 

void connectToNetwork(){
  WiFi.begin(ssid,password);
  WiFi.setAutoReconnect(true);
  while (WiFi.status()!= WL_CONNECTED) {
    delay(1000);
    Serial.println("try to connecting ...");
  }
  Serial.println("Connectedto network");
}

void wifi_connect(){
  connectToNetwork();//鏈接到wifi
  Serial.println(WiFi.macAddress());    //打印出mac地址
  Serial.println(WiFi.localIP());    //打印出本地ip地址
  Serial.println("wifi連接成功");    //打印出本地ip地址
}
//**************************************************************************************************************************************  攝像頭初始化參數
static camera_config_t camera_config = {
    .pin_pwdn = 32,
    .pin_reset = -1,
    .pin_xclk = 0,
    .pin_sscb_sda = 26,
    .pin_sscb_scl = 27,
    
    .pin_d7 = 35,
    .pin_d6 = 34,
    .pin_d5 = 39,
    .pin_d4 = 36,
    .pin_d3 = 21,
    .pin_d2 = 19,
    .pin_d1 = 18,
    .pin_d0 = 5,
    .pin_vsync = 25,
    .pin_href = 23,
    .pin_pclk = 22,
    
    .xclk_freq_hz = 20000000,
    .ledc_timer = LEDC_TIMER_0,
    .ledc_channel = LEDC_CHANNEL_0,
    
    .pixel_format = PIXFORMAT_JPEG,
    .frame_size = FRAMESIZE_XGA,
    .jpeg_quality = 12,
    .fb_count = 1,
};

esp_err_t camera_init() {
    //initialize the camera
    esp_err_t err = esp_camera_init(&camera_config);
    if (err != ESP_OK) {
        Serial.print("Camera Init Failed");
        return err;
    }
    sensor_t * s = esp_camera_sensor_get();
    //initial sensors are flipped vertically and colors are a bit saturated
    if (s->id.PID == OV2640_PID) {
    //        s->set_vflip(s, 1);//flip it back
    //        s->set_brightness(s, 1);//up the blightness just a bit
    //        s->set_contrast(s, 1);
    }
    Serial.print("Camera Init OK");
    return ESP_OK;
}
//**************************************************************************************************************************************  SD卡初始化參數
void sd_init()
{
  if(!SD_MMC.begin()){
    Serial.println("Card Mount Failed");
    return;
  }
  uint8_t cardType = SD_MMC.cardType();
  if(cardType == CARD_NONE){
    Serial.println("No SD card attached");
    return;
  }
  Serial.print("SD Card Type: ");
  if(cardType == CARD_MMC){
    Serial.println("MMC");
    } 
  else if(cardType == CARD_SD){  Serial.println("SDSC");  }
  else if(cardType == CARD_SDHC){  Serial.println("SDHC");  } 
  else {  Serial.println("UNKNOWN");  }
  
  uint64_t cardSize = SD_MMC.cardSize() / (1024 * 1024);    //獲取SD卡大小,大小單位是MB
  Serial.printf("SD 卡容量大小: %lluMB\n", cardSize);  
  }
//**************************************************************************************************************************************  獲取當前時間作爲返回的函數部分
void get_time_path()  //獲取目前時間返回字符串
{
    memset(timr_str, 0, sizeof(timr_str));
    configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
    if(!getLocalTime(&timeinfo))
    {
      Serial.println("Failed to obtain time");
      sprintf(timr_str, "/TIME_get_failed.jpg");
    }
    else
    {
      //Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
      Serial.print("現在時間是:");
      Serial.print("年份是:");Serial.println(timeinfo.tm_year + 1900);
      Serial.print("月份是:");Serial.println(timeinfo.tm_mon + 1);
      Serial.print("號數是:");Serial.println(timeinfo.tm_mday);
      Serial.print("小時數是:");Serial.println(timeinfo.tm_hour );  //中國區
      Serial.print("分鐘數是:");Serial.println(timeinfo.tm_min);
      Serial.print("分鐘數是:");Serial.println(timeinfo.tm_sec);
      sprintf(timr_str, "/%d_%d_%d_TIME_%d_%d_%d.jpg",timeinfo.tm_year+1900,timeinfo.tm_mon + 1,timeinfo.tm_mday,timeinfo.tm_hour,timeinfo.tm_min,timeinfo.tm_sec);
      }
  }
//**************************************************************************************************************************************  主函數部分
void setup() {
    Serial.begin(115200);
    wifi_connect();
    camera_init();  //攝像頭初始化
    sd_init();  //SD卡初始化
}
void loop() 
{
   //拍照並且把圖片保存到SD卡當中,而照片名字就保存爲目前的時間
    Serial.println("即將進行拍照!!!");
    camera_fb_t * fb = esp_camera_fb_get();
    get_time_path();
    Serial.print("存入的圖片名稱爲:");Serial.println(timr_str);
    path = timr_str;    
    if(fb == NULL)
    {
      Serial.println( "get picture failed");  //代表獲取圖片失敗
    }else{ 
       //char * path = time_str;
       fs::FS &fs = SD_MMC;
       Serial.printf("Writing file: %s\n", path);
       File file = fs.open(path, FILE_WRITE);
       if (!file) 
       {
         Serial.println("文件創建失敗");
        }
       else
       {
         file.write(fb->buf , fb->len); //payload , lengte vd payload
         Serial.println("成功寫入照片");
       }
       //return the frame buffer back to the driver for reuse
       esp_camera_fb_return(fb);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章