一、概述

24V电源适配器插槽放在调光板,接口用DC5.5x2.5mm。不用type-c,是因为用了此种接口、符合3C认证的适配器不多。
控制板和主板的通信串口。RXD、TXD,为稳妥,加上GND。3线次序:RXD、TXD、GND。用3pin的1.25mm母口。
给猫3的5V/4A电源输出口。两焊点。到时从这两点要手工飞线,焊锡留多点,间隙留大点。类似上图中的DCIN,或A+-、B+-
- 初始上电后。1)只按钮板的电源LED灯亮,其它3个按钮按下不会有反应。2)确保主板不上电。3)输出灯光是关闭状态。
- 用户按下“电源”按钮(不论长按还是短按)。1)给主板上电,2)点亮“亮度”LED灯,不用管场景和隐私LED,即不用去刻意设置这两灯是灭还是亮。3)灯板出来最低档亮度,色温用3900K。4)开始发串口“读状态信息报”,间隔1秒。对此时的“读状态信息报”,目的是要让主板知道正用的是哪厂家哪型号产品,场景(参数5)、隐私(参数6)按钮都填0。
- 长按按下“电源”按钮。断开主板,灯光是关闭状态,熄灭除电源指示灯外的3个LED。即让和初始上电时一样状态。

主板上电初始化完成后,会发串口协议中“控制LED指示灯”命令,控制“场景”、“隐私”这两个LED是亮还是暗。
对“电源”、“亮度”两LED灯,亮或灭全由控制板控制。对“场景”、“隐私”,除了关机(长按按下“电源”按钮)时控制板要主动灭掉(此时主板已断电,没法发“控制LED指示灯”),其它时间取决于主板发来的“控制LED指示灯”命令。
在变化亮度、色温时,可以的话,不要立即变到目标值,出个渐变效果。
1.1 “0亮度”状态
“0亮度”是这么种状态,台灯已上电,主板也运行着,但灯要灭着。
为什么会出现这种状态?在白天用台灯,光线很好,但台灯要能定时语音提示、摄像头识别,即只用了主板上的陪伴功能。此时不须要照明,灯虽然不亮了,但主板是要工作着,不同于初始上电状态。
要实现“0亮度”状态,是亮度变为0还是断开灯板电路,由控制板决定,目标是要省电+尽可能延长灯板寿命。
“0亮度”状态下,亮度LED指示灯依旧亮着。
进入“0亮度”状态有两个方法,一是灯正亮着时,长按“亮度”按钮;二是收到亮度值是0的“改亮度”串口命令。退出这状态也有两个方法,一是用户按下面板上“亮度”按钮,不论长按还是短按。二是收到亮度值来是0的“改亮度”串口命令。
1.2 台灯上按钮(4)
- 电源开/关(控制板控制,分长按和短按)。按下它时,发现没上电,开灯。否则,是短按,换到下一色温。可选色温:3200K、3900K、4400K、5000K。是长按,断电。断电时,要同时熄灭除电源外的其它三个LED灯:亮度、场景、隐私。
- 切换亮度(控制板控制,分长按和短按)。亮着的亮度分4档。短按,切换到下一亮度。长按的话,进入“0亮度”状态。当亮度当前是0 时,接下不论长按还是短按“亮度”按钮,亮度改到最小会亮的那个。
- 场景(“读状态信息报”告知主板此按钮按下)。按下按钮,切换到下一个场景。详细见“三、场景、隐私按钮”。
- 隐私(“读状态信息报”告知主板此按钮按下)。按下它时,正处于隐私保护,就解除保护。否则进入保护。详细见“三、场景、隐私按钮”。
1.3 LED指示灯(4)
- 每个按钮下一个LED灯。设备也就这4个LED灯。
- “电源”和“亮度”按钮下的LED灯状态由控制板完全控制。
- “控制LED指示灯”中的“灯1”、“灯2”对应“场景”、“隐私”按钮。
- 对LED灯颜色,“电源”蓝色,其它3个绿色。
长按的生效时刻是在按着时,短按生效时刻是在松开时。以“亮度”为例,按着“亮度”按钮,到长按时长了,生效,让进入“0亮度”状态。如果此次满足短按,松开时刻,改亮度。

用户按下场景、隐私按钮时,不管之前是什么状态,控制板点亮对应LED指示灯(让用户看到按钮按下了)。等可以满足短按或长按了,发出“读状态信息报”。主板收到这个“读状态信息报”后,处理此按下事件,结束时会根据当前状态,灭掉或点亮对应LED灯
二、串口协议
通信参数:8,N,1
波特率: 9600、115200、230400。控制板决定选哪个波特率。
命令帧基本格式
帧头 长度 命令类型 参1 参2 。。。 参n 校验 0x07
长度字节包括命令类型及后面的各参数(参1~参n),但不含长度本身和校验和。
校验字节为包含长度字节、命令类型、各参数(参1~参n)的字节和(模256)。注意,不包含帧字头节(0x07)。对应下面代码,变量i是从1开始。
uint8_t calculate_sum(const uint8_t* data, int len) { uint32_t sum = 0; for (int i = 1; i < len; i ++) { sum += data[i]; } return sum & 0xff; }
以下是一个“控制LED指示灯”命令示例:0x03 0x23 0xff 0x01 --> (校验和)0x26

2.1 读状态信息报(控制板 –>主板)
[0]帧头 | [1]长度 | [2]命令 | [3]参数1 | [4]参数2 | [5]参数3 | [6]参数4 | [7]参数5 | [8]参数6 | [9]参数7 |
0x07 | 0x07 | 0x10 | 产家编码 | 产品编码 | 色温 | 灯亮度 | 场景按钮 | 隐私按钮 | 校验和 |
1 | 1 | 0..4 | 0..100 | 0或1或2 | 0或1或2 | ||||
0x07 | 0x07 | 0x10 | 0x1 | 0x1 | 0x2 | 60 | 0x0 | 0x2 |
示例:设备是纽兰斯顿的A型台灯,当前色温是索引2,查色温数组是4400K。当前亮度是60%。此刻隐私按钮发生了长按,场景按钮则没按下事件。
- 产家编码、产品编码。这套协议可能会用于多种型号产品。产家编码1表示纽兰斯顿,产品编码1表示纽兰斯顿的A型台灯。
- “色温”指示当前灯泡正用的色温。值见下面的“改色温”命令。当正处于渐变时,填写要变到的色温。
- “亮度”指示灯亮着的百分比,值范围0到100。当正处于渐变时,填写要变到的亮度。
- “xx按钮”指示此刻xx按钮的按下情况。0表示没按下事件,1表示发生短按,2表示发生长按。
上电后,没收到控制板的“全局设置”命令前,按1Hz(间隔一秒)发这条状态报告,此时“xx按钮”两参数填0。为什么一开始间隔一秒?那段时间主板还在初始化中,这须要数秒。主板初始化完成后,收到一条读状态信息报,发的第一条命令肯定是“全局设置”命令,
收到第一条“全局设置”命令后,接下不必一秒发送一次“读状态信息报”了,而是当场景或隐私按钮发生按下(包括短按和长按)事件后。这时,要满足发生一次长按或短按时,确保只发一个读状态信息报。要做到这个,可遵循长按的生效时刻是在按着时,短按生效时刻是在松开时。以下是一种实现逻辑,假设长按时间阈值是2秒。
- 按下按钮时刻。一次新的按下开始了,但不要发任何的“读状态信息报”。
- 按下时间超过2秒时刻。发一个长按的“读状态信息报”。
- 松开按钮时刻。如果此次按下时,没出现过(2),也就是按下时间没超过2秒,发一个短按的"读状态信息报"。否则,如果出现过(2),不再发“读状态信息报”。
此型号台灯是外接电源,不传实时电压。
(电池电压的原始数据是浮点型的数据,因为浮点型数据使用串口传输不方便,所以在发送之前先将浮点数放大一千倍(保留小数点后三位),再将放大后的浮点数强制转换成short型数据,最后在发送前将short型数据拆分成两个8位的数据。电压示例。高8位0X58(16进制)=0101 1000(2进制)、低8位0X38(16 进制)=0011 1000(2进制),最高位为0,正数,大小为88*256+56=22584,电压大小为22584mv(毫伏))。
2.2 全局设置(主板 –>控制板)
[0]帧头 | [1]长度 | [2]命令 | [3]长按时长 | [4]校验 |
0x07 | 0x02 | 0x20 | n | 校验和 |
n/10=多少秒 | ||||
0x07 | 0x02 | 0x20 | 25 |
示例:命令控制把长按时长阈值设为2.5秒。
“长按时长”,如果控制板不支持用户可以修改长按时长,忽略这字段。
2.3 改亮度(主板 –>控制板)
[0]帧头 | [1]长度 | [2]命令 | [3]参数1 | [4]校验 |
0x07 | 0x02 | 0x21 | 亮度 | 校验和 |
0到100,以及0xff | ||||
0x07 | 0x02 | 0x21 | 80 |
示例:命令控制板把亮度调到80%。
“亮度”,从当前亮度变到这个百分比表示的亮度。取值范围是0到100,以及0xff,不是0到255。0%表示变到全灭,100%表示变到全亮。0xff是个特殊值,表示关机。类似长按下“电源”按钮,台灯进入初始上电状态。和长按“电源”按钮一样,此时要同时熄灭除电源外的其它三个LED灯:亮度、场景、隐私。如果亮度值无效,忽略此命令。
如果控制板软件是用0到255表示亮度范围,或许可这么写。
- 在这条改亮度命令,把0到100的亮度a转换为0到255的亮度b。接下就以亮度b做各样操作。
- 在“读状态信息报”,把0到255的当前亮度b转换为0到100的亮度a,然后以亮度a填充到“读状态信息报”亮度字节。
- 其它地方都以着0到255处理亮度。
对面板上“亮度”按钮,按下它时,是由控制板决定的4个亮度间变化。这里没采用4亮度索引,是因为主板需要使用不是那4个亮度的值。举个例子,假设控制板内置4档亮度是[60%, 75%, 85%, 100%],但在渐暗式熄灯,主板可能会传不是该范围值,像10%、20%。
当用这条命令修改了灯亮度,接下用户按下面板上“亮度”按钮时,切到最近一个比它大的亮度。举个例子,这条亮度命令把亮度改到80%,查到比它大的最近一档是85%,那切到85%。
2.4 改色温(主板 –>控制板)
[0]帧头 | [1]长度 | [2]命令 | [3]参数1 | [4]校验 |
0x07 | 0x02 | 0x22 | 色温 | 校验和 |
0到n | ||||
0x07 | 0x02 | 0x22 | 3 |
示例:命令控制板把色温改到索引3,索引3查色温数组对应是5000K。
“色温”指该色温在支持的色温数组中索引,从0开始。会出现什么值,由控制板决定。举个例子,此型号台灯支持4种色温:3200K、3900K、4400K、5000K。那0表示3200K,3表示5000K。如果色温值无效,忽略此命令。
2.5 控制LED指示灯(主板 –>控制板)
[0]帧头 | [1]长度 | [2]命令 | [3]参数1 | [4]参数2 | [5]校验 |
0x07 | 0x03 | 0x23 | 场景灯 | 隐私灯 | 校验和 |
0/1/0xff | 0/1/0xff | ||||
0x07 | 0x03 | 0x23 | 0xff | 0x1 | 0x26 |
示例:命令控制板点亮隐私灯,但场景灯保持不变。
“xx灯”,0表示灭掉LED。1表示点亮。0xff表示保持当前状态。
此命令不会涉及“电源”、“亮度”指示灯,那两灯完全由控制板控制。
三、场景、隐私按钮
场景
台灯工作时,除照明,还会默认执行一个任务。像学生写作业场景,这种任务可能是坐姿检测。做健身操场景,可能是陪伴做操。场景按钮就用于在这些场景中进行切换。
长按场景按钮会让挂起任务。举个例子,学生写作业时,想趴桌上睡觉,坐姿检测会认为这姿势不规范,于是会出声音提示。长按让挂起坐姿检测,等要继续写做业了,再按场景按钮,恢复坐姿检测任务。
当场景被挂起时,会熄灭场景LED。
隐私
一旦进入“隐私保护”状态,会阻止远程桌面,蓝牙IP发现,第三方小程序上传摄像头拍到图像。隐私按钮就用于提供“隐私保护”开关。
不排除将来会让隐私按钮有长按功能,发送“读状态信息报”时,也须要区分短按还是长按。
对隐私LED指示灯,设想是当隐私保护打开时,熄灭。否则亮灯,这时远程桌面这些可自由访问。