涂鸦模组基于涂鸦SDK开发

一、为什么使用涂鸦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输出改变占空比得先关闭定时器再重新开启定时器 。
官网教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值