During today’s Dev Japan Meetup I finally had the time to do something I always wanted to do but never had time to implement: Create a fast link from an end-device (AKA browser or phone application) to my LED display. That display is a simple 10×10 WS2812 LEDs strip originally connected to an Arduino with a Bluetooth receiver, but replaced by a Wemos D1 mini flashed with Espruino since that has WiFi and more RAM.
Here the important (but incomplete) part of the Espruino program:
var host = "the_ws_server.co.jp"; var WebSocket = require("ws"); var ws = new WebSocket(host,{ path: '/', port: 8080, // default is 80 protocol : "echo-protocol", // websocket protocol name (default is none) protocolVersion: 13, // websocket protocol version, default is 13 origin: 'Espruino', keepAlive: 60 }); ws.on('open', function() { console.log("Connected to server"); }); ws.on('message', function(msg) { console.log("MSG: " + msg); if (msg == "R") { colorize(40, 10, 10); } else if (msg == "G") { colorize(10, 40, 10); } else if (msg == "B") { colorize(10, 10, 40); } esp8266.neopixelWrite(NodeMCU.D4, leds); });
The logic is as simple as it looks: connect to a WS server and wait for incoming messages. If it’s “R”, or “G”, or “B”, then colorize the LED array.
Here a section of the browser part:
var ws = new WebSocket("ws://the_ws_server.co.jp:8080/"); ws.onopen = function(evt) { var conn_status = document.getElementById('conn_text'); ws.send(JSON.stringify({"join":"led"})); }; ws.onmessage = function(evt) { var newMessage = document.createElement('p'); newMessage.textContent = "Server: " + evt.data; document.getElementById('messages_txt').appendChild(newMessage); }; ws.onclose = function(evt) { alert ("Connection closed"); }; $(".color").click(function(evt) { console.log($(this).attr("val")); ws.send(JSON.stringify({"room":"led","msg":$(this).attr("val")})); });
and the buttons look like
<button type="submit" class="color" val="R">Red</button> <button type="submit" class="color" val="G">Green</button> <button type="submit" class="color" val="B">Blue</button>
The one missing part is the websocket server in the middle which relays messages, which I took quite literally from here from the Espruino Websocket docs.
This is anything but clean code, and not yet a complete and instructive example application, but it’s the first step and a good proof-of-concept.
Next step is a web page to have a 10×10 grid of buttons which can be turned on/off by touching, and the corresponding commands are sent to the LED display.