打印
[uCOS/RTOS]

【RT_Thread作品修】智能监控(半成品)

[复制链接]
2049|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luoorshi|  楼主 | 2020-6-30 13:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 luoorshi 于 2020-6-30 13:28 编辑

作者:落拾
一、概述
本次作品采用官方提供的麻雀一号开发板,具体就不介绍该开发板的具体内容了。说说该开发板的硬件匹配吧:
摄像头:作为视频监控
显示屏:可以作为设置时使用的监视屏(不使用时可以睡眠lcd_enter_sleep)、视频对话(暂时还未实现)。
MIC:音频采集、视频对话(暂时还未实现)
喇叭:可以实现报警,视频对话(暂时还未实现)
TF卡:作为视频暂存
二、RT_Thread使用情况
说实话作为一个刚刚使用嵌入式系统  还没有转变过来思维的人   我也不知道使用了那些。带后续仔细了解后更新吧。

三、硬件框架
主要硬件为麻雀一号

四、软件框架
该软件主要基于官方源码修改以下内容
1、在bk7221u_release\components\player\example\cmd\cmd_player.c内添加代码播放固定音源
2、将bk7221u_release\test\show_photo_test.c内的代码添加将图片发送到网络
3、在bk7221u_release\drivers\wlan\drv_wlan.c内添加新函数,通过线程调用读取flash内的wifi的ssid  和password
后续需要添加
1、将mic采集的音频参数发送到网络
2、修改蓝牙代码 使用蓝牙控制

五、软件模块说明
本代码主要有三大模块具体实现如下
1、音频播放模块

/**********************************************************
* 函数名:player_my
* 参数:
* action:动作值,0:stop
* uri:地址可以为空
* vol:音量
* 返回值:
* RT_EOK:无错误
* RT_ERROR:有错误,具体看log
* 函数功能:控制MP3播放
* ********************************************************/

    #define stop_p 0
    #define star_P 1
    #define pause_P 2
    #define resume_p 3
int player_my(char action,char *uri,char vol)
{
    switch(action)
    {
        case stop_p:
            rt_kprintf("//////////////////////////// player_stop \n");
            player_stop();
            rt_kprintf("//////////////////////////// player_stop end \n");
            rt_kprintf("stop play.\n");
            break;
        case star_P:
            if(uri !=RT_NULL)
            {
                rt_kprintf("//////////////////////////// player_play \n");
                player_stop();
                player_set_uri(uri);
                player_play();
                rt_kprintf("//////////////////////////// player_play end \n");
                if(vol>0 && vol<100)
                {
                    player_set_volume(vol);
                    rt_kprintf("set play volume %d%%.\n", vol);
                }
            }else
            {
                rt_kprintf("url == null\n");
                return RT_ERROR;
            }
            break;
        case pause_P:
            rt_kprintf("//////////////////////////// player_pause \n");
            player_pause();
            rt_kprintf("//////////////////////////// player_pause end \n");
            rt_kprintf("pause play.\n");
            break;
        case resume_p:
            rt_kprintf("//////////////////////////// player_play(resume) \n");
            player_play();
            rt_kprintf("//////////////////////////// player_play(resume) end \n");
            rt_kprintf("resume play.\n");
            break;
        default :
            rt_kprintf("action ERROR\n");
            return RT_ERROR;
    }

}


2、视频模块

该模块直接使用现有函数showphoto_thread进实现代码。由于希望将该摄像头的图片直接拍摄保存成图片,故去掉该函数的start_flag标志位判断。启动还是需要通过串口启动,后续准备使用蓝牙启动。


3、wifi模块

以下代码用于保存wifi密码和读取wifi密码
代码通过将账号和密码保存到txt文件实现(也可以保存成其他文件)
/****************************************************
* save_wifi_password
* 参数:
* ssid:ID
* password:密码
* 返回值:
* RT_EOK:无错误
* RT_ERROR:有错误,具体看log
* 函数功能:保存wifi ID和密码
****************************************************/
int save_wifi_password(char *ssid,char *password)
{
    int fb_ssid,fb_password;

    fb_ssid = open("/sd/wifi_ssid.txt", O_WRONLY | O_CREAT);
    if(fb_ssid==NULL)
    {
        rt_kprintf("open file error!");
        return RT_ERROR;
    }else
    {
        write(fb_ssid,ssid,sizeof(ssid));
        close(fb_ssid);
    }

    fb_password = open("/sd/wifi_password.txt", O_WRONLY | O_CREAT);
    if(fb_password==NULL)
    {
        rt_kprintf("open file error!");
        return RT_ERROR;
    }else
    {
        write(fb_password,password,sizeof(password));
        close(fb_password);
    }
    return RT_EOK;
}



/****************************************************
* 函数名:join_flsh_wifi
* 参数:
*
* 返回值:
* RT_EOK:无错误
* RT_ERROR:有错误,具体看log
* 函数功能:加入wifi
****************************************************/

int join_flsh_wifi(void)
{
    network_InitTypeDef_st wNetConfig;
    struct rt_wlan_device *wlan = RT_NULL;
    char *ssid = RT_NULL;
    char *password = RT_NULL;
    int len;
    int fb_ssid,fb_password;

    fb_ssid = open("/sd/wifi_ssid.txt", O_RDONLY | O_CREAT);
   
    if(fb_ssid==0)
    {
        rt_kprintf("open file:/sd/wifi_ssid.txt error!");
        return -RT_ERROR;
    }else
    {
        read(fb_ssid,ssid,32);
        close(fb_ssid);
    }
   
    fb_password = open("/sd/wifi_password.txt", O_RDONLY | O_CREAT);
    if(fb_password==0)
    {
        rt_kprintf("open file:/sd/wifi_password.txt error!");
        return -RT_ERROR;
    }else
    {
        read(fb_password,password,32);
        close(fb_password);
    }


    rt_memset(&wNetConfig, 0x0, sizeof(network_InitTypeDef_st));

    if (ssid == NULL)
    {
        rt_kprintf("ssid is null\r\n");
        return -RT_ERROR;
    }

    len = rt_strlen(ssid);
    rt_kprintf("ssid len = %d\r\n",len);
    if (32 < len)
    {
        rt_kprintf("ssid name more than 32 Bytes\r\n");
        return -RT_ERROR;
    }

    rt_strncpy((char *)wNetConfig.wifi_ssid, ssid, sizeof(wNetConfig.wifi_ssid));

    if (password == NULL)
    {
        rt_memset(wNetConfig.wifi_key, 0, sizeof(wNetConfig.wifi_key));
    }
    else
    {
        if (sizeof(wNetConfig.wifi_key) < rt_strlen(password))
        {
            rt_kprintf("wifi key is more than %d Bytes\r\n", sizeof(wNetConfig.wifi_key));
            return -RT_ERROR;
        }
        rt_strncpy((char *)wNetConfig.wifi_key, password, sizeof(wNetConfig.wifi_key));
    }

    wNetConfig.wifi_mode = STATION;
    wNetConfig.dhcp_mode = DHCP_CLIENT;
    wNetConfig.wifi_retry_interval = 100;

    rt_kprintf("join_flsh_wifi: ssid:%.*s key:%.*s\r\n", wNetConfig.wifi_ssid, wNetConfig.wifi_key);
    bk_wlan_start(&wNetConfig);

    return RT_EOK;
}

六、演示效果

由于现在已经变砖,无法看到实际效果 请参考代码


七、代码
半成品代码
https://wws.lanzous.com/iokMMe68y6d














使用特权

评论回复

相关帖子

沙发
luoorshi|  楼主 | 2020-7-6 23:36 | 只看该作者
添加附件  并求麻雀的 救砖模块

【RT_Thread作品修】智能监控(半成品).pdf

261.6 KB

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

7

帖子

0

粉丝