2097|0

1668

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

基于MM32与M26物联网入门:远程呼叫及开锁 [复制链接]

 
应用场景
适用于庭院大门,当有来客呼叫时,实现手动开锁、远程开锁的功能;

 

应用功能
通过MM32主控芯片与M26 2G通讯模块与远程服务器进行连接,当有访客按下CALL按键时,本地响应门铃(本应用暂未接门铃),同时进行远程呼叫;户主可以通过OPEN按键直接给访客开门,也可以通过服务器发送OPEN指令进行远程开门;
 
在没有访客呼叫时,MM32与服务器之间每间隔10秒钟进行一次心跳包传输,以保证与服务器之间SOCKET链路的连接;

 

在有访客呼叫时,若没有进行开锁动作,则每间隔3秒钟向服务器端发送一个呼叫指令;当接收到服务器端OPEN开锁命令时,执行开锁动作,开锁时间保持3秒钟,开销期间并向服务器反馈开锁是否成功的状态;

 

硬件模块
在网上淘到一块基于M262G通讯板,将主控MCU替换成MM32F0273D6P,这样省去了通讯板的设计及绘制,因为之前做过不少的工业远程控制项目,所以对通讯板的原理、控制都已经很熟悉了;通讯板如下图所示,带有5个接口及一个用户自己定义按键:1路光耦输出控制、2路带极性的光耦输入采集、1路无极性的光耦输入采集、以及1UART程序烧录接口;
 
对硬件设计进行分析后,正好满足我们当前的硬件需求:1路光耦输出控制用于门锁的控制、2路带极性的光耦输入采集用于手动开锁按键和门外的呼叫按键、最后1路无极性的光耦输入采集则用于门锁的开关状态检测(我们选用的电磁锁是带有开关状态输出的);
 
为什么选用MM32F0273D6P这个芯片呢?基于通讯板,我们需要一个LQFP48封装的芯片,其次MM32F0273D6P是一个32位的Cortex-M0的控制芯片,最高工作主频可达到96MHz,运行速度够快;带有128KB FLASH程序存储空间,以及16KB SRAM的运行内存,能够满足在物联网工程项目功能上的应用;最后就是通讯板是通过UART下载程序的,MM32F0273D6P出厂自带了ISP功能,可以通过BOOT引脚来选择启动程序,配合上位机软件实现程序的烧录。
 
原理图设计
除了通讯板之外,我们还需要另外一块硬件单板配合演示/调试,功能如下:2个按键(1个手动开锁按键、1个门外呼叫按键)、1个门锁开关控制电路(继电器控制方式)、1个门锁开关状态检测电路(用于检测门锁的开关状态,以及确认门锁控制是否正常),最后就是开发板的供电(5V)以及门锁供电(12V);原理图如下所示:

 

PCB设计3D效果图

 

整机实物图
 
功能实现代码:按键检测及处理
/*******************************************************************************

 * [url=home.php?mod=space&uid=159083]@brief [/url]       

 * @param       

 * @retval      

 * [url=home.php?mod=space&uid=1020061]@attention [/url]   

*******************************************************************************/

void KEY_SubScan(uint8_t *State, uint8_t *Count, uint8_t Value, char *Name)

{

    if(*State == 0)

    {

        if(Value == Bit_RESET) *Count += 1;

        else                   *Count  = 0;



        if(*Count > 5)

        {

            *Count = 0; *State = 1;

            printf("\r\n%s Pressed", Name);



            if(strcmp(Name, "OPEN") == 0)

            {

                BSP_LOCK_Control(LOCK_MODE_MANUAL, ENABLE);



                if(RemoteState != 0)

                {

                    RemoteState = 0;

                    M26_SendMessage("Manual Open The Door!");

                }

            }

        }

    }

    else

    {

        if(Value != Bit_RESET) *Count += 1;

        else                   *Count  = 0;



        if(*Count > 5)

        {

            *Count = 0; *State = 0;

            printf("\r\n%s Release", Name);



            if(strcmp(Name, "OPEN") == 0)

            {

                BSP_LOCK_Control(LOCK_MODE_MANUAL, DISABLE);

            }

            else if(strcmp(Name, "CALL") == 0)

            {

                if(RemoteState == 0)

                {

                    RemoteState = 1;

                    M26_SendMessage("Calling...");

                }

            }

        }

    }

}





/*******************************************************************************

 * @brief       

 * @param       

 * @retval      

 * @Attention   

*******************************************************************************/

void KEY_Scan(void)

{

    static uint8_t KeyState[3] = {0, 0, 0};

    static uint8_t KeyCount[3] = {0, 0, 0};



    KEY_SubScan(&KeyState[0], &KeyCount[0], GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11), "KEY");

    KEY_SubScan(&KeyState[1], &KeyCount[1], GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8), "CALL");

    KEY_SubScan(&KeyState[2], &KeyCount[2], GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4), "OPEN");

}

 

功能实现代码:M26启动及配置
uint8_t  M26_Buffer[1000];

uint16_t M26_Length  =  0;





/*******************************************************************************

 * @brief       

 * @param       

 * @retval      

 * @Attention   

*******************************************************************************/

void M26_InitBuffer(void)

{

    M26_Length = 0;

    memset(M26_Buffer, 0, sizeof(M26_Buffer));

}





/*******************************************************************************

 * @brief       

 * @param       

 * @retval      

 * @Attention   

*******************************************************************************/

void M26_SendData(uint8_t Data)

{

    UART_SendData(UART2, Data);

    while(UART_GetFlagStatus(UART2, UART_IT_TXIEN) == RESET);

}





/*******************************************************************************

 * @brief       

 * @param       

 * @retval      

 * @attention   

*******************************************************************************/

void M26_SendString(char *str)

{

    while(*str)

    {

        M26_SendData(*str++);

    }

}





/*******************************************************************************

 * @brief       

 * @param       

 * @retval      

 * @attention   

*******************************************************************************/

uint32_t M26_AT_WaitForReply(char *Keyword, uint32_t Timeout)

{

    M26_InitBuffer();



    while(Timeout--)

    {

        if(QUEUE_EMPTY(QUEUE_M26_RX_IDX) == 0)

        {

            M26_Buffer[M26_Length++] = QUEUE_READ(QUEUE_M26_RX_IDX);



            if(strstr((char *)M26_Buffer, Keyword) != NULL)

            {

                printf("\r\n%s", (char *)M26_Buffer);break;

            }

        }



        SysTick_DelayMS(1);

    }



    return Timeout;

}





/*******************************************************************************

 * @brief       

 * @param       

 * @retval      

 * @attention   

*******************************************************************************/

uint32_t M26_AT_SendCommand(char *Command, char *Response, uint32_t Timeout)

{

    if(Command != NULL)

    {

        M26_SendString(Command);

        M26_SendString("\r\n");

    }



    if(Timeout != 0)

    {

        return (Timeout - M26_AT_WaitForReply(Response, Timeout));

    }

    else

    {

        return 1;

    }

}





/*******************************************************************************

 * @brief       

 * @param       

 * @retval      

 * @attention   

*******************************************************************************/

void M26_SendMessage(char *str)

{

    char Buffer[200];



    memset(Buffer, 0, sizeof(Buffer));



    sprintf(Buffer, "AT+QISEND=0,%d", strlen(str));



    M26_AT_SendCommand(Buffer, ">", 1000);



    M26_SendString(str);



    printf("\t%dms", M26_AT_SendCommand(NULL, "SEND OK", 1000));

}





/*******************************************************************************

 * @brief       

 * @param       

 * @retval      

 * @attention   

*******************************************************************************/

void M26_AT_Startup(void)

{

    printf("\t%dms", M26_AT_SendCommand(NULL, "RDY",          10000));

    printf("\t%dms", M26_AT_SendCommand(NULL, "+CFUN: 1",     10000));

    printf("\t%dms", M26_AT_SendCommand(NULL, "+CPIN: READY", 10000));

    printf("\t%dms", M26_AT_SendCommand(NULL, "Call Ready",   10000));

    printf("\t%dms", M26_AT_SendCommand(NULL, "SMS Ready",    10000));

    printf("\t%dms", M26_AT_SendCommand("AT", "OK",           10000));



    while(M26_AT_SendCommand("AT+CSQ", "OK", 500) != 0)

    {

        if(strstr((char *)M26_Buffer, "99,99") == NULL)

        {

            break;

        }



        SysTick_DelayMS(500);

    }





    M26_AT_SendCommand("AT+CCID",   "OK", 500);



    M26_AT_SendCommand("AT+COPS?",  "OK", 500);



    M26_AT_SendCommand("AT+CREG?",  "OK", 500);



    M26_AT_SendCommand("AT+CGATT?", "OK", 500);





    M26_AT_SendCommand("AT+QIFGCNT=0", "OK", 500);



    M26_AT_SendCommand("AT+QICSGP=1,\"CMMTM\"", "OK", 500);



    M26_AT_SendCommand("AT+QIDNSIP=1", "OK", 500);



    M26_AT_SendCommand("AT+QIMUX=1", "OK", 500);



    M26_AT_SendCommand("AT+QIOPEN=0,\"TCP\",\"xld0932.xicp.net\",10520", NULL, 0);



    printf("\t%dms", M26_AT_SendCommand(NULL, "CONNECT OK", 20000));

}

 

功能实现代码:呼叫及开锁控制
下载附件  保存到相册

2022-3-17 07:29 上传

 
ISP下载程序
 
系统启动&M26初始化配置
 
呼叫后手动开锁
 
呼叫后远程开锁

 

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表