基于涂鸦智能的宠物喂食器
基于涂鸦智能的宠物喂食器
本次作品以涂鸦智能的VWXR2 wifi通信板为桥梁,以32为核心进行开发
本文章允许涂鸦智能转载使用。
项目地址
GitHub:https://github.com/PolarLights-Snow/predator
作品视频
bilibili:https://b23.tv/Zo8x93
硬件介绍
主控板:STM32F103C8T6最小系统板
联网模组:涂鸦三明治语音 Wi-Fi 通信板(VWXR2)
IOT云平台:涂鸦IOT平台
执行单元:LED模拟代表
系统框架
程序编写
1. 产品创建
参考涂鸦官方教程:五分钟快速入门
2. MCU SDK 移植
参考涂鸦官方教程:MCU SDK 移植
3.按键选择程序
本模块主要用来判断设备上的按键控制
void key_xz()
{
if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin)==1) //WiFi配网
{
printf("WIFI RST");
HAL_Delay(300);
if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin)==1)
{
mcu_reset_wifi(); //WIFI配网复位,ap 和 自动 切换
while(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin)==1);
}
}
if (HAL_GPIO_ReadPin(YY_JY_GPIO_Port, YY_JY_Pin)==1) //
{
printf("YY_JY \r\n");
HAL_Delay(9);
if (HAL_GPIO_ReadPin(YY_JY_GPIO_Port, YY_JY_Pin)==1)
{
mcu_get_system_time();
while(HAL_GPIO_ReadPin(YY_JY_GPIO_Port, YY_JY_Pin)==1);
}
}
if (HAL_GPIO_ReadPin(YY_DN_GPIO_Port, YY_DN_Pin)==1) //声音减小
{
printf("YY_DN");
HAL_Delay(9);
if (HAL_GPIO_ReadPin(YY_DN_GPIO_Port, YY_DN_Pin)==1)
{
if(YY_YL>0) YY_YL--;
set_speaker_voice(YY_YL); //设置语音-
while(HAL_GPIO_ReadPin(YY_DN_GPIO_Port, YY_DN_Pin)==1);
}
}
if (HAL_GPIO_ReadPin(YY_UP_GPIO_Port, YY_UP_Pin)==1) //声音增大
{
printf("YY_UP");
HAL_Delay(9);
if (HAL_GPIO_ReadPin(YY_UP_GPIO_Port, YY_UP_Pin)==1)
{
if(YY_YL<10) YY_YL++;
set_speaker_voice(YY_YL); //设置语音+
while(HAL_GPIO_ReadPin(YY_UP_GPIO_Port, YY_UP_Pin)==1);
}
}
if (HAL_GPIO_ReadPin(WS_GPIO_Port, WS_Pin)==1) //快速喂食
{
printf("WS_K");
HAL_Delay(9);
if (HAL_GPIO_ReadPin(WS_GPIO_Port, WS_Pin)==1)
{
mcu_dp_enum_update(DPID_FEED_STATE,1); //当前喂食状态 枚举型数据上报; 0:准备 1:喂食 2:完成
HAL_GPIO_WritePin(DJ_GPIO_Port,DJ_Pin,1);
HAL_Delay(300);
HAL_GPIO_WritePin(DJ_GPIO_Port,DJ_Pin,0);
mcu_dp_value_update(DPID_MANUAL_FEED,1);
while(HAL_GPIO_ReadPin(WS_GPIO_Port, WS_Pin)==1);
}
mcu_dp_enum_update(DPID_FEED_STATE,2); //当前喂食状态 枚举型数据上报; 0:准备 1:喂食 2:完成
}
}
4.WiFi状态指示灯
void get_wifi_status(unsigned char result)
{
switch(result) {
case 0:
//wifi工作状态1
HAL_GPIO_TogglePin(LED_wifi_GPIO_Port, LED_wifi_Pin);
HAL_Delay(100);
break;
case 1:
//wifi工作状态2
HAL_GPIO_TogglePin(LED_wifi_GPIO_Port, LED_wifi_Pin);
HAL_Delay(1000);
break;
case 2:
//wifi工作状态3
break;
case 3:
//wifi工作状态4
break;
case 4:
//wifi工作状态5
HAL_GPIO_WritePin(LED_wifi_GPIO_Port, LED_wifi_Pin, GPIO_PIN_RESET);
break;
case 5:
//wifi工作状态6
break;
case 6:
//wifi工作状态7
HAL_GPIO_TogglePin(LED_wifi_GPIO_Port, LED_wifi_Pin);
break;
default:break;
}
}
5.云端数据下发处理函数
本函数主要用来处理用户通过涂鸦云平台下发的指令
/**
* @brief dp下发处理函数
* @param[in] {dpid} dpid 序号
* @param[in] {value} dp数据缓冲区地址
* @param[in] {length} dp数据长度
* @return dp处理结果
* - 0(ERROR): 失败
* - 1(SUCCESS): 成功
* @note 该函数用户不能修改
*/
unsigned char dp_download_handle(unsigned char dpid,const unsigned char value[], unsigned short length)
{
/*********************************
当前函数处理可下发/可上报数据调用
具体函数内需要实现下发数据处理
完成用需要将处理结果反馈至APP端,否则APP会认为下发失败
***********************************/
unsigned char ret;
switch(dpid) {
case DPID_MEAL_PLAN:
//喂食计划处理函数
ret = dp_download_meal_plan_handle(value,length); //
break;
case DPID_QUICK_FEED:
//自动喂食开关处理函数
ret = dp_download_quick_feed_handle(value,length);
break;
case DPID_MANUAL_FEED:
//手动喂食处理函数
ret = dp_download_manual_feed_handle(value,length);
break;
case DPID_FACTORY_RESET:
//恢复出厂处理函数
ret = dp_download_factory_reset_handle(value,length);
break;
case DPID_VOICE_TIMES:
//语音播放次数处理函数
ret = dp_download_voice_times_handle(value,length);
break;
case DPID_SWITCH:
//开关处理函数
ret = dp_download_switch_handle(value,length);
break;
default:
break;
}
return ret;
}
6.手动喂食指令处理函数
/*****************************************************************************
函数名称 : dp_download_manual_feed_handle
功能描述 : 针对DPID_MANUAL_FEED的处理函数
输入参数 : value:数据源数据
: length:数据长度
返回参数 : 成功返回:SUCCESS/失败返回:ERROR
使用说明 : 可下发可上报类型,需要在处理完数据后上报处理结果至app
*****************************************************************************/
static unsigned char dp_download_manual_feed_handle(const unsigned char value[], unsigned short length)
{
//示例:当前DP类型为VALUE
unsigned char ret;
unsigned long manual_feed;
manual_feed = mcu_get_dp_download_value(value,length);
/*
//VALUE类型数据处理
*/
for(int i=0;i< manual_feed;i++)
{
mcu_dp_enum_update(DPID_FEED_STATE,1); //当前喂食状态 枚举型数据上报; 0:准备 1:喂食 2:完成
HAL_GPIO_WritePin(DJ_GPIO_Port,DJ_Pin,1);
HAL_Delay(300);
HAL_GPIO_WritePin(DJ_GPIO_Port,DJ_Pin,0);
HAL_Delay(300);
}
mcu_dp_enum_update(DPID_FEED_STATE,2); //当前喂食状态 枚举型数据上报; 0:准备 1:喂食 2:完成
//处理完DP数据后应有反馈
ret = mcu_dp_value_update(DPID_MANUAL_FEED,manual_feed);
if(ret == SUCCESS)
return SUCCESS;
else
return ERROR;
}
7.语音方案的配置
配置方法参考涂鸦教程:语音方案配置教程
作品语音方案展示: