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