LED Clock (using WS8111)
This creates a simple clock using strings of WS2811 LEDs.
The idea is to have a string of 24 LEDs, arranged in two rings of 12.
Then, one LED is lit up for hours, minutes, seconds, and there's even a fast-moving one for sub-seconds.
WS2811 Wiring:
WS2811 | Pin on Espruino Board |
---|---|
GND | GND |
DIN | B15 |
VCC | Bat |
Note that Espruino doesn't normally keep great time (It could drift off by as much as a second a minute). To keep better time, check out the page on how to add a Watch Crystal.
To change the time, plug into a PC and issue the commands:
time.hours = 12;
time.mins = 54;
time.secs = 0;
Source Code
// setup SPI comms for the LED strip
SPI2.setup({baud:3200000, mosi:B15});
// store current time...
var time = {
hours : 10,
mins : 36,
secs : 0
};
/** Add red,green and blue light for light number 'n'
and the light next to it.
lights : array of light data
offset : where in the lights array do we start from?
0 = first string, 12*3 = second string
r,g,b : red green and blue between 0 and 255
n : light number. Rolls over after 11 and can be fractional,
so:
so for instance:
n = 1 - set just light 1
n = 1.1 - set light 1 to 90% and 2 to 10%
n = 1.5 - set light 1 to 50% and 2 to 50%
n = 1.9 - set light 1 to 10% and 2 to 90%
n = 15.5 - set light 3 to 50% and 4 to 50%
*/
function setLED(lights, offset, n, r,g,b) {
// Work out which light to start with (make n a whole number)
var led = Math.floor(n);
// work out the percentage of light on the second light (see above)
var amt = n - led;
var namt = 1-amt; // percentage of light on the first light
// work out which light
var n1 = offset+(led%12)*3;
var n2 = offset+((led+1)%12)*3;
lights[n1] += r*namt;
lights[n1+1] += g*namt;
lights[n1+2] += b*namt;
lights[n2] += r*amt;
lights[n2+1] += g*amt;
lights[n2+2] += b*amt;
}
var lastTime = getTime();
function onTimer() {
// Move the time onwards...
var timeNow = getTime();
time.secs += timeNow - lastTime;
lastTime = timeNow;
if (time.secs>=60) {
time.secs = 0;
time.mins++;
if (time.mins>=60) {
time.mins = 0;
time.hours++;
if (time.hours>=24) {
time.hours = 0;
}
}
}
// Create an array to hold the data for our lights
var lights = new Uint8Array((12+12)*3);
// fancy sub-seconds that spins around (on second strip)
setLED(lights, 12*3, time.secs*12, 63,0,0);
// Seconds - Math.floor rounds it down (on second strip)
setLED(lights, 12*3, Math.floor(time.secs)*12/60, 192,192,0);
// Minutes (on first strip)
setLED(lights, 0, time.mins*12/60, 0,0,255);
// Hours - %12 means roll over after 12 hours (on first strip)
setLED(lights, 0, time.hours%12, 0,255,0);
// send the data to the lights
SPI2.send4bit(lights, 0b0001, 0b0011);
}
setInterval(onTimer, 100); // 100ms = 10 times a second
This page is auto-generated from GitHub. If you see any mistakes or have suggestions, please let us know.