一、为什么使用涂鸦SDK而不是涂鸦MCU。
我使用的是CBU(EDZU)型号,带WIFI,BLE。
-
涂鸦SDK开发优势
- 1,节约成本,SDK开发直接将涂鸦模组作为mcu使用
- 2,联网速度,响应速度,稳定性相对更快。
-
3,操作简单,不用那么麻烦的AT指令还得处理异常情况相当麻烦。
因此我只会在运行极其复杂的情况下,才考虑MCU开发,不过物联网项目大多都没什么吃计算性能的情况。
二、涂鸦SDK开发步骤
1,下载虚拟机,安装Ubuntu。
2,安装vscode。
3,打开vscode 安装Tuya Wind IDE 插件。
4,运行Tuya Wind IDE插件 ,插件中可以直接下载源码。
5,在Tuya Wind IDE 插件中有新手步骤教你如何编译,和参考示例。
6,编译后通过共享文件夹将固件copy到win系统中。打开bk_writer_gui_V1.6.3.exe工具准备烧录。
7.接好串口 RX ,TX ,将CEN(复位引脚接地)或者断电重新上电即可开始烧录
三、注意事项
1,编译出错可能需要 在vscode 底部命令行界面输入 su 后获得root权限再编译
四、常用函数
4.1 数据上传
VOID_T update_all_dp(VOID_T)
{
OPERATE_RET op_ret = OPRT_OK;
INT_T dp_cnt = 2; /* update DP number */
/* no connect router, return */
GW_WIFI_NW_STAT_E wifi_state = STAT_LOW_POWER;
get_wf_gw_nw_status(&wifi_state);
if (wifi_state <= STAT_AP_STA_DISC || wifi_state == STAT_STA_DISC) {
return;
}
TY_OBJ_DP_S *dp_arr = (TY_OBJ_DP_S *)tal_malloc(dp_cnt*SIZEOF(TY_OBJ_DP_S));
if(NULL == dp_arr) {
TAL_PR_ERR("malloc failed");
return;
}
dp_arr[0].dpid = VALUE_DP1; /* DP ID 这个是涂鸦创建变量的地方*/
dp_arr[0].type = PROP_VALUE; /* DP type */
dp_arr[0].time_stamp = 0;
dp_arr[0].value.dp_value = value_status1; /* DP data */
dp_arr[1].dpid = VALUE_DP2; /* DP ID */
dp_arr[1].type = PROP_ENUM; /* DP type */
dp_arr[1].time_stamp = 0;
dp_arr[1].value.dp_value = value_status2; /* DP data */
/* report DP */
op_ret = dev_report_dp_json_async(NULL ,dp_arr, dp_cnt);
/* free requested memory space */
tal_free(dp_arr);
dp_arr = NULL;
if(OPRT_OK != op_ret) {
TAL_PR_ERR("dev_report_dp_json_async relay_config data error,err_num",op_ret);
}
return;
}
4.2 数据接收
STATIC VOID_T __soc_dev_obj_dp_cmd_cb(IN CONST TY_RECV_OBJ_DP_S *dp)
{
TAL_PR_DEBUG("SOC Rev DP Obj Cmd t1:%d t2:%d CNT:%u", dp->cmd_tp, dp->dtt_tp, dp->dps_cnt);
if( dp->dps->dpid ==101){//接收来自101的数据点
LED_flag =dp->dps->value.dp_bool;//获取到101数据点的值
TAL_PR_DEBUG("flag =dp->dps->value.dp_bool%d",LED_flag);
update_switch_dp(LED_flag);
}
return;
}
4.3 串口发送与接收
TUYA_UART_NUM_0就是烧录的串口也就是硬件引脚标注的RX1 TX1 。TUYA_UART_NUM_1是调试口也就是TX2 波特率115200
中断接收有点问题,我还不会,配置不了进入中断函数。搞懂了再看更新这部分吧
//串口初始化函数
VOID mf_uart0_init_callback(UINT_T baud, UINT_T bufsz)
{
TAL_UART_CFG_T cfg;
memset(&cfg, 0, sizeof(TAL_UART_CFG_T));
cfg.open_mode = O_BLOCK;
cfg.base_cfg.baudrate = baud;
cfg.base_cfg.databits = TUYA_UART_DATA_LEN_8BIT;
cfg.base_cfg.parity = TUYA_UART_PARITY_TYPE_NONE;
cfg.base_cfg.stopbits = TUYA_UART_STOP_LEN_1BIT;
cfg.rx_buffer_size = bufsz;
cfg.base_cfg.flowctrl = TUYA_UART_FLOWCTRL_NONE;
tal_uart_init(TUYA_UART_NUM_0, &cfg);
return;
}
//函数调用
mf_uart0_init_callback(9600,256);
//串口发送
BYTE_T test_data1[] = {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
tuya_uart_send(TUYA_UART_NUM_0, test_data1, sizeof(test_data1));
//串口轮询接收函数定义 让它在线程中调用。
void poll_uart_data() {
UCHAR_T recv_buf[256]={0};
UCHAR_T recv_len =0;
recv_len = tal_uart_read(TUYA_TIMER_NUM_0, recv_buf, 200);
}
4.4 flash 写入读取函数
wd_common_write("my", "hello", 3);
BYTE_T *value = NULL;
UINT_T len = 0;
wd_common_read("my", &value, &len);
TAL_PR_NOTICE("my_FLASH_READ:%s",value);
五、结尾
1,本篇文章包含了几个非常重要的部分,就是数据上传,下发,串口发送,串口接收。 IO控制 ,IO读取的话历程直接有了,不赘述。基本满足了大多数场景。
2,后续会补充,TIM,ADC,PWM。
PWM我做了呼吸灯,不过这个PWM输出改变占空比得先关闭定时器再重新开启定时器 。
官网教程