Class to display Time in words on WS2812B-LED-Stripe. * Drive LEDs with PixelArray * with 11x10 LED-Matrix and 4 minute-LEDS * GERMAN LAYOUT !!!!!!
Details and usage see https://os.mbed.com/users/charly/code/WordClock/wiki/Homepage
Diff: WordClock.cpp
- Revision:
- 0:0f571ea154f8
- Child:
- 1:dd9657c12de6
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WordClock.cpp Sun Nov 05 20:30:51 2017 +0000 @@ -0,0 +1,607 @@ +#include "mbed.h" +#include "WordClock.h" +#include "neopixel.h" + +WordClock::WordClock (PinName pin) : di_pin_(pin, PullDown), array_(pin) +{ + + // Create a temporary DigitalIn so we can configure the pull-down resistor. + // (The mbed API doesn't provide any other way to do this.) + // An alternative is to connect an external pull-down resistor. + //DigitalIn(pin, PullDown); + // The pixel array control class. + //neopixel::PixelArray array(pin); + + // initialize hsv + //hue_ = 0.0; //red + hue_ = 0.2917; //limett-green + saturation_ = 1.0; //full color + value_ = 1.0; //brightness + +} + +/** Convert a color from the HSV representation to RGB. + * + * @param h hue 0.0 ... 1.0 + * @param s saturation 0.0 ... 1.0 + * @param v value 0.0 ... 1.0 +*/ +neopixel::Pixel WordClock::hsvToRgb(float h, float s, float v) +{ + int i = floor(h * 6); + float f = h * 6 - i; + float p = v * (1 - s); + float q = v * (1 - f * s); + float t = v * (1 - (1 - f) * s); + float r = 0, g = 0, b = 0; + switch(i % 6) { + case 0: + r = v; + g = t; + b = p; + break; + case 1: + r = q; + g = v; + b = p; + break; + case 2: + r = p; + g = v; + b = t; + break; + case 3: + r = p; + g = q; + b = v; + break; + case 4: + r = t; + g = p; + b = v; + break; + case 5: + r = v; + g = p; + b = q; + break; + } + return (neopixel::Pixel) { + r * 255, g * 255, b * 255 + }; +} + +void WordClock::cls() +{ + int i; + for (i=0; i<NUMLEDS; i++) { + ledstripe_[i].red=0; + ledstripe_[i].green=0; + ledstripe_[i].blue=0; + } +} + +void WordClock::es_ist() +{ + ledstripe_[0] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[1] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[3] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[4] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[5] = hsvToRgb(hue_, saturation_, value_); +} +void WordClock::fuenf_m() +{ + ledstripe_[7] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[8] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[9] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[10]= hsvToRgb(hue_, saturation_, value_); +} +void WordClock::zehn_m() +{ + ledstripe_[21] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[20] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[19] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[18] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::zwanzig() +{ + ledstripe_[17] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[16] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[15] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[14] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[13] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[12] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[11] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::drei_m() +{ + ledstripe_[22] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[23] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[24] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[25] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::vier_m() +{ + ledstripe_[26] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[27] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[28] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[29] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::tel() +{ + ledstripe_[30] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[31] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[32] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::nach() +{ + ledstripe_[41] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[40] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[39] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[38] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::vor() +{ + ledstripe_[37] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[36] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[35] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::halb() +{ + ledstripe_[44] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[45] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[46] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[47] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::zwoelf() +{ + ledstripe_[49] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[50] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[51] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[52] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[53] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::zwei() +{ + ledstripe_[65] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[64] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[63] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[62] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::eins() +{ + ledstripe_[63] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[62] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[61] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[60] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::ein() +{ + ledstripe_[63] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[62] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[61] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::sieben() +{ + ledstripe_[60] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[59] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[58] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[57] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[56] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[55] = hsvToRgb(hue_, saturation_, value_); + +} + +void WordClock::drei_h() +{ + ledstripe_[67] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[68] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[69] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[70] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::fuenf_h() +{ + ledstripe_[73] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[74] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[75] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[76] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::elf() +{ + ledstripe_[87] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[86] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[85] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::neun() +{ + ledstripe_[84] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[83] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[82] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[81] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::vier_h() +{ + ledstripe_[80] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[79] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[78] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[77] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::acht() +{ + ledstripe_[89] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[90] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[91] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[92] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::zehn_h() +{ + ledstripe_[93] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[94] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[95] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[96] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::sechs() +{ + ledstripe_[108] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[107] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[106] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[105] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[104] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::uhr() +{ + ledstripe_[101] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[100] = hsvToRgb(hue_, saturation_, value_); + ledstripe_[99] = hsvToRgb(hue_, saturation_, value_); +} + +void WordClock::m1(int second) +{ + ledstripe_[110] = hsvToRgb(hue_, saturation_, float(second)/60); +} + +void WordClock::m2(int second) +{ + ledstripe_[111] = hsvToRgb(hue_, saturation_, float(second)/60); +} + +void WordClock::m3(int second) +{ + ledstripe_[112] = hsvToRgb(hue_, saturation_, float(second)/60); +} + +void WordClock::m4(int second) +{ + ledstripe_[113] = hsvToRgb(hue_, saturation_, float(second)/60); +} + + +void WordClock::test_display(int option, int index) +{ + cls(); + //build and display the content of ledarray + switch (option) { + case 1 : { + // color gradient from red to red through hsv colors + for (int i=0; i<NUMLEDS; i++) { + ledstripe_[i] = hsvToRgb(1.0*i/NUMLEDS, saturation_, value_); + } + array_.update(ledstripe_,NUMLEDS); + break; + } + case 2 : { + //display one LED in WHite, full brightness + ledstripe_[index] = hsvToRgb(1.0, 0.0, 1.0);//white + array_.update(ledstripe_,NUMLEDS); + break; + } + case 3 : { + //display a word + cls(); + switch (index) { + case 1: { + es_ist(); + break; + } + case 2: { + fuenf_m(); + break; + } + case 3: { + zehn_m(); + break; + } + case 4: { + zwanzig(); + break; + } + case 5: { + drei_m(); + break; + } + case 6: { + vier_m(); + break; + } + case 7: { + tel(); + break; + } + case 8: { + nach(); + break; + } + case 9: { + vor(); + break; + } + case 10: { + halb(); + break; + } + case 11: { + zwoelf(); + break; + } + case 12: { + zwei(); + break; + } + case 13: { + eins(); + break; + } + case 14: { + sieben(); + break; + } + case 15: { + drei_h(); + break; + } + case 16: { + fuenf_h(); + break; + } + case 17: { + elf(); + break; + } + case 18: { + neun(); + break; + } + case 19: { + vier_h(); + break; + } + case 20: { + acht(); + break; + } + case 21: { + zehn_h(); + break; + } + case 22: { + sechs(); + break; + } + case 23: { + uhr(); + break; + } + case 24: { + m1(); + break; + } + case 25: { + m2(); + break; + } + case 26: { + m3(); + break; + } + case 27: { + m4(); + break; + } + case 28: { + ein(); + break; + } + + + }//switch + array_.update(ledstripe_,NUMLEDS); + break; + } + }//switch +} + +void WordClock::display_time(int hour,int minute, int second) +{ + //display the time in words + if (hour < 0 ) hour = 0; + if (hour > 23 ) hour = 23; + if (minute < 0) minute = 0; + if (minute > 59) minute = 59; + if (second < 0) second = 0; + if (second > 59) second = 59; + + //set the color depending on the hour + hue_ = float(hour)/24; + + cls(); + es_ist(); + //minutes + if (minute >=5 and minute <10) { + fuenf_m(); + nach(); + } + if (minute >=10 and minute <15) { + zehn_m(); + nach(); + } + if (minute >=15 and minute <20) { + vier_m(); + tel(); + nach(); + } + if (minute >=20 and minute <25) { + zwanzig(); + nach(); + } + if (minute >=25 and minute <30) { + fuenf_m(); + vor(); + halb(); + hour++; + } + if (minute >= 30 and minute<35) { + halb(); + hour++; + } + if (minute >=35 and minute<40) { + fuenf_m(); + nach(); + halb(); + hour++; + } + if (minute >=40 and minute<45) { + zwanzig(); + vor(); + hour++; + } + if (minute >=45 and minute<50) { + drei_m(); + vier_m(); + tel(); + hour++; + } + if (minute >=50 and minute<55) { + zehn_m(); + vor(); + hour++; + } + if (minute >=55 and minute<60) { + fuenf_m(); + vor(); + hour++; + } + //hours + if (hour >=13) hour -= 12; + switch (hour){ + case 0:{ + zwoelf(); + break; + } + case 1:{ + ein(); + break; + } + case 2:{ + zwei(); + break; + } + case 3:{ + drei_h(); + break; + } + case 4:{ + vier_h(); + break; + } + case 5:{ + fuenf_h(); + break; + } + case 6:{ + sechs(); + break; + } + case 7:{ + sieben(); + break; + } + case 8:{ + acht(); + break; + } + case 9:{ + neun(); + break; + } + case 10:{ + zehn_h(); + break; + } + case 11:{ + elf(); + break; + } + case 12:{ + zwoelf(); + break; + } + }//switch hour + uhr(); + + //minutes 0..4 and seconds in brigtness + switch (minute%5){ + case 0:{ + m1(second); + break; + } + case 1:{ + m1(); + m2(second); + break; + } + case 2:{ + m1(); + m2(); + m3(second); + break; + } + case 3:{ + m1(); + m2(); + m3(); + m4(second); + break; + } + case 4:{ + // we don't have a 5th led for minute 4..5 + // dim down all 4 LEDs + m1(59-second); + m2(59-second); + m3(59-second); + m4(59-second); + break; + } + }//switch minute%5 + //display the LED-Array + array_.update(ledstripe_,NUMLEDS); +}