【花雕学编程】Arduino动手做(230)---使用ESP32-CAM拍摄3张带编号的照片并将其保存到SD卡上

在这里插入图片描述

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十:ESP32 CAM开发板 带OV2640摄像头模块 WIFI+蓝牙模块

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ESP32-CAM 是一款非常小的摄像头模块,配备 ESP32-S 芯片。除了 OV2640 摄像头和几个用于连接外围设备的 GPIO 外,它还具有一个 microSD 卡插槽,可用于存储使用摄像头拍摄的图像或存储文件以提供给客户。包括乐鑫 ESP32-S Wifi + 蓝牙+BLE 芯片、2MP 摄像头模块 OV2640 和带有 CH340 UART 芯片的 USB 编程适配器。

ESP32-Cam 是一款运行在 ESP32-S 芯片上并使用 OV2640 摄像头的小型摄像头模块。ESP32_Cam 也可以 OV7670 摄像头,但 OV2640 更好(更高的分辨率和内置的 JPEG 编码,这消除了 ESP32-S 的处理任务)。

ESP-32 Cam 规格
ESP-32 系列
它支持 Wi-Fi (802.11b/g/n)
支持蓝牙 (4.2 带 BLE)
内置 LED 闪光灯
9 个 IO 端口
支持 UART、SPI、I2C 和 PWM
内置 micro SD 读卡器
输入电源:3.3V / 5V(据报道,5V 供电比 3.3V 更稳定)

OV2640 摄像头
2 百万像素
阵列尺寸:UXGA (1600 x 1200)
镜头尺寸:1/4 英寸(6.35 毫米)
最大图像传输速率:15 帧/秒

在这里插入图片描述

实验模块接线示意图

在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十:ESP32 CAM开发板 带OV2640摄像头模块 WIFI+蓝牙模块
项目实验之八:使用ESP32-CAM拍摄3张带编号的照片并将其保存到SD卡上

实验开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百三十:ESP32 CAM开发板 带OV2640摄像头模块 WIFI+蓝牙模块
  项目实验之八:使用ESP32-CAM拍摄3张带编号的照片并将其保存到SD卡上
*/

#include "esp_camera.h"  // 引入ESP32摄像头库
#include "FS.h"  // 引入文件系统库
#include "SD_MMC.h"  // 引入SD卡库

// 摄像头引脚配置
camera_config_t config = {
  .pin_pwdn  = 32,  // 电源引脚
  .pin_reset = -1,  // 复位引脚(未使用)
  .pin_xclk = 0,  // XCLK引脚
  .pin_sscb_sda = 26,  // SCCB SDA引脚
  .pin_sscb_scl = 27,  // SCCB SCL引脚
  .pin_d7 = 35,  // 数据引脚D7
  .pin_d6 = 34,  // 数据引脚D6
  .pin_d5 = 39,  // 数据引脚D5
  .pin_d4 = 36,  // 数据引脚D4
  .pin_d3 = 21,  // 数据引脚D3
  .pin_d2 = 19,  // 数据引脚D2
  .pin_d1 = 18,  // 数据引脚D1
  .pin_d0 = 5,   // 数据引脚D0
  .pin_vsync = 25,  // VSYNC引脚
  .pin_href = 23,  // HREF引脚
  .pin_pclk = 22,  // PCLK引脚
  .xclk_freq_hz = 20000000,  // XCLK频率(20MHz)
  .ledc_timer = LEDC_TIMER_0,  // LEDC定时器
  .ledc_channel = LEDC_CHANNEL_0,  // LEDC通道
  .pixel_format = PIXFORMAT_JPEG,  // 像素格式为JPEG
  .frame_size = FRAMESIZE_UXGA,  // 帧大小为UXGA (1600x1200)
  .jpeg_quality = 10,  // JPEG质量
  .fb_count = 1  // 帧缓冲区数量
};

void setup() {
  Serial.begin(115200);  // 初始化串口通信,波特率为115200
  Serial.println();

  // 初始化摄像头
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("摄像头初始化失败,出现错误 0x%x", err);  // 输出初始化失败的错误信息
    return;
  }
  Serial.println("摄像头初始化成功!");

  // 初始化SD卡
  if (!SD_MMC.begin()) {
    Serial.println("SD卡挂载失败");
    return;
  }
  Serial.println("SD卡已挂载完成!");
}

void loop() {
  for (int i = 1; i <= 3; i++) {
    // 获取摄像头的帧缓冲区
    camera_fb_t * fb = esp_camera_fb_get();
    if (!fb) {
      Serial.println("摄像头捕捉失败");
      return;
    }

    // 创建文件名
    char filename[20];
    sprintf(filename, "/photo%d.jpg", i);

    // 创建照片文件
    File photoFile = SD_MMC.open(filename, FILE_WRITE);
    if (!photoFile) {
      Serial.println("无法创建照片文件");
      esp_camera_fb_return(fb);
      return;
    }

    // 写入照片数据
    photoFile.write(fb->buf, fb->len);
    photoFile.close();
    Serial.printf("照片 %d 已保存,大小: %d 字节\n", i, fb->len);

    // 释放帧缓冲区
    esp_camera_fb_return(fb);

    // 等待2秒再拍摄下一张照片
    delay(2000);
  }

  // 完成后停止循环
  while (true) {
    delay(1000);
  }
}

实验串口返回情况

在这里插入图片描述
代码说明

#include "esp_camera.h"  // 引入ESP32摄像头库
#include "FS.h"  // 引入文件系统库
#include "SD_MMC.h"  // 引入SD卡库

这三行代码引入了必要的库文件,用于摄像头操作、文件系统操作和SD卡操作。

// 摄像头引脚配置
camera_config_t config = {
  .pin_pwdn  = 32,  // 电源引脚
  .pin_reset = -1,  // 复位引脚(未使用)
  .pin_xclk = 0,  // XCLK引脚
  .pin_sscb_sda = 26,  // SCCB SDA引脚
  .pin_sscb_scl = 27,  // SCCB SCL引脚
  .pin_d7 = 35,  // 数据引脚D7
  .pin_d6 = 34,  // 数据引脚D6
  .pin_d5 = 39,  // 数据引脚D5
  .pin_d4 = 36,  // 数据引脚D4
  .pin_d3 = 21,  // 数据引脚D3
  .pin_d2 = 19,  // 数据引脚D2
  .pin_d1 = 18,  // 数据引脚D1
  .pin_d0 = 5,   // 数据引脚D0
  .pin_vsync = 25,  // VSYNC引脚
  .pin_href = 23,  // HREF引脚
  .pin_pclk = 22,  // PCLK引脚
  .xclk_freq_hz = 20000000,  // XCLK频率(20MHz)
  .ledc_timer = LEDC_TIMER_0,  // LEDC定时器
  .ledc_channel = LEDC_CHANNEL_0,  // LEDC通道
  .pixel_format = PIXFORMAT_JPEG,  // 像素格式为JPEG
  .frame_size = FRAMESIZE_UXGA,  // 帧大小为UXGA (1600x1200)
  .jpeg_quality = 10,  // JPEG质量
  .fb_count = 1  // 帧缓冲区数量
};

这段代码配置了摄像头的引脚和参数。包括电源引脚、复位引脚、数据引脚等。frame_size 设置为 FRAMESIZE_UXGA,表示照片分辨率为 1600x1200。jpeg_quality 设置为 10,表示JPEG质量。

void setup() {
  Serial.begin(115200);  // 初始化串口通信,波特率为115200
  Serial.println();

  // 初始化摄像头
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("摄像头初始化失败,出现错误 0x%x", err);  // 输出初始化失败的错误信息
    return;
  }
  Serial.println("摄像头初始化成功!");

  // 初始化SD卡
  if (!SD_MMC.begin()) {
    Serial.println("SD卡挂载失败");
    return;
  }
  Serial.println("SD卡已挂载完成!");
}

setup 函数在程序开始时运行。它初始化串口通信、摄像头和SD卡。如果摄像头或SD卡初始化失败,会输出错误信息并停止程序。

void loop() {
  for (int i = 1; i <= 3; i++) {
    // 获取摄像头的帧缓冲区
    camera_fb_t * fb = esp_camera_fb_get();
    if (!fb) {
      Serial.println("摄像头捕捉失败");
      return;
    }

    // 创建文件名
    char filename[20];
    sprintf(filename, "/photo%d.jpg", i);

    // 创建照片文件
    File photoFile = SD_MMC.open(filename, FILE_WRITE);
    if (!photoFile) {
      Serial.println("无法创建照片文件");
      esp_camera_fb_return(fb);
      return;
    }

    // 写入照片数据
    photoFile.write(fb->buf, fb->len);
    photoFile.close();
    Serial.printf("照片 %d 已保存,大小: %d 字节\n", i, fb->len);

    // 释放帧缓冲区
    esp_camera_fb_return(fb);

    // 等待2秒再拍摄下一张照片
    delay(2000);
  }

  // 完成后停止循环
  while (true) {
    delay(1000);
  }
}

loop 函数是程序的主循环。它拍摄3张照片并保存到SD卡上。具体步骤如下:
1、使用 esp_camera_fb_get 获取摄像头的帧缓冲区。如果捕捉失败,输出错误信息并返回。
2、创建文件名,例如 /photo1.jpg、/photo2.jpg、/photo3.jpg。
3、打开文件并写入照片数据。如果文件创建失败,输出错误信息并返回。
4、写入照片数据后,关闭文件并释放帧缓冲区。
5、等待2秒后再拍摄下一张照片。
6、拍摄完成后,进入一个无限循环,停止程序。

保存在SD卡上的三张拍摄照片

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值