When you have a microcontroller which can connect to the network and it has a RGB LED, the logical step is to make this LED controllable via a web browser.
The list of issues faced is numerous:
- NodeMCU does not handle websockets natively
- Thus a bridge between normal TCP sockets used by NodeMCU and WebSockets used by the web browser is needed: ws-tcp-bridge does that
- ws-tcp-bridge defaults to binary blobs which the browser cannot handle. Switching the websocket’s binaryType to arraybuffer fixes this
- Sending data too fast to a just created websocket which has its binaryType not yet changed to arraybuffer breaks ws-tcp-bridge with a fatal error:
TypeError: “list” argument must be an Array of Buffers - NodeMCU uses Lua, the browser JavaScript. The langages are quite similar! See below for an example.
Code is at https://github.com/haraldkubota/rgbled-websocket
Interesting is the comparison of Lua and JavaScript variable names are the same):
| JavaScript | Lua |
|---|---|
for (c of s.split('')) {
if (c>='0' && c<='9') {
if (state==1)
value=10*value+c.charCodeAt()-48;
} else {
if (state==1) {
setOneColor(color, value);
state=0;
}
if (c=='R' || c=='G' || c=='B') {
color=c;
value=0;
state=1;
}
}
}
|
for n=1,s:len(),1 do
c=s:sub(n, n)
if c>='0' and c<='9' then
if state==1 then
value=value*10+c:byte(1)-48
end
else
if state==1 then
setOneColor(color, value)
state=0
end
if c=='R' or c=='G' or c=='B' then
color=c
value=0
state=1
end
end
end
|