luoorshi 发表于 2020-6-30 13:28

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

本帖最后由 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

添加附件并求麻雀的 救砖模块
页: [1]
查看完整版本: 【RT_Thread作品修】智能监控(半成品)