Karl Zweimüller / WordClock_de

Dependents:   WordClock

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers WordClock.cpp Source File

WordClock.cpp

00001 #include "mbed.h"
00002 #include "WordClock.h"
00003 #include "neopixel.h"
00004 
00005 WordClock::WordClock (PinName pin) : di_pin_(pin, PullDown), array_(pin)
00006 {
00007 
00008     // Create a temporary DigitalIn so we can configure the pull-down resistor.
00009     // (The mbed API doesn't provide any other way to do this.)
00010     // An alternative is to connect an external pull-down resistor.
00011     //DigitalIn(pin, PullDown);
00012     // The pixel array control class.
00013     //neopixel::PixelArray array(pin);
00014 
00015     // initialize hsv
00016     //hue_ = 0.0;             //red
00017     hue_ = 0.2917;            //limett-green
00018     saturation_ = 1.0;      //full color
00019     value_ = 1.0;           //brightness
00020 
00021 }
00022 
00023 /** Convert a color from the HSV representation to RGB.
00024  *
00025  * @param h hue 0.0 ... 1.0
00026  * @param s saturation 0.0 ... 1.0
00027  * @param v value 0.0 ... 1.0
00028 */
00029 neopixel::Pixel WordClock::hsvToRgb(float h, float s, float v)
00030 {
00031     int i = floor(h * 6);
00032     float f = h * 6 - i;
00033     float p = v * (1 - s);
00034     float q = v * (1 - f * s);
00035     float t = v * (1 - (1 - f) * s);
00036     float r = 0, g = 0, b = 0;
00037     switch(i % 6) {
00038         case 0:
00039             r = v;
00040             g = t;
00041             b = p;
00042             break;
00043         case 1:
00044             r = q;
00045             g = v;
00046             b = p;
00047             break;
00048         case 2:
00049             r = p;
00050             g = v;
00051             b = t;
00052             break;
00053         case 3:
00054             r = p;
00055             g = q;
00056             b = v;
00057             break;
00058         case 4:
00059             r = t;
00060             g = p;
00061             b = v;
00062             break;
00063         case 5:
00064             r = v;
00065             g = p;
00066             b = q;
00067             break;
00068     }
00069     return (neopixel::Pixel) {
00070         r * 255, g * 255, b * 255
00071     };
00072 }
00073 
00074 void WordClock::cls()
00075 {
00076     int i;
00077     for (i=0; i<NUMLEDS; i++) {
00078         ledstripe_[i].red=0;
00079         ledstripe_[i].green=0;
00080         ledstripe_[i].blue=0;
00081     }
00082 }
00083 
00084 void WordClock::es_ist()
00085 {
00086     ledstripe_[0] = hsvToRgb(hue_, saturation_, value_);
00087     ledstripe_[1] = hsvToRgb(hue_, saturation_, value_);
00088     ledstripe_[3] = hsvToRgb(hue_, saturation_, value_);
00089     ledstripe_[4] = hsvToRgb(hue_, saturation_, value_);
00090     ledstripe_[5] = hsvToRgb(hue_, saturation_, value_);
00091 }
00092 void WordClock::fuenf_m()
00093 {
00094     ledstripe_[7] = hsvToRgb(hue_, saturation_, value_);
00095     ledstripe_[8] = hsvToRgb(hue_, saturation_, value_);
00096     ledstripe_[9] = hsvToRgb(hue_, saturation_, value_);
00097     ledstripe_[10]= hsvToRgb(hue_, saturation_, value_);
00098 }
00099 void WordClock::zehn_m()
00100 {
00101     ledstripe_[21] = hsvToRgb(hue_, saturation_, value_);
00102     ledstripe_[20] = hsvToRgb(hue_, saturation_, value_);
00103     ledstripe_[19] = hsvToRgb(hue_, saturation_, value_);
00104     ledstripe_[18] = hsvToRgb(hue_, saturation_, value_);
00105 }
00106 
00107 void WordClock::zwanzig()
00108 {
00109     ledstripe_[17] = hsvToRgb(hue_, saturation_, value_);
00110     ledstripe_[16] = hsvToRgb(hue_, saturation_, value_);
00111     ledstripe_[15] = hsvToRgb(hue_, saturation_, value_);
00112     ledstripe_[14] = hsvToRgb(hue_, saturation_, value_);
00113     ledstripe_[13] = hsvToRgb(hue_, saturation_, value_);
00114     ledstripe_[12] = hsvToRgb(hue_, saturation_, value_);
00115     ledstripe_[11] = hsvToRgb(hue_, saturation_, value_);
00116 }
00117 
00118 void WordClock::drei_m()
00119 {
00120     ledstripe_[22] = hsvToRgb(hue_, saturation_, value_);
00121     ledstripe_[23] = hsvToRgb(hue_, saturation_, value_);
00122     ledstripe_[24] = hsvToRgb(hue_, saturation_, value_);
00123     ledstripe_[25] = hsvToRgb(hue_, saturation_, value_);
00124 }
00125 
00126 void WordClock::vier_m()
00127 {
00128     ledstripe_[26] = hsvToRgb(hue_, saturation_, value_);
00129     ledstripe_[27] = hsvToRgb(hue_, saturation_, value_);
00130     ledstripe_[28] = hsvToRgb(hue_, saturation_, value_);
00131     ledstripe_[29] = hsvToRgb(hue_, saturation_, value_);
00132 }
00133 
00134 void WordClock::tel()
00135 {
00136     ledstripe_[30] = hsvToRgb(hue_, saturation_, value_);
00137     ledstripe_[31] = hsvToRgb(hue_, saturation_, value_);
00138     ledstripe_[32] = hsvToRgb(hue_, saturation_, value_);
00139 }
00140 
00141 void WordClock::nach()
00142 {
00143     ledstripe_[41] = hsvToRgb(hue_, saturation_, value_);
00144     ledstripe_[40] = hsvToRgb(hue_, saturation_, value_);
00145     ledstripe_[39] = hsvToRgb(hue_, saturation_, value_);
00146     ledstripe_[38] = hsvToRgb(hue_, saturation_, value_);
00147 }
00148 
00149 void WordClock::vor()
00150 {
00151     ledstripe_[37] = hsvToRgb(hue_, saturation_, value_);
00152     ledstripe_[36] = hsvToRgb(hue_, saturation_, value_);
00153     ledstripe_[35] = hsvToRgb(hue_, saturation_, value_);
00154 }
00155 
00156 void WordClock::halb()
00157 {
00158     ledstripe_[44] = hsvToRgb(hue_, saturation_, value_);
00159     ledstripe_[45] = hsvToRgb(hue_, saturation_, value_);
00160     ledstripe_[46] = hsvToRgb(hue_, saturation_, value_);
00161     ledstripe_[47] = hsvToRgb(hue_, saturation_, value_);
00162 }
00163 
00164 void WordClock::zwoelf()
00165 {
00166     ledstripe_[49] = hsvToRgb(hue_, saturation_, value_);
00167     ledstripe_[50] = hsvToRgb(hue_, saturation_, value_);
00168     ledstripe_[51] = hsvToRgb(hue_, saturation_, value_);
00169     ledstripe_[52] = hsvToRgb(hue_, saturation_, value_);
00170     ledstripe_[53] = hsvToRgb(hue_, saturation_, value_);
00171 }
00172 
00173 void WordClock::zwei()
00174 {
00175     ledstripe_[65] = hsvToRgb(hue_, saturation_, value_);
00176     ledstripe_[64] = hsvToRgb(hue_, saturation_, value_);
00177     ledstripe_[63] = hsvToRgb(hue_, saturation_, value_);
00178     ledstripe_[62] = hsvToRgb(hue_, saturation_, value_);
00179 }
00180 
00181 void WordClock::eins()
00182 {
00183     ledstripe_[63] = hsvToRgb(hue_, saturation_, value_);
00184     ledstripe_[62] = hsvToRgb(hue_, saturation_, value_);
00185     ledstripe_[61] = hsvToRgb(hue_, saturation_, value_);
00186     ledstripe_[60] = hsvToRgb(hue_, saturation_, value_);
00187 }
00188 
00189 void WordClock::ein()
00190 {
00191     ledstripe_[63] = hsvToRgb(hue_, saturation_, value_);
00192     ledstripe_[62] = hsvToRgb(hue_, saturation_, value_);
00193     ledstripe_[61] = hsvToRgb(hue_, saturation_, value_);
00194 }
00195 
00196 void WordClock::sieben()
00197 {
00198     ledstripe_[60] = hsvToRgb(hue_, saturation_, value_);
00199     ledstripe_[59] = hsvToRgb(hue_, saturation_, value_);
00200     ledstripe_[58] = hsvToRgb(hue_, saturation_, value_);
00201     ledstripe_[57] = hsvToRgb(hue_, saturation_, value_);
00202     ledstripe_[56] = hsvToRgb(hue_, saturation_, value_);
00203     ledstripe_[55] = hsvToRgb(hue_, saturation_, value_);
00204 
00205 }
00206 
00207 void WordClock::drei_h()
00208 {
00209     ledstripe_[67] = hsvToRgb(hue_, saturation_, value_);
00210     ledstripe_[68] = hsvToRgb(hue_, saturation_, value_);
00211     ledstripe_[69] = hsvToRgb(hue_, saturation_, value_);
00212     ledstripe_[70] = hsvToRgb(hue_, saturation_, value_);
00213 }
00214 
00215 void WordClock::fuenf_h()
00216 {
00217     ledstripe_[73] = hsvToRgb(hue_, saturation_, value_);
00218     ledstripe_[74] = hsvToRgb(hue_, saturation_, value_);
00219     ledstripe_[75] = hsvToRgb(hue_, saturation_, value_);
00220     ledstripe_[76] = hsvToRgb(hue_, saturation_, value_);
00221 }
00222 
00223 void WordClock::elf()
00224 {
00225     ledstripe_[87] = hsvToRgb(hue_, saturation_, value_);
00226     ledstripe_[86] = hsvToRgb(hue_, saturation_, value_);
00227     ledstripe_[85] = hsvToRgb(hue_, saturation_, value_);
00228 }
00229 
00230 void WordClock::neun()
00231 {
00232     ledstripe_[84] = hsvToRgb(hue_, saturation_, value_);
00233     ledstripe_[83] = hsvToRgb(hue_, saturation_, value_);
00234     ledstripe_[82] = hsvToRgb(hue_, saturation_, value_);
00235     ledstripe_[81] = hsvToRgb(hue_, saturation_, value_);
00236 }
00237 
00238 void WordClock::vier_h()
00239 {
00240     ledstripe_[80] = hsvToRgb(hue_, saturation_, value_);
00241     ledstripe_[79] = hsvToRgb(hue_, saturation_, value_);
00242     ledstripe_[78] = hsvToRgb(hue_, saturation_, value_);
00243     ledstripe_[77] = hsvToRgb(hue_, saturation_, value_);
00244 }
00245 
00246 void WordClock::acht()
00247 {
00248     ledstripe_[89] = hsvToRgb(hue_, saturation_, value_);
00249     ledstripe_[90] = hsvToRgb(hue_, saturation_, value_);
00250     ledstripe_[91] = hsvToRgb(hue_, saturation_, value_);
00251     ledstripe_[92] = hsvToRgb(hue_, saturation_, value_);
00252 }
00253 
00254 void WordClock::zehn_h()
00255 {
00256     ledstripe_[93] = hsvToRgb(hue_, saturation_, value_);
00257     ledstripe_[94] = hsvToRgb(hue_, saturation_, value_);
00258     ledstripe_[95] = hsvToRgb(hue_, saturation_, value_);
00259     ledstripe_[96] = hsvToRgb(hue_, saturation_, value_);
00260 }
00261 
00262 void WordClock::sechs()
00263 {
00264     ledstripe_[108] = hsvToRgb(hue_, saturation_, value_);
00265     ledstripe_[107] = hsvToRgb(hue_, saturation_, value_);
00266     ledstripe_[106] = hsvToRgb(hue_, saturation_, value_);
00267     ledstripe_[105] = hsvToRgb(hue_, saturation_, value_);
00268     ledstripe_[104] = hsvToRgb(hue_, saturation_, value_);
00269 }
00270 
00271 void WordClock::uhr()
00272 {
00273     ledstripe_[101] = hsvToRgb(hue_, saturation_, value_);
00274     ledstripe_[100] = hsvToRgb(hue_, saturation_, value_);
00275     ledstripe_[99]  = hsvToRgb(hue_, saturation_, value_);
00276 }
00277 
00278 void WordClock::m1(int second)
00279 {
00280     ledstripe_[110] = hsvToRgb(hue_, saturation_, float(second)/60);
00281 }
00282 
00283 void WordClock::m2(int second)
00284 {
00285     ledstripe_[111] = hsvToRgb(hue_, saturation_, float(second)/60);
00286 }
00287 
00288 void WordClock::m3(int second)
00289 {
00290     ledstripe_[112] = hsvToRgb(hue_, saturation_, float(second)/60);
00291 }
00292 
00293 void WordClock::m4(int second)
00294 {
00295     ledstripe_[113] = hsvToRgb(hue_, saturation_, float(second)/60);
00296 }
00297 
00298 void WordClock::sz()
00299 {
00300     cls();
00301     ledstripe_[4] = hsvToRgb(hue_, saturation_, value_);
00302     ledstripe_[17] = hsvToRgb(hue_, saturation_, value_);
00303     array_.update(ledstripe_,NUMLEDS);
00304 }
00305 
00306 void WordClock::wz()
00307 {
00308     cls();
00309     ledstripe_[16] = hsvToRgb(hue_, saturation_, value_);
00310     ledstripe_[13] = hsvToRgb(hue_, saturation_, value_);
00311     array_.update(ledstripe_,NUMLEDS);
00312 }
00313 
00314 void WordClock::test_display(int option, int index)
00315 {
00316     cls();
00317     //build and display the content of ledarray
00318     switch (option) {
00319         case 1 : {
00320             // color gradient from red to red through hsv colors
00321             for (int i=0; i<NUMLEDS; i++) {
00322                 ledstripe_[i] = hsvToRgb(1.0*i/NUMLEDS, saturation_, value_);
00323             }
00324             array_.update(ledstripe_,NUMLEDS);
00325             break;
00326         }
00327         case 2 : {
00328             //display one LED in White, full brightness
00329             ledstripe_[index] = hsvToRgb(1.0, 0.0, 1.0);//white
00330             array_.update(ledstripe_,NUMLEDS);
00331             break;
00332         }
00333         case 3 : {
00334             //display a word
00335             cls();
00336             switch (index) {
00337                 case 1: {
00338                     es_ist();
00339                     break;
00340                 }
00341                 case 2: {
00342                     fuenf_m();
00343                     break;
00344                 }
00345                 case 3: {
00346                     zehn_m();
00347                     break;
00348                 }
00349                 case 4: {
00350                     zwanzig();
00351                     break;
00352                 }
00353                 case 5: {
00354                     drei_m();
00355                     break;
00356                 }
00357                 case 6: {
00358                     vier_m();
00359                     break;
00360                 }
00361                 case 7: {
00362                     tel();
00363                     break;
00364                 }
00365                 case 8: {
00366                     nach();
00367                     break;
00368                 }
00369                 case 9: {
00370                     vor();
00371                     break;
00372                 }
00373                 case 10: {
00374                     halb();
00375                     break;
00376                 }
00377                 case 11: {
00378                     zwoelf();
00379                     break;
00380                 }
00381                 case 12: {
00382                     zwei();
00383                     break;
00384                 }
00385                 case 13: {
00386                     eins();
00387                     break;
00388                 }
00389                 case 14: {
00390                     sieben();
00391                     break;
00392                 }
00393                 case 15: {
00394                     drei_h();
00395                     break;
00396                 }
00397                 case 16: {
00398                     fuenf_h();
00399                     break;
00400                 }
00401                 case 17: {
00402                     elf();
00403                     break;
00404                 }
00405                 case 18: {
00406                     neun();
00407                     break;
00408                 }
00409                 case 19: {
00410                     vier_h();
00411                     break;
00412                 }
00413                 case 20: {
00414                     acht();
00415                     break;
00416                 }
00417                 case 21: {
00418                     zehn_h();
00419                     break;
00420                 }
00421                 case 22: {
00422                     sechs();
00423                     break;
00424                 }
00425                 case 23: {
00426                     uhr();
00427                     break;
00428                 }
00429                 case 24: {
00430                     m1();
00431                     break;
00432                 }
00433                 case 25: {
00434                     m2();
00435                     break;
00436                 }
00437                 case 26: {
00438                     m3();
00439                     break;
00440                 }
00441                 case 27: {
00442                     m4();
00443                     break;
00444                 }
00445                 case 28: {
00446                     ein();
00447                     break;
00448                 }
00449 
00450 
00451             }//switch
00452             array_.update(ledstripe_,NUMLEDS);
00453             break;
00454         }
00455     }//switch
00456 }
00457 
00458 void WordClock::display_time(int hour,int minute, int second)
00459 {
00460     //display the time in words
00461     if (hour < 0  ) hour = 0;
00462     if (hour > 23 ) hour = 23;
00463     if (minute <  0) minute = 0;
00464     if (minute > 59) minute = 59;
00465     if (second <  0) second = 0;
00466     if (second > 59) second = 59;
00467 
00468     //set the color depending on the hour
00469     hue_ = float(hour)/24; 
00470 
00471     cls();
00472     es_ist();
00473     //minutes
00474     if (minute >=5 and minute <10) {
00475         fuenf_m();
00476         nach();
00477     }
00478     if (minute >=10 and minute <15) {
00479         zehn_m();
00480         nach();
00481     }
00482     if (minute >=15 and minute <20) {
00483         vier_m();
00484         tel();
00485         nach();
00486     }
00487     if (minute >=20 and minute <25) {
00488         zwanzig();
00489         nach();
00490     }
00491     if (minute >=25 and minute <30) {
00492         fuenf_m();
00493         vor();
00494         halb();
00495         hour++;
00496     }
00497     if (minute >= 30 and minute<35) {
00498         halb();
00499         hour++;
00500     }
00501     if (minute >=35 and minute<40) {
00502         fuenf_m();
00503         nach();
00504         halb();
00505         hour++;
00506     }
00507     if (minute >=40 and minute<45) {
00508         zwanzig();
00509         vor();
00510         hour++;
00511     }
00512     if (minute >=45 and minute<50) {
00513         drei_m();
00514         vier_m();
00515         tel();
00516         hour++;
00517     }
00518     if (minute >=50 and minute<55) {
00519         zehn_m();
00520         vor();
00521         hour++;
00522     }
00523     if (minute >=55 and minute<60) {
00524         fuenf_m();
00525         vor();
00526         hour++;
00527     }
00528     //hours
00529     if (hour >=13) hour -= 12;
00530     switch (hour){
00531         case 0:{
00532             zwoelf();
00533             break;
00534         }
00535         case 1:{
00536             if (minute < 5) {
00537                 ein();
00538             }else{
00539                 eins();
00540             }
00541             break;
00542         }
00543         case 2:{
00544             zwei();
00545             break;
00546         }
00547         case 3:{
00548             drei_h();
00549             break;
00550         }
00551         case 4:{
00552             vier_h();
00553             break;
00554         }
00555         case 5:{
00556             fuenf_h();
00557             break;
00558         }
00559         case 6:{
00560             sechs();
00561             break;
00562         }
00563         case 7:{
00564             sieben();
00565             break;
00566         }
00567         case 8:{
00568             acht();
00569             break;
00570         }
00571         case 9:{
00572             neun();
00573             break;
00574         }
00575         case 10:{
00576             zehn_h();
00577             break;
00578         }
00579         case 11:{
00580             elf();
00581             break;
00582         }
00583         case 12:{
00584             zwoelf();
00585             break;
00586         }        
00587     }//switch hour
00588     
00589     //only on full hours
00590     if (minute < 5) {
00591         uhr();
00592     }
00593     
00594     //minutes 0..4 and seconds in brigtness
00595     switch (minute%5){
00596         case 0:{
00597             m1(second);
00598             break;
00599         }
00600         case 1:{
00601             m1();
00602             m2(second);
00603             break;
00604         }
00605         case 2:{
00606             m1();
00607             m2();
00608             m3(second);
00609             break;
00610         }
00611         case 3:{
00612             m1();
00613             m2();
00614             m3();
00615             m4(second);
00616             break;
00617         }
00618         case 4:{
00619             // we don't have a 5th led for minute 4..5
00620             // dim down all 4 LEDs 
00621             m1(59-second);
00622             m2(59-second);
00623             m3(59-second);
00624             m4(59-second);
00625             break;
00626         }
00627     }//switch minute%5
00628     //display the LED-Array
00629     array_.update(ledstripe_,NUMLEDS);
00630 }