最佳发送方式&通过websockets接收颜色数组

时间:2016-01-12 10:52:08

标签: javascript c++ c

我需要控制很多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值。

发送和接收彩色数组的正确方法是什么?

各种图书馆的选择是长期研究:

  • Arduino IDE:该芯片使用简单。大社区。
  • Arduino esp8266 Websocket lib:显然是基于Arduino IDE的最快版本。
  • ws2812b i2s:它使用DMA控制LED,因此没有CPU。
  • JS as UI:它适用于每个移动设备。免费。
  • websockets:双向实时数据传输。它适用于每个移动设备。免费。

1 个答案:

答案 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 ++

使用i2s lib和ws lib

设置收到的有效负载中的所有像素
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。