Page 1 of 2
【已解决】【TuyaOS OS】蓝牙与网关连接时低功耗模式
Posted: 2023年 Oct 25日 10:06
by 17394068840
蓝牙模块:BTU
SDK版本:TLSR_8250_3.8.1
问题描述:产品是定时开关,干电池供电需要保持低功耗。当有网关在旁边的时候应该可以进入低功耗,当有控制指令的时候可以被立即唤醒并执行。但实际测试模块与手机或网关连接成功后无法进入低功耗模式。
1.当网关或手机与蓝牙模块保持连接的时候如何让模块进入低功耗(保持连接)?当有控制指令下发时,模块可以被瞬间唤醒并执行动作?
2.当设备休眠时,用户设定的定时任务时间到了,如何主动唤醒设备并控制GPIO输出脉冲后继续进入低功耗,我尝试使用tkl_board_pm_working 和tkl_board_pm_suspend 都无法达到预期目的。另外这两个接口是否用完TKL_PM_SET必须要进行TKL_PM_CLEAR,否则即使重新烧写了程序也无法clear?
备注:进入低功耗使用的tal_cpu_allow_sleep();(仅在初始化后执行一次)
TY_ADV_INTERVAL 值由100改为1000
设置了按键唤醒
Re: 【求助】【TuyaOS OS】蓝牙与网关连接时低功耗模式
Posted: 2023年 Oct 25日 10:37
by jinyuan
- 可以将连接间隔拉大以降低功耗:可以分别将TY_CONN_INTERVAL_MIN/TY_CONN_INTERVAL_MAX改到 480/500看看效果.如果想要进一步降低功耗可以改成980/1000
- 用户设定的定时任务有两种方式:
方式一:是计算tick,超时执行定时任务,在低功耗的工作状态下,只有广播/连接事件到的时候设备会唤醒,此时才会tick是否超时,这种方式不简洁且定时时间误差较大。
方式二: 直接通过软件定时器开一个定时任务, 定时任务到的时候即使是休眠,也会自动从休眠状态唤醒。
建议直接使用方式二。
tkl_board_pm_working /tkl_board_pm_suspend 这两个接口 用完TKL_PM_SET需要进行TKL_PM_CLEAR,他影响的只是一个用作标志位的变量而已,重启了就清空,不会存在即使重新烧写了程序也无法clear的情况。
Re: 【求助】【TuyaOS OS】蓝牙与网关连接时低功耗模式
Posted: 2023年 Oct 25日 11:03
by 17394068840
感谢您的回复1.连接间隔拉大以后手机控制设备反应的时间会变得很长,是否可以动态的修改这个参数而不是宏定义的方式,比如将要进入休眠时数值改大,退出休眠时数据改小。我曾尝试修改TY_CONN_INTERVAL_MIN 为800,感觉控制要很长时间才响应大概2秒。
2.我的主任务是1秒的定时器,在定时器的回调函数中检查当前时间和用户设定的时间是否相等,如果相等则执行脉冲信号输出。定时器使用的是如下接口:tuya_ble_timer_create(&app_timer_timer_id, 1000,TUYA_BLE_TIMER_REPEATED,app_timer_cb);
tuya_ble_timer_start(app_timer_timer_id);
但是我观察电流变化并没有发现有唤醒的现象,万用表显示电流始终在90uA-120uA跳动,不过定时任务中的串口日志会打印出来。唤醒时我观察电流是450uA左右。
3.后来可能我设置了tkl_board_pm_working(TKL_PM_SET, PM_EVENT_KEY);的原因,只要按键按下了就不会再进入休眠了,即使我改代码删除了这一行,不知道是咋回事,我以为这个标志会写到flash中。
Re: 【求助】【TuyaOS OS】蓝牙与网关连接时低功耗模式
Posted: 2023年 Oct 25日 11:41
by jinyuan
- BLE是这样的,interval可以理解成定时器,广播的interval就是以以TY_ADV_INTERVAL规定的时间间隔发广播包。连接的interval就是主从双方以TY_CONN_INTERVAL_MAX约定的时间间隔交互一次(收/发包)。
如果想要兼顾功耗和控制速度可以尝试把latency用上:可以搜索宏定义TY_CONN_INTERVAL_MAX调用的位置, 下面有一个latency默认赋0。连接听包间隔 = interval * (1+latency);增加latency ,降低inteval可以提高从机设备的发包响应,从机设备收包还是只受inteval的影响。
- 该定时器接口的底层也是调用tal_sw_timer.h中定义的接口,没有问题。唤醒时间非常短暂,用万用表很难捕捉到这个短暂的电流波动(肉眼也不好观察),建议使用power monitor或Energy profile 等电流分析仪来观察电流变化,这个工具在低功耗调试时也能用上。
下图是BLE连接状态下的电流波形图,可以看到每个突触的是唤醒听包电流,听包完成后立即进入休眠,直到下次听包,如此循环实现BLE低功耗连接
- 查下代码里有哪些地方执行了tal_cpu_force_wakeup(). 有的话将该函数注释掉即可
注意事项:不符合iOS设备连接参数定义的数值是不被接受也就不会变更了,所以首先请您确认一下您的参数定义是否满足以下IOS设备的要求
•Interval Max * (Slave Latency + 1) <= 2 s
•Interval Max >= 20 ms
•Interval Min + 20 ms <= Interval Max
•Slave Latency <= 4
•ConnSupervisionTimeout <= 6 s
•Interval Max * ( Slave Latency + 1) * 3 < ConnSupervisionTimeout
Re: 【求助】【TuyaOS OS】蓝牙与网关连接时低功耗模式
Posted: 2023年 Oct 25日 23:12
by 17394068840
感谢您的回复。前面的问题已解决。目前还有以下3个问题:
1.手机连接的时候模块也会进入低功耗,导致设备断开手机的连接无法收到手机的控制指令。
2.模块解绑并重新进入配网会导致模块复位,关闭低功耗模式则正常不会重启。
3.flash写会造成模块复位,关闭低功耗模式flash读写正常。
Re: 【求助】【TuyaOS OS】蓝牙与网关连接时低功耗模式
Posted: 2023年 Oct 26日 10:16
by jinyuan
- 可以打开LOG,看一下断开的原因是什么。低功耗开启本身不会导致设备锻炼,因为BLE本身就是一个支持低功耗下保持连接的技术。可以看一下应用代码中是否有阻塞时间较长的代码?如果阻塞时间较长会影响蓝牙听包,从而触发断连。
- 模块解绑是APP解绑模块 还是长按按键触发解绑?可以看一下触发解绑后的回调和LOG,可能是应用代码导致的重启。
- 不合法的写地址会在底层被拒绝,,合法的写地址,在每次写之前会在底层主动喂狗一次,不管低功耗开不开,FLASH操作的时候设备只能是唤醒状态。 建议查下代码
Re: 【求助】【TuyaOS OS】蓝牙与网关连接时低功耗模式
Posted: 2023年 Oct 26日 21:28
by 17394068840
1.模块进入低功耗会断开手机连接的log如下附件,进入休眠后串口总是会打印一些乱码和空字符不知什么原因。已把我的应用程序几乎全部屏蔽,防止有阻塞时间长的代码,但仍然会断开连接。
2.是按键触发的解绑,调用接口tuya_ble_device_unbind(); 其他代码都已屏蔽,仍然会导致重启。 如果不开起低功耗同样的代码则不会重启。
3.地址是合法的,(0x2D000) 我的代码中没有主动喂狗,同样的代码如果不开启低功耗则正常可读写,不会导致程序复位。
以上请帮忙分析验证是否此SDK问题,谢谢!
Re: 【求助】【TuyaOS OS】蓝牙与网关连接时低功耗模式
Posted: 2023年 Oct 26日 22:26
by 17394068840
这是我用3.8.3新下载的工程什么代码都没写只开启了低功耗,发现手机控制的时候是一样的现象,3.8.3的工程使用100000波特率,所以没有发现乱码现象,可以看到断连 0x08 ,请帮忙确认是否是SDK通性问题,谢谢!
Re: 【求助】【TuyaOS OS】蓝牙与网关连接时低功耗模式
Posted: 2023年 Oct 27日 10:44
by jinyuan
断连代码0x08表示的是蓝牙听包异常 ,有可能是互相连接的设备间隔较远,或者是射频性能太差导致听不到包。请问测试的硬件是tuya的模组还是自己画的板子?如果是自己画的板子,那有调过射频吗?
Re: 【求助】【TuyaOS OS】蓝牙与网关连接时低功耗模式
Posted: 2023年 Oct 27日 10:50
by 17394068840
用的是涂鸦的BTU模组,手机就在模块旁边不存在距离问题。我使用3.8.3的工程不添加自己代码只要打开低功耗就是此现象,可能是同性问题,你们可以自己测试一下。 包括低功耗下解绑会造成复位,低功耗下写flash会复位,这些现象你们可以排查一下吗? 附件代码可直接放在3.8.3的工程中测试,代码与demo几乎无改动,只改了PID 按键脚 log TX脚和开启低功耗。 按键是A1 低电平唤醒。谢谢了!