代码说明
- #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、拍摄完成后,进入一个无限循环,停止程序。
|