ESP32 之 esp32-cam wifi拍照傳圖系統1

ESP32 之 esp32-cam wifi拍照傳圖系統

1.效果演示

在這裏插入圖片描述在這裏插入圖片描述

2.材料準備

  1. ESP32-cam
  2. USB轉TTL
  3. 按鈕x2 開關x2

3.原理圖接線

GND - GND
TX - RX
RX - TX
VCC - 5V
GPIO_0 - GND 下載模式
GPIO_0 不接線 運行模式

4.下載代碼

  1. 需要提前搭建Arduino環境,在這就不多說,在這裏要注意安裝好程序相關的庫
    在這裏插入圖片描述
    代碼下載,主函數代碼如下
#include "camera_pins.h"

// 你的wifi賬號密碼
const char* ssid     = "DY";
const char* password = "1403119048";

// 在端口80上創建AsyncWebServer對象
AsyncWebServer server(80);

boolean takeNewPhoto = false;
bool LED_flag = false;

void setup() {
  Serial.begin(115200);         //串口初始化
  
  pinMode(LED_1, OUTPUT);       //初始化 LED
  pinMode(KEY_1, INPUT);        //按鍵1初始化
  pinMode(KEY_2, INPUT);        //按鍵2初始化
  
  WiFi.begin(ssid, password);   //連接wifi
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  
  if (!SPIFFS.begin(true)) {   //初始化SPIFFS
    Serial.println("An Error has occurred while mounting SPIFFS");
    ESP.restart();}
  else {
    delay(500);
    Serial.println("SPIFFS mounted successfully");
  }

  //Turn-off the 'brownout detector'
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);

  // Camera initOV2640 camera module
  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;
  if (psramFound()) {
    config.frame_size = FRAMESIZE_UXGA;
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    ESP.restart();
  }

  // 路由主頁   
  server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/html", index_html);
  });
  //路由抓拍
  server.on("/capture", HTTP_GET, [](AsyncWebServerRequest * request) {
    takeNewPhoto = true;
    request->send_P(200, "text/plain", "Taking Photo");
  });
  //
  server.on("/saved-photo", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send(SPIFFS, FILE_PHOTO, "image/jpg", false);
  });
  //路由控制LED開關
  server.on("/LED", HTTP_GET, [](AsyncWebServerRequest * request) {
    LED_flag =!LED_flag;
    digitalWrite(LED_1, LED_flag);
  });
  // 啓動服務器
  server.begin();
  Serial.print("IP Address: http://");  //打印IP地址用於服務器連接
  Serial.println(WiFi.localIP());
}

void loop() {
  //判斷是否抓拍
  if (takeNewPhoto) {
    capturePhotoSaveSpiffs();
    takeNewPhoto = false;
  }
  
 //串口接收指令
  while(Serial.available()){
    char c=Serial.read();
    if(c=='1'){//開關LED
      LED_flag =!LED_flag;
      digitalWrite(LED_1, LED_flag);
      Serial.write("1\n");//返回到調試程序上
    }
    else if(c=='2') {//拍照
      takeNewPhoto = true;
      Serial.write("2\n");//返回到調試程序上
    }
  }

  //=====按鍵掃描=====
  int key_val = KEY_Scan();
  
  if(key_val == 1){       //按鍵1按下
    digitalWrite(LED_1, HIGH);
    takeNewPhoto = true;
    delay(500);
    digitalWrite(LED_1, LOW);                                             
  }
  if(key_val == 2){       //按鍵2按下
    LED_flag =!LED_flag;
    digitalWrite(LED_1, LED_flag);                                           
  }
  
  delay(1);
}

// 檢查照片捕獲是否成功
bool checkPhoto( fs::FS &fs ) {
  File f_pic = fs.open( FILE_PHOTO );
  unsigned int pic_sz = f_pic.size();
  return ( pic_sz > 100 );
}

// 捕捉照片並保存到SPIFFS
void capturePhotoSaveSpiffs( void ) {
  camera_fb_t * fb = NULL; // pointer
  bool ok = 0; // 布爾值指示圖片是否被正確拍攝
  do {
    // 用照相機拍照
    Serial.println("Taking a photo...");
    fb = esp_camera_fb_get();
    if (!fb) {
      Serial.println("Camera capture failed");
      return;
    }
      
    //照片文件名稱
    Serial.printf("Picture file name: %s\n", FILE_PHOTO);
    File file = SPIFFS.open(FILE_PHOTO, FILE_WRITE);

    // 插入照片文件中的數據
    if (!file) {
      Serial.println("Failed to open file in writing mode");
    }
    else {
      file.write(fb->buf, fb->len); // payload (image), payload length
      Serial.print("The picture has been saved in ");
      Serial.print(FILE_PHOTO);
      Serial.print(" - Size: ");
      Serial.print(file.size());
      Serial.println(" bytes");
    }
    // 關閉文件
    file.close();
    esp_camera_fb_return(fb);

    // 檢查文件是否正確地保存在SPIFFS中
    ok = checkPhoto(SPIFFS);
  } while ( !ok );
  //將文件保存到SD卡當中
}
//按鍵掃描
int KEY_Scan(void)
{   
  static int key_up = 1;//按鍵按鬆開標誌   
  if(key_up && (digitalRead(KEY_1) == 0 || digitalRead(KEY_2) == 0 ))
  {
    delay(10);//去抖動 
    key_up=0;
    if(digitalRead(KEY_1) == 0)return 1;
    if(digitalRead(KEY_2) == 0)return 2;
  }else if( digitalRead(KEY_1) == 1 || digitalRead(KEY_2) == 1)key_up=1;       
  return 0; // 無按鍵按下
}

完整代碼下載地址

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