一、开发前准备
本项目的软件开发是基于涂鸦云平台的,所以需要在涂鸦的IoT平台进行产品创建,使用的也是涂鸦现在主推的CBU模组。涂鸦IoT云平台只能使用涂鸦的模组,因为只有涂鸦授权后的产品才能连上涂鸦云。好在涂鸦的最近的活动比较多,可以参加涂鸦的活动获(bai)取(piao)模组。
涂鸦的SDK编译一般是在Linux下进行编译开发的,所以可能需要大家安装下虚拟机,windows下好像也是可以的,但是编译速度有点慢。
下面是开发中会使用到的链接:
涂鸦IoT平台
CBU开发SDK环境
本项目代码github地址
CBU模组规格书
二、功能需求
序号 | 功能 |
---|---|
1、 | 三种模式风(正常风,自然风:忽大忽小间隔15秒,睡眠风:每隔一小时自动降档,最后降到最低档) |
2、 | 编码器旋转控制风扇,顺时针旋转风速+,逆时针旋转风速- 。 |
3、 | 编码器按钮短按切换模式,长按设备复位。 |
4、 | 4颗指示灯显示风速,4颗指示灯指示8档风速,闪烁代表1档,常量代表2档。4颗指示灯还复用本地定时指示。 |
5、 | 本地定时功能,时间到自动关机。定时按键:无定时->1小时->2小时->3小时->4小时->无定时。 |
6、 | 电源按键,风扇工作状态按下后关闭风扇,风扇处于关闭状态按下后打开风扇。 |
7、 | 长按 WiFi 按键,设备进入配网模式。 |
8、 | LED有8颗,除指示风速4颗LED外,还有4颗指示灯。一颗 WiFi 指示灯,指示 WiFi 状态;其他三颗指示当前风扇模式 |
9、 | led指示灯亮度可通过APP调整,正常亮度,较暗亮度。 |
10、 | 断电记忆 |
三、产品创建
进入 Tuya IoT 平台 ,创建产品->标准类目->小家电->风扇->风扇->填入产品信息->选择DP点->选择面板->选择涂鸦标准模组SDK开发,选择对应的模组。
代码编译完成后将生成的固件上传,具体信息填入,参考该链接下文档 。上传完固件后,后期也可以更新固件进行OTA,这个功能用起来也是十分方便的。
四、烧录、授权
前面说过了如果想上涂鸦云是模组是需要授权的,那么如何烧录授权呢?这是涂鸦官方文档关于烧录的介绍,这里在开发过程中强烈推荐使用烧录授权分立方案,即烧录UA(应用区)固件。
QIO、UA、UG文件是什么意思上面的官方文档里已经有了详细的介绍,我这里就不再复述了。
芯片烧录工具下载地址
五、功能开发
1、配网及配网指示灯显示
调用该函数 tuya_iot_wf_gw_unactive()
以进入配网模式,涂鸦 SDK 对于网络状态的定义有以下几种:
typedef BYTE_T GW_WIFI_NW_STAT_E;
#define STAT_LOW_POWER 0 // idle status,use to external config network
#define STAT_UNPROVISION 1 // smart config status
#define STAT_AP_STA_UNCFG 2 // ap WIFI config status
#define STAT_AP_STA_DISC 3 // ap WIFI already config,station disconnect
#define STAT_AP_STA_CONN 4 // ap station mode,station connect
#define STAT_STA_DISC 5 // only station mode,disconnect
#define STAT_STA_CONN 6 // station mode connect
#define STAT_CLOUD_CONN 7 // cloud connect
#define STAT_AP_CLOUD_CONN 8 // cloud connect and ap start
#define STAT_REG_FAIL 9 // register fail
#define STAT_OFFLINE 10 // offline
#define STAT_MQTT_ONLINE 11
#define STAT_MQTT_OFFLINE 12
#define STAT_UNPROVISION_AP_STA_UNCFG 13 //smart-cfg and ap-cfg concurrent config status
长按进入配网模式功能实现:
STATIC VOID wifi_key_process(TY_GPIO_PORT_E port,PUSH_KEY_TYPE_E type,INT_T cnt)
{
PR_DEBUG("port:%d,type:%d,cnt:%d",port,type,cnt);
OPERATE_RET op_ret = OPRT_OK;
UCHAR_T ucConnectMode = 0;
if (port = WIFI_KEY_PIN) {
if (LONG_KEY == type) {
//press long enter linking network
PR_NOTICE("key long press");
/* 手动移除设备 */
tuya_iot_wf_gw_unactive();
} else if (NORMAL_KEY == type) {
PR_NOTICE("key normal press");
} else {
PR_NOTICE("key type is no deal");
}
}
return;
}
STATIC VOID wifi_config_init(VOID)
{
OPERATE_RET op_ret = OPRT_OK;
/* LED 相关初始化 */
tuya_gpio_inout_set(WIFI_LED_PIN, FALSE);
tuya_set_led_light_type(wifi_led_handle, OL_HIGH, 0, 0); //关闭 led
/* LED 相关初始化 */
op_ret = tuya_create_led_handle(WIFI_LED_PIN, TRUE, &wifi_led_handle);
if (op_ret != OPRT_OK) {
PR_ERR("key_init err:%d", op_ret);
return;
}
tuya_set_led_light_type(wifi_led_handle, OL_HIGH, 0, 0);
/* 按键相关初始化 */
KEY_USER_DEF_S key_def;
op_ret = key_init(NULL, 0, WIFI_KEY_TIMER_MS);
if (op_ret != OPRT_OK) {
PR_ERR("key_init err:%d", op_ret);
return;
}
/* 初始化 key 相关参数 */
memset(&key_def, 0, SIZEOF(key_def));
key_def.port = WIFI_KEY_PIN; //按键引脚
key_def.long_key_time = WIFI_KEY_LONG_PRESS_MS; //长按时间配置
key_def.low_level_detect = WIFI_KEY_LOW_LEVEL_ENABLE; //TRUE:低电平算按下,FALSE:高电平算按下
key_def.lp_tp = LP_ONCE_TRIG; //
key_def.call_back = wifi_key_process; //按键按下后回调函数
key_def.seq_key_detect_time = WIFI_KEY_SEQ_PRESS_MS; //连按间隔时间配置
/* 注册按键 */
op_ret = reg_proc_key(&key_def);
if (op_ret != OPRT_OK) {
PR_ERR("reg_proc_key err:%d", op_ret);
}
return;
}
这里对于wifi 状态的做出的提示如下:
STATIC VOID wifi_state_led_reminder(IN CONST GW_WIFI_NW_STAT_E cur_stat)
{
switch (cur_stat)
{
case STAT_LOW_POWER: //wifi 连接超时,进入低功耗模式
tuya_set_led_light_type(wifi_led_handle, OL_HIGH, 0, 0); //关闭提示灯
break;
case STAT_UNPROVISION: //SamrtConfig 配网模式,等待连接
tuya_set_led_light_type(wifi_led_handle, OL_FLASH_HIGH, WIFI_LED_FAST_FLASH_MS, 0xffff); //led 快闪
break;
case STAT_AP_STA_UNCFG: //ap 配网模式,等待连接
tuya_set_led_light_type(wifi_led_handle, OL_FLASH_HIGH, WIFI_LED_LOW_FLASH_MS, 0xffff); //led 慢闪
break;
case STAT_AP_STA_DISC:
case STAT_STA_DISC: //SamrtConfig/ap 正在连接中
tuya_set_led_light_type(wifi_led_handle, OL_HIGH, 0, 0); //关闭 led
break;
case STAT_CLOUD_CONN:
case STAT_AP_CLOUD_CONN: //连接到涂鸦云
tuya_set_led_light_type(wifi_led_handle, OL_LOW, 0, 0)