基于STM32设计的门禁照相机

news2024/11/17 3:35:33

一、项目介绍

当前文章介绍基于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); // 防止连续拍照
        }

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/807431.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pandas进阶修炼120题-第三期(金融数据处理,51-80题)

目录 往期内容&#xff1a;第一期&#xff1a;Pandas基础&#xff08;1-20题&#xff09;第二期&#xff1a;Pandas数据处理&#xff08;21-50题&#xff09; 第三期 金融数据处理51.使用绝对路径读取本地Excel数据方法一&#xff1a;双反斜杠绝对路径方法二&#xff1a;r 拓展…

记录--你不知道的Js高级方法

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 在Js中有一些比较冷门但是非常好用的方法&#xff0c;我在这里称之为高级方法&#xff0c;这些方法没有被广泛使用或多或少是因为存在一些兼容性的问题&#xff0c;不是所有的浏览器都读得懂的。…

Java特殊时间格式转化

平常开发过程当中&#xff0c;我们可能会见到有的日期格式是这样的。 1、2022-12-21T12:20:1608:00 2、2022-12-21T12:20:16.0000800 3、2022-12-21T12:20:16.00008:00下面来说一下这种时间格式怎么转换 第一种&#xff1a;2022-12-21T12:20:1608:00 代码如下&#xff1a; p…

Android ANR触发机制之Service ANR

一、前言 在Service组件StartService()方式启动流程分析文章中&#xff0c;针对Context#startService()启动Service流程分析了源码&#xff0c;其实关于Service启动还有一个比较重要的点是Service启动的ANR&#xff0c;因为因为线上出现了上百例的"executing service &quo…

FFmpeg aresample_swr_opts的解析

ffmpeg option的解析 aresample_swr_opts是AVFilterGraph中的option。 static const AVOption filtergraph_options[] {{ "thread_type", "Allowed thread types", OFFSET(thread_type), AV_OPT_TYPE_FLAGS,{ .i64 AVFILTER_THREAD_SLICE }, 0, INT_MA…

mybatisPlus高级篇

文章目录 主键生成策略介绍AUTO策略INPUT策略ASSIGN_ID策略ASSIGN_UUID策略NONE策略 MybatisPlus分页分页插件自定义分页插件 ActiveRecord模式SimpleQuery工具类SimpleQuery介绍listmapGroup 主键生成策略介绍 主键&#xff1a;在数据库中&#xff0c;主键通常用于快速查找和…

【MySQL】视图(十)

&#x1f697;MySQL学习第十站~ &#x1f6a9;本文已收录至专栏&#xff1a;MySQL通关路 ❤️文末附全文思维导图&#xff0c;感谢各位点赞收藏支持~ 一.引入 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据…

python json保留汉字原始形式,而不是Unicode编码(Unicode码)(加ensure_ascii=False参数)

文章目录 问题解决办法测试 问题 如图&#xff0c;保存汉字的时候变成unicode码了。。。 代码是这样的&#xff1a; 解决办法 在Python中&#xff0c;可以使用json模块的ensure_ascii参数来控制是否将汉字转换为类似\u5730\u9707的Unicode编码。默认情况下&#xff0c;ensure…

会议OA项目之权限管理个人中心(修改个人信息,选择本地图片进行头像修改)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于OA项目的相关操作吧 数据表及分析 表数据 表分析 所谓的权限管理就是不同的人管理不同的事&#xff0c;拥有着管理不同事情的不同权力。那么第一张表--权限表&…

网络知识整理

网络知识整理 网络拓扑网关默认网关 数据传输拓扑结构层面协议层面 网络拓扑 网关 连接两个不同的网络的设备都可以叫网关设备&#xff0c;网关的作用就是实现两个网络之间进行通讯与控制。 网关设备可以是交换机(三层及以上才能跨网络) 、路由器、启用了路由协议的服务器、代…

P3818 小A和uim之大逃离 II

题目 思路 一眼bfs 好像需要记录的东西有点多啊&#xff0c;那就交给数组吧 s t i j 0 / 1 st_{ij0/1} stij0/1​表示用/没用特殊步走到(i,j)的步数&#xff0c;然后套bfs模板即可 代码 #include<bits/stdc.h> using namespace std; const int N1005; int n,m,d,r,st…

c++学习(c++11)[24]

c11 列表初始化 #include"iostream" using namepace std;int main() {int x1 1;int x2 { 2 };int x3 { 2 };vector<int> v1 {1,2,3,4,5,6};vector<int> v1 {1,2,3,4,5,6};list<int> lt1 {1,2,3,4,5,6};list<int> lt1 {1,2,3,4,5,6};au…

红黑树与平衡二叉树

文章目录 前言一、平衡二叉树二、红黑树区别 前言 数据库的底层用到了多种树结构&#xff0c;这里简单记录一下红黑树与平衡二叉树。 一、平衡二叉树 满足二叉树。任何节点的两个子树的高度最大差为1。如果对平衡二叉树进行删除和新增&#xff0c;那么会破坏平衡&#xff0c;…

Jmix 如何将外部数据直接显示在界面?

企业级应用中&#xff0c;通常一个业务系统并不是孤立存在的&#xff0c;而是需要与企业、部门或者是外部的已有系统进行集成。一般而言&#xff0c;系统集成的数据和接口交互方式通常有以下几种&#xff1a; 文件传输&#xff1a;通过文件传输的方式将数据传递给其他系统&…

C++设计模式笔记

设计模式 如何解决复杂性&#xff1f; 分解 核心思想&#xff1a;分而治之&#xff0c;将大问题分解为多个小问题&#xff0c;将复杂问题分解为多个简单的问题。 抽象 核心思想&#xff1a;从高层次角度讲&#xff0c;人们处理复杂性有一个通用的技术&#xff0c;及抽象。…

现在运动耳机什么牌子的好用、最好的运动耳机推荐

对于注重身体健康的小伙伴来说&#xff0c;每周必然都少不了有规律的运动&#xff0c;而运动的时候耳边没有音乐的陪伴总是稍显枯燥无味&#xff0c;很难让人提起干劲来。有些小伙伴觉得运动的时候戴着耳机&#xff0c;稍微跳动几下耳机就开始松动&#xff0c;随时都要分心提防…

【LeetCode】124.二叉树中的最大路径和

题目 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root &…

SQLserver 查询数据库表结构和说明简介信息

DECLARE tableName NVARCHAR(MAX ) SET tableName‘TK_Cargoowner’;–表名!!! SELECT CASE WHEN col.colorder 1 THEN obj.name ELSE ‘’ END AS 表名, col.colorder AS 序号 , col.name AS 列名 , ISNULL(ep.[value], ‘’) AS 列说明 , t.name AS 数据类型 , col.length A…

第十章:queue类

系列文章目录 文章目录 系列文章目录前言queue的介绍queue的使用成员函数使用queue 总结 前言 queue是容器适配器&#xff0c;底层封装了STL容器。 queue的介绍 queue的文档介绍 队列是一种容器适配器&#xff0c;专门用于在FIFO上下文(先进先出)中操作&#xff0c;其中从容器…

微信小程序实现日历功能、日历转换插件、calendar

文章目录 演示htmlJavaScript 演示 效果图 微信小程序实现交互 html <view wx:if"{{calendarArr.length}}"><view class"height_786 df_fdc_aic"><view class"grid_c7_104"><view class"font_weight_800 text_align…