Allan Wang
/
rgbstick
Cascaded TLC5947 control
main.cpp@0:647dde9749db, 2012-01-16 (annotated)
- Committer:
- allanw
- Date:
- Mon Jan 16 20:47:05 2012 +0000
- Revision:
- 0:647dde9749db
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
allanw | 0:647dde9749db | 1 | #include "mbed.h" |
allanw | 0:647dde9749db | 2 | #include "lut.h" |
allanw | 0:647dde9749db | 3 | |
allanw | 0:647dde9749db | 4 | SPI spi(p11, p12, p13); |
allanw | 0:647dde9749db | 5 | DigitalOut latchpin(p10); |
allanw | 0:647dde9749db | 6 | DigitalOut led1(LED1); |
allanw | 0:647dde9749db | 7 | DigitalOut led2(LED2); |
allanw | 0:647dde9749db | 8 | InterruptIn hall(p7); |
allanw | 0:647dde9749db | 9 | |
allanw | 0:647dde9749db | 10 | #define LEDS 96 |
allanw | 0:647dde9749db | 11 | #define MAX_BRIGHTNESS 4095 |
allanw | 0:647dde9749db | 12 | |
allanw | 0:647dde9749db | 13 | void HSVtoRGB( int *r, int *g,int *b, int h, int s, int v ); |
allanw | 0:647dde9749db | 14 | |
allanw | 0:647dde9749db | 15 | |
allanw | 0:647dde9749db | 16 | void hall_fall() { |
allanw | 0:647dde9749db | 17 | led1 = 1; |
allanw | 0:647dde9749db | 18 | } |
allanw | 0:647dde9749db | 19 | |
allanw | 0:647dde9749db | 20 | void hall_rise() { |
allanw | 0:647dde9749db | 21 | led1 = 0; |
allanw | 0:647dde9749db | 22 | } |
allanw | 0:647dde9749db | 23 | |
allanw | 0:647dde9749db | 24 | void latch() { |
allanw | 0:647dde9749db | 25 | latchpin = 1; |
allanw | 0:647dde9749db | 26 | latchpin = 1; |
allanw | 0:647dde9749db | 27 | latchpin = 1; |
allanw | 0:647dde9749db | 28 | latchpin = 1; |
allanw | 0:647dde9749db | 29 | latchpin = 1; |
allanw | 0:647dde9749db | 30 | latchpin = 1; |
allanw | 0:647dde9749db | 31 | latchpin = 0; |
allanw | 0:647dde9749db | 32 | } |
allanw | 0:647dde9749db | 33 | |
allanw | 0:647dde9749db | 34 | int main() { |
allanw | 0:647dde9749db | 35 | // When magnet goes near Hall-effect sensor, its output will go LOW |
allanw | 0:647dde9749db | 36 | hall.fall(&hall_fall); |
allanw | 0:647dde9749db | 37 | hall.rise(&hall_rise); |
allanw | 0:647dde9749db | 38 | |
allanw | 0:647dde9749db | 39 | spi.format(12, 0); |
allanw | 0:647dde9749db | 40 | spi.frequency(16 * 1000 * 1000); |
allanw | 0:647dde9749db | 41 | |
allanw | 0:647dde9749db | 42 | int brightness = 0; |
allanw | 0:647dde9749db | 43 | int dir = 0; |
allanw | 0:647dde9749db | 44 | int r, g, b; |
allanw | 0:647dde9749db | 45 | |
allanw | 0:647dde9749db | 46 | latchpin = 0; |
allanw | 0:647dde9749db | 47 | while (1) { |
allanw | 0:647dde9749db | 48 | for (int h = 3599; h >= 0; h--) { |
allanw | 0:647dde9749db | 49 | for (int i = LEDS-1; i >= 0; i--) { |
allanw | 0:647dde9749db | 50 | HSVtoRGB(&r, &g, &b, h + i*150/4, 4095, brightness / 4); |
allanw | 0:647dde9749db | 51 | |
allanw | 0:647dde9749db | 52 | spi.write(gamma[b]); |
allanw | 0:647dde9749db | 53 | spi.write(gamma[g]); |
allanw | 0:647dde9749db | 54 | spi.write(gamma[r]); |
allanw | 0:647dde9749db | 55 | } |
allanw | 0:647dde9749db | 56 | latch(); |
allanw | 0:647dde9749db | 57 | |
allanw | 0:647dde9749db | 58 | if (dir == 0) { |
allanw | 0:647dde9749db | 59 | brightness += 1; |
allanw | 0:647dde9749db | 60 | if (brightness >= 4096) { |
allanw | 0:647dde9749db | 61 | brightness = 4095; |
allanw | 0:647dde9749db | 62 | dir = 1; |
allanw | 0:647dde9749db | 63 | } |
allanw | 0:647dde9749db | 64 | } else { |
allanw | 0:647dde9749db | 65 | brightness -= 1; |
allanw | 0:647dde9749db | 66 | if (brightness < 0) { |
allanw | 0:647dde9749db | 67 | brightness = 0; |
allanw | 0:647dde9749db | 68 | dir = 0; |
allanw | 0:647dde9749db | 69 | } |
allanw | 0:647dde9749db | 70 | } |
allanw | 0:647dde9749db | 71 | } |
allanw | 0:647dde9749db | 72 | } |
allanw | 0:647dde9749db | 73 | } |
allanw | 0:647dde9749db | 74 | |
allanw | 0:647dde9749db | 75 | void HSVtoRGB( int *r, int *g,int *b, int h, int s, int v ) { |
allanw | 0:647dde9749db | 76 | int f; |
allanw | 0:647dde9749db | 77 | int p, q, t; |
allanw | 0:647dde9749db | 78 | |
allanw | 0:647dde9749db | 79 | if ( s == 0 ) { |
allanw | 0:647dde9749db | 80 | *r = *g = *b = v; |
allanw | 0:647dde9749db | 81 | return; |
allanw | 0:647dde9749db | 82 | } |
allanw | 0:647dde9749db | 83 | |
allanw | 0:647dde9749db | 84 | h = h % 3600; |
allanw | 0:647dde9749db | 85 | |
allanw | 0:647dde9749db | 86 | f = ((h%600)*4095)/600; |
allanw | 0:647dde9749db | 87 | h /= 600; |
allanw | 0:647dde9749db | 88 | |
allanw | 0:647dde9749db | 89 | p = (v * (4096-s))/4096; |
allanw | 0:647dde9749db | 90 | q = (v * (4096 - (s*f)/4096))/4096; |
allanw | 0:647dde9749db | 91 | t = (v * (4096 - (s*(4096-f))/4096))/4096; |
allanw | 0:647dde9749db | 92 | |
allanw | 0:647dde9749db | 93 | switch ( h ) { |
allanw | 0:647dde9749db | 94 | case 0: |
allanw | 0:647dde9749db | 95 | *r = v; |
allanw | 0:647dde9749db | 96 | *g = t; |
allanw | 0:647dde9749db | 97 | *b = p; |
allanw | 0:647dde9749db | 98 | break; |
allanw | 0:647dde9749db | 99 | case 1: |
allanw | 0:647dde9749db | 100 | *r = q; |
allanw | 0:647dde9749db | 101 | *g = v; |
allanw | 0:647dde9749db | 102 | *b = p; |
allanw | 0:647dde9749db | 103 | break; |
allanw | 0:647dde9749db | 104 | case 2: |
allanw | 0:647dde9749db | 105 | *r = p; |
allanw | 0:647dde9749db | 106 | *g = v; |
allanw | 0:647dde9749db | 107 | *b = t; |
allanw | 0:647dde9749db | 108 | break; |
allanw | 0:647dde9749db | 109 | case 3: |
allanw | 0:647dde9749db | 110 | *r = p; |
allanw | 0:647dde9749db | 111 | *g = q; |
allanw | 0:647dde9749db | 112 | *b = v; |
allanw | 0:647dde9749db | 113 | break; |
allanw | 0:647dde9749db | 114 | case 4: |
allanw | 0:647dde9749db | 115 | *r = t; |
allanw | 0:647dde9749db | 116 | *g = p; |
allanw | 0:647dde9749db | 117 | *b = v; |
allanw | 0:647dde9749db | 118 | break; |
allanw | 0:647dde9749db | 119 | default: // case 5: |
allanw | 0:647dde9749db | 120 | *r = v; |
allanw | 0:647dde9749db | 121 | *g = p; |
allanw | 0:647dde9749db | 122 | *b = q; |
allanw | 0:647dde9749db | 123 | break; |
allanw | 0:647dde9749db | 124 | } |
allanw | 0:647dde9749db | 125 | } |