国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Arduino 合宙 ESP32 S3 + OV2640 實(shí)現(xiàn)低成本SD存儲(chǔ)卡相機(jī)(ESP32連接SD模塊引腳)

這篇具有很好參考價(jià)值的文章主要介紹了Arduino 合宙 ESP32 S3 + OV2640 實(shí)現(xiàn)低成本SD存儲(chǔ)卡相機(jī)(ESP32連接SD模塊引腳)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

合宙ESP32 S3 板載16M flash,8m psram和一個(gè)FPC相機(jī)接口,價(jià)格卻不到30元,無(wú)疑比價(jià)格將近50元的第三方ESP32 S3和將近30的ESP32 Cam更具性價(jià)比。

但是雖然板載FPC,由于接口沖突,導(dǎo)致相機(jī)與psram不能同時(shí)開啟,作為ESP32 Cam的替代品來(lái)看,還缺少了板載SD卡,而且作為一塊發(fā)布不久的開發(fā)板,網(wǎng)上資料資料非常少,甚至連樂鑫的ESP32 S3開發(fā)板關(guān)于如何用Arduino配置連接SD卡模塊的資料都很少。

但是經(jīng)過多次試錯(cuò)終于發(fā)現(xiàn)了連接方法,Arduino ESP32中默認(rèn)使用VSPI模式連接,而且官方示例中也沒有怎么定義引腳,但是S3中用VSPI模式連接會(huì)報(bào)錯(cuò),只能用HSPI連接

//SDCard
#include <SD.h>
#include <SPI.h>
 
SPIClass sdSPI(HSPI);    // 使用vspi模式會(huì)報(bào)錯(cuò)
#define SD_MISO     17
#define SD_MOSI     16
#define SD_SCLK     18
#define SD_CS       14

void SDCheck() {    // 測(cè)試SD卡連接
  uint8_t cardType = SD.cardType();
 
  if (cardType == CARD_NONE)
  {
    Serial.println("未連接存儲(chǔ)卡");
    return;
  }
  else 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("掛載了未知存儲(chǔ)卡");
  }
  Serial.printf("存儲(chǔ)卡總大小是: %lluMB \n", SD.cardSize() / (1024 * 1024)); // "/ (1024 * 1024)"可以換成">> 20"
  Serial.printf("文件系統(tǒng)總大小是: %lluB \n", SD.totalBytes());
  Serial.printf("文件系統(tǒng)已用大小是: %lluB \n", SD.usedBytes());
}

void setup() {
  bool SDstart = false;
  Serial.begin(115200);
  sdSPI.begin(SD_SCLK, SD_MISO, SD_MOSI, SD_CS);
  if (!SD.begin(SD_CS, sdSPI))
  {
    Serial.println("存儲(chǔ)卡掛載失敗");
    return;
  }

  SDCheck();

?相機(jī)部分配置:

//Cam
#include "esp_camera.h"
#include "esp_timer.h"
#include "soc/soc.h"           // Disable brownour problems
#include "soc/rtc_cntl_reg.h"  // Disable brownour problems

//cam gpio
#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 39
#define SIOD_GPIO_NUM 21
#define SIOC_GPIO_NUM 46

#define Y2_GPIO_NUM 34
#define Y3_GPIO_NUM 47
#define Y4_GPIO_NUM 48
#define Y5_GPIO_NUM 33
#define Y6_GPIO_NUM 35
#define Y7_GPIO_NUM 37
#define Y8_GPIO_NUM 38
#define Y9_GPIO_NUM 40

#define VSYNC_GPIO_NUM 42
#define HREF_GPIO_NUM 41
#define PCLK_GPIO_NUM 36

void setup() {    // 相機(jī)配置
  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_sccb_sda = SIOD_GPIO_NUM;
  config.pin_sccb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.frame_size = FRAMESIZE_SVGA;
  config.pixel_format = PIXFORMAT_JPEG;
  // config.grab_mode = CAMERA_GRAB_LATEST;
  config.grab_mode = config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
  config.fb_location = CAMERA_FB_IN_DRAM;
  config.jpeg_quality = 30;
  config.fb_count = 1;    // 沒有psram建議寫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);
    return;
  }
}

獲取圖片幀函數(shù):

void getimg(){
  camera_fb_t *fb = NULL;
  fb = esp_camera_fb_get();

  // if (!fb)
  // {
  //   Serial.println("Camera capture failed");
  //   return;
  // }
  // else
  // {
  //   Serial.println("Camera Captured");
  // }

  String filePath = dirPath + "/" + String(count) + ".jpg";

  // Serial.println(filePath);

  File file = SD.open(filePath,FILE_WRITE);
  if(file){
    file.write(fb->buf,fb -> len);
  }
  file.close();
  count ++;
  esp_camera_fb_return(fb);
  fb = NULL;
}

SD卡中文件夾存儲(chǔ)代碼,合宙這塊板貌似沒有板載RTC,獲取不了準(zhǔn)確的時(shí)間,而且不連接WiFi,所以只能計(jì)數(shù)命名

void setup() {
  bool SDstart = false;
  Serial.begin(115200);
  sdSPI.begin(SD_SCLK, SD_MISO, SD_MOSI, SD_CS);
  if (!SD.begin(SD_CS, sdSPI))
  {
    Serial.println("存儲(chǔ)卡掛載失敗");
    return;
  }else{
    while (!SD.exists("/Camera")) {
      SD.mkdir("/Camera");
      SDstart = true;
      Serial.print(".");
    }
    if(!SPIFFS.begin()){
      Serial.println("mount SPIFFS failed!");
    }else {
      if(!SPIFFS.exists("/Statue")){
        SPIFFS.mkdir("/Statue");
        File file = SPIFFS.open("/Statue",FILE_WRITE);
        file.write(1);
        file.close();
      }
      File file = SPIFFS.open("/Statue",FILE_READ);
      if(file.read() == 1){
        file = SPIFFS.open("/Statue",FILE_WRITE);
        file.write(0);
        file.close();
        Serial.println("start");
      } else {
        file = SPIFFS.open("/Statue",FILE_WRITE);
        file.write(1);
        file.close();
        Serial.println("stop");
        while (1);
      }
      if(SDstart == true){
        file = SPIFFS.open("/count.txt",FILE_WRITE);
        file.println("1");
        file.close();
      }else{
        if(!SPIFFS.exists("/count.txt")){
          Serial.println("create file Success!");
          file = SPIFFS.open("/count.txt",FILE_WRITE);
          file.println((String)fileCount);
          Serial.println(fileCount);
          file.close();
        }else{
          Serial.println("file exist!");
          File file = SPIFFS.open("/count.txt",FILE_READ);
          fileCount = atoi(file.readStringUntil('\n').c_str());
          file.close();
          Serial.println(fileCount);
          file = SPIFFS.open("/count.txt",FILE_WRITE);
          file.println(String(++fileCount));
          file.close();
        }
      }
    }
    SPIFFS.end();
    dirPath = "/Camera/" + (String)fileCount;
    while (!SD.exists(dirPath.c_str())) {
      SD.mkdir(dirPath.c_str());
      Serial.print(".");
    }
  }

完整代碼:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-766614.html

//SDCard
#include <SD.h>
#include <SPI.h>
//File
#include "SPIFFS.h"
//Cam
#include "esp_camera.h"
#include "esp_timer.h"
#include "soc/soc.h"           // Disable brownour problems
#include "soc/rtc_cntl_reg.h"  // Disable brownour problems

SPIClass sdSPI(HSPI);
#define SD_MISO     17
#define SD_MOSI     16
#define SD_SCLK     18
#define SD_CS       14

//cam gpio
#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 39
#define SIOD_GPIO_NUM 21
#define SIOC_GPIO_NUM 46

#define Y2_GPIO_NUM 34
#define Y3_GPIO_NUM 47
#define Y4_GPIO_NUM 48
#define Y5_GPIO_NUM 33
#define Y6_GPIO_NUM 35
#define Y7_GPIO_NUM 37
#define Y8_GPIO_NUM 38
#define Y9_GPIO_NUM 40

#define VSYNC_GPIO_NUM 42
#define HREF_GPIO_NUM 41
#define PCLK_GPIO_NUM 36

String dirPath;
uint32_t count = 0;
uint16_t fileCount = 1;

void getimg(){
  camera_fb_t *fb = NULL;
  fb = esp_camera_fb_get();
  String filePath = dirPath + "/" + String(count) + ".jpg";
  // Serial.println(filePath);
  File file = SD.open(filePath,FILE_WRITE);
  if(file){
    file.write(fb->buf,fb -> len);
  }
  file.close();
  count ++;
  esp_camera_fb_return(fb);
  fb = NULL;
}

void setup() {
  bool SDstart = false;
  Serial.begin(115200);
  sdSPI.begin(SD_SCLK, SD_MISO, SD_MOSI, SD_CS);
  if (!SD.begin(SD_CS, sdSPI))
  {
    Serial.println("存儲(chǔ)卡掛載失敗");
    return;
  }else{
    while (!SD.exists("/Camera")) {
      SD.mkdir("/Camera");
      SDstart = true;
      Serial.print(".");
    }
    if(!SPIFFS.begin()){
      Serial.println("mount SPIFFS failed!");
    }else {
      if(!SPIFFS.exists("/Statue")){
        SPIFFS.mkdir("/Statue");
        File file = SPIFFS.open("/Statue",FILE_WRITE);
        file.write(1);
        file.close();
      }
      File file = SPIFFS.open("/Statue",FILE_READ);
      if(file.read() == 1){
        file = SPIFFS.open("/Statue",FILE_WRITE);
        file.write(0);
        file.close();
        Serial.println("start");
      } else {
        file = SPIFFS.open("/Statue",FILE_WRITE);
        file.write(1);
        file.close();
        Serial.println("stop");
        while (1);
      }
      if(SDstart == true){
        file = SPIFFS.open("/count.txt",FILE_WRITE);
        file.println("1");
        file.close();
      }else{
        if(!SPIFFS.exists("/count.txt")){
          Serial.println("create file Success!");
          file = SPIFFS.open("/count.txt",FILE_WRITE);
          file.println((String)fileCount);
          Serial.println(fileCount);
          file.close();
        }else{
          Serial.println("file exist!");
          File file = SPIFFS.open("/count.txt",FILE_READ);
          fileCount = atoi(file.readStringUntil('\n').c_str());
          file.close();
          Serial.println(fileCount);
          file = SPIFFS.open("/count.txt",FILE_WRITE);
          file.println(String(++fileCount));
          file.close();
        }
      }
    }
    SPIFFS.end();
    dirPath = "/Camera/" + (String)fileCount;
    while (!SD.exists(dirPath.c_str())) {
      SD.mkdir(dirPath.c_str());
      Serial.print(".");
    }
  }
  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_sccb_sda = SIOD_GPIO_NUM;
  config.pin_sccb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.frame_size = FRAMESIZE_SVGA;
  config.pixel_format = PIXFORMAT_JPEG; 
  config.grab_mode = config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
  config.fb_location = CAMERA_FB_IN_DRAM;
  config.jpeg_quality = 30;
  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);
    return;
  }
}

void loop() {
  getimg();
  delay(100);
}

到了這里,關(guān)于Arduino 合宙 ESP32 S3 + OV2640 實(shí)現(xiàn)低成本SD存儲(chǔ)卡相機(jī)(ESP32連接SD模塊引腳)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 新上架的簡(jiǎn)約版合宙ESP32C3使用arduino開發(fā)的教程

    新上架的簡(jiǎn)約版合宙ESP32C3使用arduino開發(fā)的教程

    經(jīng)過兩個(gè)月的缺貨下架后,9塊9包郵的合宙ESP32C3又重新上架了,真香。這一批都是沒有帶串口芯片的簡(jiǎn)約版(9塊9要啥自行車)。在下架前,簡(jiǎn)約版要使用2.0.0版本的ESP32開發(fā)板庫(kù)才能下載,而2.0.0版本有一些丟失arduino自帶庫(kù)的詭異BUG,所以一直沒法用于下載?,F(xiàn)在由于發(fā)布了2

    2024年02月05日
    瀏覽(28)
  • Arduino利用USB接口直接為ESP32-S3下載和調(diào)試程序

    Arduino利用USB接口直接為ESP32-S3下載和調(diào)試程序

    ESP32-S3使用Arduino編程時(shí)可以直接使用USB連接。不用使用USB-UART的芯片進(jìn)行轉(zhuǎn)換。非常方便。但有些軟開關(guān)還是要注意。下面來(lái)說一下使用USB直接連接串口并下載程序及使用串口。 要在下載程序時(shí)使用USB,選擇Upload Mode: UART0/Hardware CDC 還要注意,USB mode也要選擇Hardware CDC and JTA

    2024年02月11日
    瀏覽(23)
  • 【研究開源機(jī)器臂】(3):低成本實(shí)現(xiàn)200多元實(shí)現(xiàn),開源機(jī)械臂,使用Wemos D1 R32 ESP32 +Arduino CNC,可以控制機(jī)械臂往復(fù)運(yùn)動(dòng)了,有視頻介紹和演示說明

    【研究開源機(jī)器臂】(3):低成本實(shí)現(xiàn)200多元實(shí)現(xiàn),開源機(jī)械臂,使用Wemos D1 R32 ESP32 +Arduino CNC,可以控制機(jī)械臂往復(fù)運(yùn)動(dòng)了,有視頻介紹和演示說明

    文章分類: https://blog.csdn.net/freewebsys/category_5782941.html 前面討論了相關(guān)的技術(shù)調(diào)研。 或者這樣的: 第一次折騰,價(jià)格便宜就行。 https://detail.1688.com/offer/656424665619.html v3 雕刻機(jī)擴(kuò)展板+ A4988套件 21 元: https://detail.1688.com/offer/710743362308.html http://www.taichi-maker.com/homepage/reference-in

    2024年02月03日
    瀏覽(22)
  • [022] [STM32] 使用DCMI(DVP)驅(qū)動(dòng)OV2640

    [022] [STM32] 使用DCMI(DVP)驅(qū)動(dòng)OV2640

    OV2640為CMOS類型數(shù)字圖像傳感器,支持輸出最大為200萬(wàn)像素(1600*1200分辨率)的圖像,支持使用 VGA 時(shí)序輸出圖像數(shù)據(jù),輸出圖像的數(shù)據(jù)格式支持YUV(422/420)、YCbCr422、RGB565以及JPEG格式,若直接輸出JPEG格式的圖像時(shí)可大大減少數(shù)據(jù)量。 可進(jìn)行 圖像補(bǔ)償 :支持伽瑪曲線、白平衡、

    2024年02月06日
    瀏覽(15)
  • STM32連接OV2640攝像頭串口方式在PyQt5界面上展示視頻界面 以及使用MQTT方式進(jìn)行展示

    STM32連接OV2640 視頻源接入到PyQt5界面中 作為AI模型的輸入,視頻流是非常重要的。在本文中,我們將介紹如何將STM32連接到OV2640攝像頭,并將視頻流接入到PyQt5界面中。 硬件連接 首先,我們需要將OV2640攝像頭連接到STM32上。我們可以使用以下連接方式: OV2640 | STM32 ------|------

    2024年02月06日
    瀏覽(25)
  • STM32+ov7725+ESP8266實(shí)現(xiàn)無(wú)線圖傳-完成上位機(jī)圖像顯示

    STM32+ov7725+ESP8266實(shí)現(xiàn)無(wú)線圖傳-完成上位機(jī)圖像顯示

    stm32f407探索者開發(fā)板和STM32F103ZET6戰(zhàn)艦開發(fā)板。接正點(diǎn)原子ov5640、OV7725、OV2640攝像頭,通過esp8266Wi-Fi模塊(透?jìng)髂J剑z像頭采集到的rgb565格式圖片通過tcp/ip協(xié)議上傳到上位機(jī)顯示。 【1】使用QT開發(fā)上位機(jī),建立TCP服務(wù)器,接收ESP8266發(fā)送過來(lái)的圖像數(shù)據(jù)顯示。 【2】編寫S

    2024年02月08日
    瀏覽(241)
  • 基于OV2640/ OV5640 的圖像采集顯示系統(tǒng)

    基于OV2640/ OV5640 的圖像采集顯示系統(tǒng)

    基于OV2640/ OV5640 的圖像采集顯示系統(tǒng)系列文章目錄: (1)基于 OV5640 攝像頭理論知識(shí)講解-成像和采樣原理 (2)基于 OV5640 攝像頭理論知識(shí)講解-數(shù)字接口和控制接口 (3)基于 OV5640 攝像頭理論知識(shí)講解-典型工作模式配置 (4)基于OV2640/ OV5640 的圖像采集顯示系統(tǒng) 本節(jié)將在實(shí)

    2024年02月11日
    瀏覽(18)
  • ov2640子設(shè)備視頻操作詳細(xì)分析

    ov2640子設(shè)備視頻操作詳細(xì)分析

    這段代碼定義了一個(gè)名為ov2640_subdev_video_ops的結(jié)構(gòu)體變量,該變量是struct v4l2_subdev_video_ops類型的,用于配置與視頻子設(shè)備相關(guān)的操作。 這個(gè)結(jié)構(gòu)體包含了多個(gè)成員函數(shù),每個(gè)函數(shù)都對(duì)應(yīng)一個(gè)特定的操作: .s_stream: 用于開始流傳輸?shù)暮瘮?shù),對(duì)應(yīng)的函數(shù)名是ov2640_s_stream。 .g_mbus

    2024年02月13日
    瀏覽(15)
  • 【Arduino 時(shí)間函數(shù)】ESP32怎么實(shí)現(xiàn)微秒級(jí)延時(shí),適用于ESP8266等

    如果基于 Arduino 開發(fā) ESP32 ,則延時(shí)函數(shù)可以直接使用 Arduino 提供的時(shí)間函數(shù)。 Arduino提供四種不同的時(shí)間操作函數(shù)。 delay() 函數(shù) delayMicroseconds() 函數(shù) 一毫秒內(nèi)有一千微秒,一秒內(nèi)有一百萬(wàn)微秒。 millis() 函數(shù) 此函數(shù)用于返回Arduino板開始運(yùn)行當(dāng)前程序時(shí)的毫秒數(shù)。 micros() 函數(shù)

    2024年02月13日
    瀏覽(24)
  • 使用 ESP32 Arduino 和機(jī)器學(xué)習(xí)實(shí)現(xiàn)WIFI室內(nèi)定位

    使用 ESP32 Arduino 和機(jī)器學(xué)習(xí)實(shí)現(xiàn)WIFI室內(nèi)定位

    ? 在這個(gè) Arduino 機(jī)器學(xué)習(xí)項(xiàng)目中,我們將使用附近的 WiFi 接入點(diǎn)來(lái)定位我們所在的位置。為了使該項(xiàng)目正常運(yùn)行,您需要一塊配備 WiFi 的板,例如 ESP8266、ESP32 或 MKR WiFI 1010。 什么是室內(nèi)定位? 我們都習(xí)慣了 GPS 定位,我們的設(shè)備將使用衛(wèi)星來(lái)跟蹤我們?cè)诘厍蛏系奈恢谩PS 工

    2024年02月14日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包