我需要控制很多LED(为了好玩......不行)。
UI是用javascript编写的,每秒大约会发送60次数据(颜色数组)。
led驱动程序是一个微控制器(ESP8266),使用带有arduino IDE的websocket library以c ++编程
LED指向可寻址并通过单个引脚控制。关于数据传输的更多信息btw led&微控制器可以在this数据表中读取。但我正在使用一个简化的library来驱动那些使用i2s的DMA,以便让CPU退出。
此刻我正在向第一个LED发送一种颜色。颜色转换为十六进制字符串以节省空间。
客户端
//javascript
websocket.send('#ff0000');
服务器
//c++
if(payload[0]=='#'){
uint32_t rgb = (uint32_t) strtol((const char *) &payload[1], NULL, 16);
pixels[1].R=((rgb >> 16) & 0xFF);
pixels[1].G=((rgb >> 8) & 0xFF);
pixels[1].B=((rgb >> 0) & 0xFF);
}
我的第一个猜测是发送一个类似字符串的“十六进制”,然后拆分
"#ff0000ff0000ff0000"
//or
"#ff0000#ff0000#ff0000"
但我去聊天并收集了有关此问题的更多信息。人们建议我使用二进制或ascii。这对我来说有点难,所以我需要一些例子。特别是对于c ++部分。我甚至不确定websocket lib是否能够正确处理ascii或二进制文件,然后将其重新转换回数字。
问题:
微控制器有各种限制。特别是内存,传输速度和转换数据所需的时间。 最终的颜色数组应该是小字节和很容易重新转换为rgb值。
发送和接收彩色数组的正确方法是什么?
各种图书馆的选择是长期研究:
答案 0 :(得分:0)
所有功劳归于 enhzflep
我只是留在这里记住它是如何工作的。
不需要String.fromCharCode()
,因为它是Uint8Array
,所以只需要添加0到255之间的单个颜色范围
通过websocket发送二进制数据只需通过Uint8Array。缓冲区
<强>的javascript 强>
创建并发送一个包含16个红色像素的数组。
var pixels=16,
a=new Uint8Array(pixels*3),
l=pixels*1;
while(l--){
a[l*3]=255;//red
a[l*3+1]=0;//green
a[l*3+2]=0;//blue
}
ws.send(a.buffer);
<强> C ++ 强>
设置收到的有效负载中的所有像素case WStype_BIN:
uint8_t l=NUM_LEDS*1;
while(l--){
pixels[l].R=payload[l*3];
pixels[l].G=payload[l*3+1];
pixels[l].B=payload[l*3+2];
}
ledstrip.show(pixels);
break;
现在代码运行超过一个小时,没有一个口吃者每15毫秒无线更新16个LED。
对于其他所有代码/库,我在最长15分钟后有内存和其他问题。使用一个led。
所以... thx enhzflep。