在完成数据收发之后就可以用手机发送数据来控制灯光的强度了,所以要做一个能够直接与开发板通讯的APP,直接连接开发板,不能像调试的时候找广播、点连接、展开服务、点击写数据、填写数据、确定发送数据等这一系列步骤才完成数据发送。
一、亮度调节方式
调节LED亮度的一般有三个方法,分别是:调节开关时间、调节电流、调节电压。
1、调节开关时间
PWM是通过改变脉冲信号的占空比来控制LED的亮度。占空比是指脉冲信号高电平时间与周期的比值。当占空比为100%时,LED一直导通,亮度最亮;占空比为0%时,LED一直截止,完全不发光。例如,假设PWM信号的频率为1kHz,周期为1ms,当占空比为50%时,LED在0.5ms内导通发光,在另外0.5ms内截止不发光。由于人眼的视觉暂留效应,当PWM信号频率足够高(一般高于100Hz)时,人眼看到的是LED的平均亮度。如果占空比从50%增加到80%,LED的平均亮度就会变亮。
2、调节电流
使用恒流源电路来为LED供电。恒流源可以精确地控制输出电流。常见的恒流源有线性恒流源和开关型恒流源。
线性恒流源:通过调整功率管的导通程度来控制电流。控制流过LED的电流,实现亮度调节。
开关型恒流源:利用MOS高频开关来调节电流,利用储能元件,电感、电容组成的电路,不断的导通与闭合维持LED电流的连续性。通过改变控制信号的占空比,可以调节流过LED的平均电流,从而实现亮度调节。
3、调节电压
通过改变LED两端的电压来调节亮度。理论上,当LED两端电压增加时,其电流也会增加,从而亮度变亮。但是LED是一种非线性器件,其伏安特性曲线比较陡峭。在正常工作电压范围内,电压的微小变化可能会导致电流的较大变化。例如,对于一个额定电压为3.2V的蓝色LED,当电压从3.2V增加到3.3V时,电流可能会从20mA增加到30mA左右,亮度会有明显变化。
以上的3个方法,调节开关时间会导致频闪,调节电压会导致亮度突变,所以我选择调节电流会好一些。
二、WBA55配置PWM
在Cube MX和Hal库上,配置PWM非常简单
1、选IO,选择PA7作为PWM口
PA7 属于TIM2 的通道3
2、Cube MX 初始化
使能TIM2 通道3,配置分频系数、计数值、使能自动重装载,PWM 模式1、有效电平为高等
3、添加代码
添加代码使能TIM2 通道3
调整PWM大小
使用API后,在精简后,发现直接改寄存器最简单,比如:直接给TIM2 通道3赋值,用TIM2->CCR3 = xx,即可。
三、硬件接线
如上图,按照模块的要求接线即可,接灯的地方先用小LED代替验证思路可行后再换实际的灯。剩下的就是5V供电、PWM、共地了,非常简单。
四、WEB BLE调光
安卓原生的APP就难度太大了,比嵌入式端的还要复杂,所以我选择了WEB BLE基于网页的BLE通讯,有浏览器就可以控制蓝牙交互数据。
修改过滤条件
添加读、写UUID
WBA55接收数据打印
GIF效果
以上就完成了WEB端的滑条灯,个人还是觉得麻烦,我的web由于我不会包装为渐进式,而且没有服务器(不是web专业人士可能描述不对,请多包含)不能直接和app一样安装到桌面。
于是我想到了拿另外一颗蓝牙芯片做主机 与 WBA55交互数据,相当于拿个不需要对准的遥控器去控制。(红外遥控必须要对着)
目前某宝上的ST蓝牙芯片、模组都比较乱,稳妥起见我选了ESP32-S3做蓝牙主机。
五、ESP32主机调光
以下开发基于ESP32 gatt_client例程修改
1、修改扫描目标广播名 与 修改并新增所需的UUID
2、重新打包数据发送接口
原始接口不太方便发送数据,封装一下传参更好,更方便。
需要注意handle,必须正确,不然不能发送数据,会报错。
目前的接口没有判断是否连接等
有抓包器的话,可以抓包确认一下。
3、添加按键识别代码
亮度分5档,每次递增20的占空比,并发送数据
STM32WBA55的代码不需要任何改变。ESP32连接后,调光效果GIF如下:
以上就是2种调光的方式。