创新应用 | 基于GD32F527系列MCU的多媒体门禁系统

介绍

基于GD32F527系列MCU的多媒体门禁系统,主控GD32F527系列MCU,具备摄像头采集图像(DMA直接到SDRAM),保存照片,查看照片。DCI数字图像接口、TLI接口驱动TFT-LCD屏幕,Wi-Fi模块(MQTT协议)联网上传数据,语音识别控制开门、开灯等,RFID门禁卡识别,手机APP远程监控与控制(HTTP协议)。

1.png

视频展示

【基于 GD32F527I-EVAL 的多媒体智能门禁系统-哔哩哔哩】  https://b23.tv/hOGykGD

github: https://github.com/YongleDuanmu/qianrushi

gitee: https://gitee.com/duanmu-yongle/qianrushi

∎ 硬件需要 ∎

语音识别模块、MFRC522、SG90舵机、TFTLCD、OV2640摄像头、Wi-Fi模块、LED灯、调试串口、按键输入。

∎ 主要功能 ∎

语音识别开门、打开灯光、打开摄像头、拍照、查看照片进行对应工作。RFID门禁卡刷去在TFT-LCD屏幕上显示序列号,同时还会语音播报主人几,在手机app上显示灯、门、序列号等信息,还可以进行远程控制。

GD32多媒体门禁系统硬件连接关系表,详细硬件连接关系表如下:

2.1、OV2640摄像头模块

通过DCI(数字相机接口)连接到GD32:

DCI_PIXCLK (PA6)

DCI_VSYNC (PG9)

DCI_HSYNC (PA4)

DCI_D0 (PC6)

DCI_D1 (PC7)

DCI_D2 (PC8)

DCI_D3 (PC9)

DCI_D4 (PC11)

DCI_D5 (PD3)

DCI_D6 (PB8)

DCI_D7 (PB9)

SCCB_SCL (PA4) -用于配置摄像头

SCCB_SDA (PC6) -用于配置摄像头

2.2、TFTLCD显示屏

通过TLI(LCD-TFT控制器)连接:

LCD_R7 (PG6)

LCD_R6 (PH12)

LCD_R5 (PH11)

LCD_R4 (PH10)

LCD_R3 (PH9)

LCD_R2 (PH8)

LCD_R1 (PH3)

LCD_R0 (PH2)

LCD_G7 (PI2)

LCD_G6 (PI1)

LCD_G5 (PI0)

LCD_G4 (PH15)

LCD_G3 (PH14)

LCD_G2 (PH13)

LCD_G1 (PE6)

LCD_G0 (PE5)

LCD_B7 (PI7)

LCD_B6 (PI6)

LCD_B5 (PI5)

LCD_B4 (PI4)

LCD_B3 (PG11)

LCD_B2 (PG10)

LCD_B1 (PG12)

LCD_B0 (PE4)

LCD_HSYNC (PI10)

LCD_VSYNC (PI9)

LCD_PCLK (PG7)

LCD_PWM_BackLight (PB15)

2.3、MFRC522 RFID读卡器模块

通过软件模拟SPI接口连接:

SDA (PA15) -片选信号

SCK (PB3) -时钟信号

MOSI (PB5) -主机输出从机输入

MISO (PB4) -主机输入从机输出

RST (PA8) -复位信号

2.4、Wi-Fi模块

通过UART2串口连接:

TX (PB10) -发送数据到Wi-Fi模块

RX (PB11) -从Wi-Fi模块接收数据

2.5、语音识别模块

通过UART1串口连接:

TX (PA2) -发送数据到语音识别模块

RX (PA3) -从语音识别模块接收数据

2.6、SG90舵机

通过TIMER0_CH3 PWM信号控制:

PWM信号 (PA11) -控制舵机角度

2.7、指示LED灯

通过GPIO控制:

LED1 (PF8) -一个指示灯

LED2 (PE3) -另一个指示灯

2.8、调试串口

通过UART3连接(用于printf调试输出):

TX (PC10) -调试信息输出

RX (PC11) -接收调试命令

2.9、按键输入

通过外部中断连接:

WAKEUP按键(PA0) -外部中断0

TAMPER按键(PC13) -外部中断13

USER按键(PB14) -外部中断14

设计流程

针对MRCF522模块采用SPI通信,对数据进行读取

//功      能:防冲突检测读取选中卡片的卡序列号
//参数说明: pSnr[OUT]:卡片序列号,4字节
//返    回: 成功返回MI_OK
charMFRC522_Anticoll(unsignedchar *pSnr)
{    
    char status;    
    unsignedchar i, snr_check = 0;    
    unsignedint unLen;    
    unsignedchar ucComMF522Buf[MAXRLEN];    
    ClearBitMask(Status2Reg, 0x08);    
    Write_MFRC522(BitFramingReg, 0x00);    
    ClearBitMask(CollReg, 0x80);    
    ucComMF522Buf[0] = PICC_ANTICOLL1;   
     ucComMF522Buf[1] = 0x20;    
     status = MFRC522_ToCard(PCD_TRANSCEIVE, ucComMF522Buf, 2, ucComMF522Buf, &unLen);    
     if (status == MI_OK)    
     {
       for (i = 0; i < 4; i++)        
       {            
           *(pSnr + i) = ucComMF522Buf[i];            
           snr_check ^= ucComMF522Buf[i];        
       }        
       if (snr_check != ucComMF522Buf[i])        
       {            
           status = MI_ERR;        
       }    
   }    
   SetBitMask(CollReg, 0x80);    
   return status;
}

读取到的数据因为要显示在LCD屏幕上通过下列代码进行数据转换,4字节卡号转换为8个字符+ 1结束符

voidbyte_array_to_hex_string(unsignedchar *byte_array, int len, char *hex_string)
{    
    constchar hex_chars[] = "0123456789ABCDEF";    
    int i;    
    for (i = 0; i < len; i++)    
    {        
        hex_string[i * 2] = hex_chars[(byte_array[i] >> 4) & 0x0F];        
        hex_string[i * 2 + 1] = hex_chars[byte_array[i] & 0x0F];    
    }    
    hex_string[len * 2] = '\0'; // 添加字符串结束符
}

联网功能是通过AT指令控制Wi-Fi模块进行mqtt协议发送数据以及解包

voidESP8266_Init(void)
{    
    ESP8266_Clear();    
    printf("1. AT\r\n");    
    // OLED_Clear();     OLED_ShowString(0,0,"1.AT...",8);    
    while (ESP8266_SendCmd("AT\r\n", "OK"))        
        delay_1ms(500);    
    printf("2. CWMODE\r\n");    
    // OLED_ShowString(0,2,"2.CWMODE...",8);    
    while (ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))        
        delay_1ms(500);    
    printf("3. AT+CWDHCP\r\n");    
    // OLED_ShowString(0,4,"3.AT+CWDHCP...",8);    
    while (ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))        
        delay_1ms(500);    
    printf("4. CWJAP\r\n");    
    // OLED_ShowString(0,6,"4.CWJAP...",8);    
    while (ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))        
        delay_1ms(500);    
    printf("5. ESP8266 Init OK\r\n");    
    // OLED_Clear(); OLED_ShowString(0,0,"ESP8266 Init OK",16); delay_ms(500);
}

语音识别功能通过天问语音模块进行多线程控制

2.png

灯光、用户识别标志灯通过rt_device进行控制,手机APP为通过Vue2结构进行设计

<template>    
    <view class="container">        
        <!-- 头部标题 -->       
        <view class="header">            
            <text class="title">多媒体智能门禁系统</text>           
             <text class="subtitle">Multimedia Smart Access Control System</text>        
        </view>       
        <!-- 状态卡片区域 -->       
            <view class="cards-container">            
                <!-- 灯状态卡片 -->            
                    <view class="card">                
                        <view class="card-header">                    
                            <text class="card-title">灯光状态</text>                    
                            <view class="status-indicator" :class="{'active': led == 1}">
                        </view>                
                    </view>                
                    <view class="card-content">                    
                        <text class="status-text">{{ led == 1 ? '开启' : '关闭' }}</text>                
                    </view>            
                </view>           
                <!-- 门状态卡片 -->            
                <view class="card">                
                    <view class="card-header">                    
                        <text class="card-title">门状态</text>                    
                        <view class="status-indicator" :class="{'active': door == 1}">
                    </view>                
                </view>                
                <view class="card-content">                    
                    <text class="status-text">{{ door == 1 ? '开门' : '关门' }}</text>                
                </view>            
            </view>            
            <!-- 门禁卡信息卡片 -->            
            <view class="card">                
                <view class="card-header">                    
                    <text class="card-title">门禁卡</text>                
                </view>                
                <view class="card-content">                    
                    <view class="card-id-container" v-if="cardid">                        
                        <text class="card-id-number">{{ formatCardId(cardid) }}</text>                    
                    </view>                    
                    <text class="card-id-empty" v-else>无卡片信息</text>                
                </view>            
            </view>            
            <!-- 拍照时间戳卡片 -->            
            <view class="card">                
                <view class="card-header">                    
                    <text class="card-title">拍照时间</text>                
                </view>                
                <view class="card-content">                    
                    <text class="timestamp">{{ carmtime || '暂无记录' }}</text>                
                </view>            
            </view>        
        </view>        
        <!-- 控制区域 -->        
        <view class="control-section">            
            <view class="control-card">                
                <view class="control-header">                    
                    <text class="control-title">远程控制</text>                
                </view>                
                <view class="control-content">                    
                    <view class="control-item">                        
                        <text class="control-label">LED4 灯光控制</text>                        
                        <switch :checked="led4 == 1" @change="control_led4" color="#007AFF" />                    
                    </view>                    
                    <view class="control-item">                        
                        <text class="control-label">门锁控制</text>                        
                        <switch :checked="door == 1" @change="control_door" color="#28a745" />                    
                    </view>                
                </view>            
            </view>        
        </view>        
        <!-- 刷新按钮 -->        
        <view class="refresh-section">            
            <button class="refresh-btn" @click="fetchDevData">                
                <text class="refresh-text">刷新数据</text>            
            </button>        
        </view>    
    </view>
</template>
<script>    
    const 
    {        
        createCommonToken    
    } = require('@/key.js')    
    exportdefault {        
        data() {            
            return {                
                cardid: '',                
                led: 0,                
                led4: 0,                
                carmtime: '',                
                door: 0,                
                token: '',                
                timer: null // 用于存储定时器引用            
            }        
        },        
        onLoad() {            
            const params = {                
                author_key: 'EYxoRwKPv9tlGUFD9/szoA+vORbwmPj6azv5YJHvyGMtBgPNXXwaUZGOl/EoVxC2',                
                version: '2022-05-01',                
                user_id: '295961',            
            }            
            this.token = createCommonToken(params);        
        },        
        onShow() {            
            this.fetchDevData();            
            // 设置3秒自动刷新            
            this.timer = setInterval(()=>{                
                this.fetchDevData();            
            }, 3000);        
        },        
        onHide() {            
            // 页面隐藏时清除定时器,避免内存泄漏            
            if (this.timer) {                
                clearInterval(this.timer);                
                this.timer = null;            
            }       
         },        
         methods: {            
             //获取onenet上的数据            
             fetchDevData() {                
                 uni.request({                    
                     url: 'https://iot-api.heclouds.com/thingmodel/query-device-property',                     
                     method:'GET',                    
                     data: {                        
                         product_id:'ghCtwz980W',                        
                         device_name:'dmylgd32'                    
                     },                    
                     header: {                        
                         'authorization': this.token                     
                     },                   
                     success: (res) => {                        
                         console.log(res.data);                        
                         this.cardid = res.data.data[0].value;                        
                         this.carmtime = res.data.data[1].value;                        
                         this.led = res.data.data[3].value; // 数字值 1 或 0                        
                         this.led4 = res.data.data[4].value;                        
                         this.door = res.data.data[2].value; // 数字值 1 或 0                    
                     }                
                 });            
             },            
             control_led4(event) {                
                 console.log('LED4控制事件:', event);                
                 let value = event.detail.value;                
                 let ledValue = value ? 1 : 0;                
                 console.log('发送LED4控制命令:', { led4: ledValue });                
                 uni.request({                    
                     url: 'https://iot-api.heclouds.com/thingmodel/set-device-property',                     
                     method:'POST',                    
                     data: {                        
                         product_id:'ghCtwz980W',                        
                         device_name:'dmylgd32',                        
                         params:{ "led4": ledValue }                    
                     },                    
                     header: {                        
                         'authorization': this.token,                        
                         'Content-Type': 'application/json'                    
                     },                    
                     success: (res) => {                        
                         console.log('LED控制响应:', res);                        
                         if (res.statusCode === 200 && res.data && res.data.code === 200) {                            
                             console.log('LED控制成功');                            
                             uni.showToast({                                
                                 title: '控制成功',                                
                                 icon: 'success'                            
                             });                            
                             setTimeout(() => {                                
                                 this.fetchDevData();                            
                             }, 500);                        
                         } else {                            
                             console.log('控制失败:', res.data);                            
                             uni.showToast({                                
                                 title: '控制失败',                                
                                 icon: 'none'                            
                             });                        
                         }                    
                     },                    
                     fail: (err) => {                        
                         console.error('LED控制请求失败:', err);                        
                         uni.showToast({                            
                             title: '网络错误',                            
                             icon: 'none'                        
                         });                    
                     }                
                 });            
             },            
             control_door(event) {               
                 console.log('门控制事件:', event);                
                 let value = event.detail.value;                
                 let doorValue = value ? 1 : 0;                
                 console.log('发送门控制命令:', { door: doorValue });                
                 uni.request({                    
                     url: 'https://iot-api.heclouds.com/thingmodel/set-device-property',                     
                     method:'POST',                    
                     data: {                        
                         product_id:'ghCtwz980W',                        
                         device_name:'dmylgd32',                        
                         params:{ "door": doorValue }                    
                     },                    
                     header: {                        
                         'authorization': this.token,                       
                         'Content-Type': 'application/json'                    
                     },                   
                     success: (res) => {                        
                         console.log('门控制响应:', res);                        
                         if (res.statusCode === 200 && res.data && res.data.code === 200) {                            
                             console.log('门控制成功');                            
                             uni.showToast({                                
                                 title: '控制成功',                                
                                 icon: 'success'                           
                             });                            
                             setTimeout(() => {                                
                                 this.fetchDevData();                            
                             }, 500);                        
                         } else {                            
                             console.log('控制失败:', res.data);                            
                             uni.showToast({                                
                                 title: '控制失败',                                
                                 icon: 'none'                            
                             });                        
                         }                    
                     },                    
                     fail: (err) => {                        
                         console.error('门控制请求失败:', err);                        
                         uni.showToast({                            
                             title: '网络错误',                            
                             icon: 'none'                        
                         });                    
                     }                
                 });            
             },            
             // 格式化门禁卡ID显示            
             formatCardId(cardId) {                
                 if (!cardId) return'';                
                 // 每4位添加一个空格,提高可读性                
                 return cardId.replace(/(.{4})/g, '$1').trim();            
             }        
         }    
     }
</script>

来源:兆易创新

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。