文章目录[隐藏]
开发板购买
当然 肯定得先创 账号
官网商店:https://iot.tuya.com/purchase/store?page=1&tag=dev_board&q=
购买的 涂鸦三明治BLE SoC 主控板(BT3L)
相关资料可参考官方文档BT3L 模组规格书:https://developer.tuya.com/cn/docs/iot/br3l?id=K97rpns8f6xwh
还需要实名认证(好吧)
付完钱后等货
到货后实物展示
环境搭建
参考官网文档:https://developer.tuya.com/cn/docs/iot/development-guide?id=Kaiuyncrmvf3z
Arduino IDE我本机就有;
STlink驱动 先装了再说;
IDE添加STM32开发板,GitHub下载很慢(折磨);
STM32CubeProgrammer(添加/bin 到环境变量)
烧录相关
Jlink驱动 (我没装)
涂鸦云模组烧录授权平台(需要账号登录 https://pms.tuya.com/login)
IDE添加tuya SDK库
手机APP 添加 开发板 简单测试
1、安装 智能生活 和 涂鸦云测 APP
安装 涂鸦APP(智能生活)我这应用商店可以直接搜到。
生活 官方链接:https://smartapp.tuya.com/smartlife
云测 官网链接:https://smartapp.tuya.com/smartautoapp
2、开发板上电
涂鸦三明治蓝牙 SoC 主控板(BT3L) 的原理图
你可以用其他板子给开发板供电,如stm32(3.3V GND)
或者上 USB转TTL
我这是直接将开发板插在了 创客Arduino Uno Rev3上。
3、运行 APP,添加设备(可以扫到 但添加失败了 不确定是不是我个人原因)
点击右上角+,选择“添加设备”
开发板上电,出厂不知道烧了啥程序,我们添加上看看
添加失败
莫非出厂不是默认的配网模式,查看官方文档 Arduino 接入涂鸦快速入门 ,BLE SoC 主控板(BT3L)
那我们按下 开发板上的按钮康康,点按没有反应,长按 LED2亮了,在添加依然失败,呃···
可能是因为我接着BT3L烧程序的缘故,不知道咋滴扫描不到了,哎。(其实就是处于已配网状态)
尝试问题调试(失败)
接上 USB转TTL 波特率9600,收到数据如下:
查看了官方提供的蓝牙mesh协议文档,恩 10s一次的心跳包。
十六进制发送 55 AA 00 01 00 00 00
返回F0 55 AA 00 03 00 01 02 05
、07 55 AA 00 03 00 01 02 05
,多了个F0 07不知道啥情况,忽视,后面帧头55 AA 版本号 00 命令字03 返回03好吧,数据长度是 00 01 数据为02,CRC8为05,我们转到03命令看看
0x02是已绑定状态,这应该很能说明问题了,设备有蓝牙信号,但是无法被APP识别配网,因为已经配网了(这不是bug嘛 呀嘞呀嘞daze)。既然已经配网,那就删除mesh网络信息,恢复一下。
发送命令55 aa 00 04 00 00 03
,还是返回F0 55 AA 00 03 00 01 02 05
呃,什么意思
重新烧录固件(慎用)
放弃,进行固件重新烧录。参考:无需Telink也能烧录涂鸦BT3L
具体步骤可参考下面的
开发板固件烧录
烧完后,重新上电,打开 APP 添加设备,扫到 插座了!(扫不到 就 长按sw1 5秒(看你固件设置))
终于添加成功了,可喜可贺。
简单功能演示
TL_C2 接个小灯,配合APP,做个演示
次日,我想稍微改下固件,亮个LED2看看,结果
啥,心跳包呢???
开发板固件烧录
参考文档:https://developer.tuya.com/cn/docs/iot/authorization-code-firmware-burning?id=K9br41pefnksv
根据文档准备前期工作,https://iot.tuya.com/pmg/devpanels
1、随便创建了个产品
2、生成授权码
https://iot.tuya.com/pmg/devpanels
然后绑定刚才创建的产品(插座),授权码也有了
3、运行 云模组烧录授权平台
设置相关参数
上图勾选“固件下载”,会下载固件到本地文件夹。 C:\Users\用户名\AppData\Roaming\Tuya\TYDA\bin
4、使用USB转TTL 烧录固件(自行考虑是否这么使用吧)
注意:BT3L烧录据客服说需要泰凌微的烧录器。这卖200多,显然有些肉疼。
参考:无需Telink也能烧录涂鸦BT3L,配合安信可的烧录工具,加上USB转TTL也可以完成烧录(SWS 和 RX短接),然后在根据教程完成授权。(不得不说,安信可 yyds)
烧录固件 C:\Users\用户名\AppData\Roaming\Tuya\TYDA\bin
这个目录下面(这个固件生成需要前面的 设置中 勾选“固件下载”)
设置为 只授权
然后选择串口 运行
Arduino 例程
打开 Arduino IDE,导入涂鸦SDK,“文件”-》“示例”-》涂鸦SDK里面有相关示例
ble_led 例程(测试没啥用)
源码
/*
* @FileName: led.ino
* @Author: Tuya
* @Email:
* @LastEditors: Tuya
* @Date: 2021-10-22 10:41:27
* @LastEditTime: 2021-10-27 19:48:31
* @Copyright: HANGZHOU TUYA INFORMATION TECHNOLOGY CO.,LTD
* @Company: http://www.tuya.com
* @Description: This demo is based on the Arduino UNO, and the LEDs on the UNO board are controlled by the Tuya Smart App.
* Enter network connection mode when Pin7 to GND.
* @Github:
*/
#include <TuyaBLE.h>
#include <SoftwareSerial.h>
TuyaBLE my_device;
/* Current LED status */
unsigned char led_state = 0;
/* Data point define */
#define DPID_SWITCH_LED 1
/* Stores all DPs and their types. PS: array[][0]:dpid, array[][1]:dp type.
* dp type(TuyaDefs.h) : DP_TYPE_RAW, DP_TYPE_BOOL, DP_TYPE_VALUE, DP_TYPE_STRING, DP_TYPE_ENUM, DP_TYPE_BITMAP
*/
unsigned char dp_array[][2] =
{
{DPID_SWITCH_LED, DP_TYPE_BOOL},
};
unsigned char pid[] = {"jxcevwfq"};
unsigned char mcu_ver[] = {"1.0.0"};
/* last time */
unsigned long last_time = 0;
void setup()
{
// Serial.begin(9600);
Serial.begin(9600);
//Initialize led port, turn off led.
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
//Enter the PID and MCU software version
my_device.init(pid, mcu_ver);
//incoming all DPs and their types array, DP numbers
my_device.set_dp_cmd_total(dp_array, 1);
//register DP download processing callback function
my_device.dp_process_func_register(dp_process);
//register upload all DP callback function
my_device.dp_update_all_func_register(dp_update_all);
last_time = millis();
}
void loop()
{
my_device.uart_service();
/* LED blinks when network is being connected */
if ((my_device.mcu_get_ble_work_state() != BLE_CONNECTED) && (my_device.mcu_get_ble_work_state() != BLE_SATE_UNKNOW)) {
if (millis()- last_time >= 500) {
last_time = millis();
if (led_state == LOW) {
led_state = HIGH;
} else {
led_state = LOW;
}
digitalWrite(LED_BUILTIN, led_state);
}
}
delay(10);
}
/**
* @description: DP download callback function.
* @param {unsigned char} dpid
* @param {const unsigned char} value
* @param {unsigned short} length
* @return {unsigned char}
*/
unsigned char dp_process(unsigned char dpid,const unsigned char value[], unsigned short length)
{
switch(dpid) {
case DPID_SWITCH_LED:
led_state = my_device.mcu_get_dp_download_data(dpid, value, length); /* Get the value of the down DP command */
if (led_state) {
//Turn on
digitalWrite(LED_BUILTIN, HIGH);
} else {
//Turn off
digitalWrite(LED_BUILTIN, LOW);
}
//Status changes should be reported.
my_device.mcu_dp_update(dpid, value, length);
break;
default:break;
}
return TY_SUCCESS;
}
/**
* @description: Upload all DP status of the current device.
* @param {*}
* @return {*}
*/
void dp_update_all(void)
{
my_device.mcu_dp_update(DPID_SWITCH_LED, led_state, 1);
}
编译烧录
拔掉 BT3L开发板!!!,给Uno3烧写了 ble_led
不过这个程序没写啥内容,模块配网一直失败,呃,没啥用呀 不要了。
拓展
涂鸦蓝牙mesh模块BT3L+步进电机+Arduino
实现手机控制 电机转动,带动小装置控制 模拟按压开关
效果图
源码
unsigned int forward[4] = {0x03,0x06,0x0c,0x09}; // 正转
unsigned int reverse[4]= {0x03,0x09,0x0c,0x06}; // 反转
int IO_array[4] = {8, 9, 10, 11};
int flag = 0;
int temp = 0;
int ble_in = 7;
void SetMotor(unsigned int InputData)
{
if(InputData == 0x03)
{
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
}
else if(InputData == 0x06)
{
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
}
else if(InputData == 0x09)
{
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, HIGH);
}
else if(InputData == 0x0c)
{
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
}
else if(InputData == 0x00)
{
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
}
}
/*
功能:转1/64圈
步距角5.625 360/5.625=64 减速比1/64
故64*64个脉冲转一圈
n 圈数
_direction 方向 1正转 非1反转
delay_ms delay_ms >= 2
*/
void motor_circle(int n, int _direction, int delay_ms)
{
int i, j;
for(i = 0; i < n * 8; i++)
{
for(j = 0; j < 4; j++)
{
if(1 == _direction)
{
SetMotor(0x00);
SetMotor(forward[j]);
}
else
{
SetMotor(0x00);
SetMotor(reverse[j]);
}
delay(delay_ms > 2 ? delay_ms : 2);
}
}
}
void setup() {
// put your setup code here, to run once:
int i = 0;
for( i = 0 ; i < 4 ; i++ )
{
pinMode(IO_array[i], OUTPUT);
}
pinMode(ble_in,INPUT); //定义蓝牙控制信号脚为输入接口
}
void loop() {
// 电机正转半圈
// motor_circle(32, 1, 2);
// 电机反转半圈
// motor_circle(32, 0, 2);
temp = digitalRead(ble_in);//读取数字7 口电平值赋给temp
// temp和上一次的flag不同 则执行电机正反转
if(temp != flag)
{
flag = temp;
motor_circle(8, 1, 2);
delay(500);
motor_circle(8, 0, 2);
}
delay(1000);
}
版权声明:本文为CSDN博主「Love丶伊卡洛斯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Ikaros_521/article/details/122036607
暂无评论