基于STM32设计的门禁照相机

发布时间:2024-07-25  

一、项目介绍

当前文章介绍基于STM32设计的门禁照相机,本项目提供了一种更加智能、安全、便捷的门禁解决方案。门禁照相机采用STM32F103ZET6 MCU作为主控芯片,配合2.8寸LCD显示屏、OV7725数字摄像头、SD卡和模拟门铃按键等外设模块,实现了摄像头画面实时显示、门铃触发拍照、图片存储等功能。


在使用该门禁照相机时,来访客人只需按下门铃按键,摄像头即可自动拍摄照片并保存到SD卡中。同时,用户也可以通过LCD屏幕进行时间调整和本地图片浏览等操作,提高了门禁系统的可操作性和用户体验。


门禁照相机的设计为了提高门禁系统的安全性和智能化程度,解决传统门禁系统存在的诸多问题。通过采用数字摄像头替代传统猫眼,并实现照片自动拍摄和存储功能,有效提高了门禁系统的安全性。同时,通过LCD屏幕进行时间调整和本地图片浏览等操作,实现了门禁系统的智能化,提高了用户的使用体验。

image-20230615205237018

二、硬件设计

本照相机的主要硬件包括 STM32F103ZET6 MCU、3.5寸 LCD 显示屏、OV7725 数字摄像头、SD 卡和一个模拟门铃的按键。

(1)STM32F103ZET6 MCU

STM32F103ZET6 MCU 是本照相机的主控芯片,它可以通过 GPIO 口驱动其他外设模块。

(2)3.5寸 LCD 显示屏

3.5寸 LCD 显示屏可以实时显示摄像头捕捉的画面,并且支持多个页面的切换。

(3)OV7725 数字摄像头

OV7725 数字摄像头可以采集来访客人的画面,并将其实时显示在 LCD 显示屏上。

(4)SD 卡

SD 卡用于存储照相机拍摄的照片,照片的名称由当前时间日期命名。

(5)模拟门铃的按键

模拟门铃的按键用于触发照相机拍摄照片。

三、软件设计

3.1 技术要求

(1)实时显示画面

本照相机通过 OV7725 数字摄像头捕捉来访客人的画面,并通过3.5寸 LCD 显示屏实时显示。

(2)拍照并保存到 SD 卡

当有来访者按下模拟门铃按键时,照相机会拍摄照片并保存到 SD 卡中,照片名称以当前时间日期命名。

3.2 软件流程

(1) 初始化STM32F103ZET6 MCU及外部设备; (2) 启动OV7725 数字摄像头; (3) 开启LCD; (4) 进入主循环: a. 读取按键状态是否是门铃被按下; b. 若发现门铃按下,则照相机开始拍照并将照片保存到 SD 卡; c. 更新屏幕上的内容。

3.3 代码实现

代码实现过程:

(1) 初始化STM32F103ZET6 MCU及外部设备;

(2) 启动OV7725 数字摄像头,并设置其采集参数;

(3) 初始化 SD 卡,并在 SD 卡上创建一个文件夹用于存储照片;

(4) 开启LCD,并设置其显示参数;

(5) 进入主循环,读取按键状态并更新屏幕上的内容;

(6) 当发现门铃被按下时,开始拍照并将照片保存到 SD 卡中。


四、代码实现

4.1 整体代码框架

#include "stm32f10x.h"

 #include "sdio_sdcard.h"

 #include "ff.h"

 

 /* 定义一些宏和变量 */

 

 int main(void) {

     /* 初始化系统时钟(例如使用 HSE 8MHz 作为系统时钟) */

     /* 初始化 GPIO 端口、SDIO、LCD、OV7725 等外设模块 */

     /* 初始化 SD 卡,并在其上创建用于存储照片的文件夹 */

 

     while(1) {

         /* 读取门铃按键状态 */

         if(/* 检测到门铃被按下 */) {

             /* 拍摄照片并保存到 SD 卡中,照片名以当前时间日期命名 */

         }

 

         /* 更新屏幕显示内容,包括实时摄像头画面、时间日期、照片预览等 */

     }

 }

4.2 拍照存储

下面是采用 STM32 的HAL 库设计的代码,控制OV7725 拍照保存为 BMP 图片到 SD 卡中。


复制

#include "stm32f1xx_hal.h"

 #include "sdio_sdcard.h"

 #include "ff.h"

 #include "ov7725.h"

 

 extern SD_HandleTypeDef hsd;

 extern DCMI_HandleTypeDef hdcmi;

 extern DMA_HandleTypeDef hdma_dcmi;

 

 FATFS fs;

 FIL file;

 UINT bw;

 

 /* 定义一些宏和变量 */

 

 int main(void) {

     /* 初始化系统时钟(例如使用 HSE 8MHz 作为系统时钟) */

     /* 初始化 GPIO 端口、SDIO、LCD、OV7725 等外设模块 */

     /* 初始化 SD 卡,并在其上创建用于存储照片的文件夹 */

 

     while(1) {

         /* 读取门铃按键状态 */

         if(/* 检测到门铃被按下 */) {

             /* 拍摄照片并保存到 SD 卡中,照片名以当前时间日期命名 */

             HAL_GPIO_WritePin(OV7725_RESET_GPIO_Port, OV7725_RESET_Pin, GPIO_PIN_SET); // 复位 OV7725

             HAL_Delay(50);

             HAL_GPIO_WritePin(OV7725_RESET_GPIO_Port, OV7725_RESET_Pin, GPIO_PIN_RESET);

 

             ov7725_init(); // 初始化 OV7725

 

             HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_SNAPSHOT, (uint32_t)RGB565_buffer, (uint32_t)(CAMERA_RWIDTH * CAMERA_RHEIGH), 1); // 开始采集

 

             HAL_DMA_PollForTransfer(&hdma_dcmi, HAL_DMA_FULL_TRANSFER, 1000); // 等待采集完成

 

             /* 将 RGB565 数据转换成 BMP 格式 */

             uint16_t bmp_header[54/2] = {0x4D42, 54+CAMERA_RWIDTH*CAMERA_RHEIGH*3, 0, 0, 54,

                                           40, CAMERA_RWIDTH, CAMERA_RHEIGH, 1, 24, 0, CAMERA_RWIDTH*CAMERA_RHEIGH*3, 0, 0, 0, 0};

             uint8_t bmp_data[CAMERA_RWIDTH*CAMERA_RHEIGH*3];

             uint16_t i = 0, j = 0;

             for(i = 0; i < 54/2; i++) {

                 bmp_data[i*2] = bmp_header[i]; // 拷贝 BMP 文件头

                 bmp_data[i*2+1] = bmp_header[i] > >8;

             }

             for(i = 0; i < CAMERA_RWIDTH*CAMERA_RHEIGH; i++) {

                 bmp_data[54+i*3+0] = RGB565_buffer[i] > >8; // RGB565 转换为 BMP 格式的 RGB 24位色

                 bmp_data[54+i*3+1] = RGB565_buffer[i] > >3;

                 bmp_data[54+i*3+2] = RGB565_buffer[i]< < 3;

             }

 

             /* 保存 BMP 图片到 SD 卡中 */

             if(f_mount(&fs, SD_Path, 1) == FR_OK) { // 挂载 SD 卡

                 char filename[20];

                 /* 将文件名设置为当前时间日期,例如"202206151243.bmp" */

                 sprintf(filename, "%04d%02d%02d%02d%02d%02d.bmp", year, month, day, hour, minute, second);

 

                 if(f_open(&file, filename, FA_CREATE_ALWAYS | FA_WRITE) == FR_OK) { // 创建文件并写入数据

                     f_write(&file, bmp_data, sizeof(bmp_data), &bw);

                     f_close(&file);

                 }

             }

 

             HAL_Delay(1000); // 防止连续拍照

         }

 

         /* 更新屏幕显示内容,包括实时摄像头画面、时间日期、照片预览等 */

     }

 }


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>