Skip to content

Instantly share code, notes, and snippets.

@erebor
Created May 26, 2016 20:26
Show Gist options
  • Save erebor/c932b817be5b85f9ec1816d54443baae to your computer and use it in GitHub Desktop.
Save erebor/c932b817be5b85f9ec1816d54443baae to your computer and use it in GitHub Desktop.
Ring clock for ws2812 led
#!/usr/bin/env ruby
$:.unshift(File.expand_path('../../lib', __FILE__))
require 'ws2812'
class Ring
attr_accessor :led_count
def initialize(number_of_leds)
@led_count = number_of_leds
end
def ws
return @ws if defined? @ws
# +n+ leds at pin 18, using defaults
@ws = Ws2812::Basic.new(led_count, 18)
@ws.open
end
def get_led_rgb(number)
[ws[number].r, ws[number].g, ws[number].b]
end
def set_led_off(number)
ws.set number, 0, 0, 0
ws.show
end
def set_led_rgb(number, r, g, b)
return if get_led_rgb(number) == [r, g, b]
ws.set number, r, g, b
ws.show
end
def brightness=(level)
ws.brightness = level
ws.show
end
def normalize_on_range(value, range)
(value / (range.to_f / (led_count - 1) )).to_i
end
end
r = Ring.new(24)
hour_color = [14, 199, 33]
min_color = [0, 5, 199]
sec_color = [140, 14, 14]
old_hour_led = 0
old_min_led = 0
old_sec_led = 0
while true
t = Time.now
hour_led = t.hour
min_led = r.normalize_on_range(t.min, 60)
sec_led = r.normalize_on_range(t.sec, 60)
if hour_led != old_hour_led ||
[old_min_led, old_sec_led].include?(hour_led)
r.set_led_off old_hour_led
r.set_led_rgb hour_led, *hour_color
old_hour_led = hour_led
end
if min_led != old_min_led ||
[old_hour_led, old_sec_led].include?(min_led)
r.set_led_off old_min_led unless hour_led == old_min_led
r.set_led_rgb min_led, *min_color
old_min_led = min_led
end
if sec_led != old_sec_led
r.set_led_off old_sec_led unless [hour_led, min_led].include? old_sec_led
r.set_led_rgb sec_led, *sec_color
old_sec_led = sec_led
end
sleep 1
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment