Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of DotStar by
main.cpp@6:f16ae7276254, 2017-07-02 (annotated)
- Committer:
- Nathan Yonkee
- Date:
- Sun Jul 02 11:58:22 2017 -0600
- Revision:
- 6:f16ae7276254
- Parent:
- 3:7d7945d4f224
- Child:
- 9:c13d60680417
use the Q-touch sensor and one analog input
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| tulanthoar | 3:7d7945d4f224 | 1 | /* |
| tulanthoar | 3:7d7945d4f224 | 2 | * APA102 (Adafruit DotStar LED Strip) |
| tulanthoar | 3:7d7945d4f224 | 3 | */ |
| tulanthoar | 3:7d7945d4f224 | 4 | |
| tulanthoar | 3:7d7945d4f224 | 5 | #include "mbed.h" |
| tulanthoar | 3:7d7945d4f224 | 6 | #include "rtos.h" |
| Nathan Yonkee |
6:f16ae7276254 | 7 | #include "MPR121.h" |
| tulanthoar | 3:7d7945d4f224 | 8 | |
| Nathan Yonkee |
6:f16ae7276254 | 9 | #define LED_NUM 145 |
| tulanthoar | 3:7d7945d4f224 | 10 | #define LED_FREQ 500000 // spi |
| tulanthoar | 3:7d7945d4f224 | 11 | |
| Nathan Yonkee |
6:f16ae7276254 | 12 | I2C i2c(PA_10, PA_9); |
| Nathan Yonkee |
6:f16ae7276254 | 13 | MPR121 touch_pad(i2c, MPR121::ADDR_VSS); |
| Nathan Yonkee |
6:f16ae7276254 | 14 | AnalogIn colorIn(PA_0); |
| tulanthoar | 3:7d7945d4f224 | 15 | SPI spiOne(PB_5, PB_4, PB_3); |
| tulanthoar | 3:7d7945d4f224 | 16 | SPI spiTwo(PA_7, PA_6, PA_5); |
| tulanthoar | 3:7d7945d4f224 | 17 | |
| tulanthoar | 3:7d7945d4f224 | 18 | Thread heartbeat; |
| tulanthoar | 3:7d7945d4f224 | 19 | void blink() { |
| tulanthoar | 3:7d7945d4f224 | 20 | /* for(DigitalOut led(LED2);; Thread::wait(500) ) { */ |
| tulanthoar | 3:7d7945d4f224 | 21 | /* led = !led; */ |
| tulanthoar | 3:7d7945d4f224 | 22 | /* } */ |
| tulanthoar | 3:7d7945d4f224 | 23 | } |
| tulanthoar | 3:7d7945d4f224 | 24 | |
| Nathan Yonkee |
6:f16ae7276254 | 25 | void dotStar (SPI *const line, int led_buf[], int brightness = 31) { |
| tulanthoar | 3:7d7945d4f224 | 26 | int i; |
| tulanthoar | 3:7d7945d4f224 | 27 | for (i = 4; i --> 0; line->write(0)) { } // start frame |
| Nathan Yonkee |
6:f16ae7276254 | 28 | for (i = 0; i < LED_NUM; ++i) { |
| Nathan Yonkee |
6:f16ae7276254 | 29 | line->write((7<<5) | brightness ); // led frame |
| Nathan Yonkee |
6:f16ae7276254 | 30 | line->write((led_buf[i] >> 16) & 0xff); // B |
| Nathan Yonkee |
6:f16ae7276254 | 31 | line->write((led_buf[i] >> 8) & 0xff); // G |
| Nathan Yonkee |
6:f16ae7276254 | 32 | line->write(led_buf[i] & 0xff); // R |
| Nathan Yonkee |
6:f16ae7276254 | 33 | } |
| Nathan Yonkee |
6:f16ae7276254 | 34 | for (i = 0; i < LED_NUM; ++i) { |
| Nathan Yonkee |
6:f16ae7276254 | 35 | line->write((7<<5) | brightness ); // led frame |
| Nathan Yonkee |
6:f16ae7276254 | 36 | line->write((led_buf[i] >> 16) & 0xff); // B |
| Nathan Yonkee |
6:f16ae7276254 | 37 | line->write((led_buf[i] >> 8) & 0xff); // G |
| Nathan Yonkee |
6:f16ae7276254 | 38 | line->write(led_buf[i] & 0xff); // R |
| Nathan Yonkee |
6:f16ae7276254 | 39 | } |
| tulanthoar | 3:7d7945d4f224 | 40 | for (i = 4; i --> 0; line->write(1)) { } // end frame |
| tulanthoar | 3:7d7945d4f224 | 41 | } |
| tulanthoar | 3:7d7945d4f224 | 42 | |
| tulanthoar | 3:7d7945d4f224 | 43 | int main() { |
| Nathan Yonkee |
6:f16ae7276254 | 44 | int led_buf1[LED_NUM] = {}; |
| Nathan Yonkee |
6:f16ae7276254 | 45 | int led_buf2[LED_NUM] = {}; |
| Nathan Yonkee |
6:f16ae7276254 | 46 | int blue = 0x0f << 16; |
| Nathan Yonkee |
6:f16ae7276254 | 47 | int green = 0x0f << 8; |
| Nathan Yonkee |
6:f16ae7276254 | 48 | int red = 0x0f; |
| Nathan Yonkee |
6:f16ae7276254 | 49 | for (int i = 0; i < LED_NUM; ++i) { |
| Nathan Yonkee |
6:f16ae7276254 | 50 | led_buf1[i] = green|blue|red; |
| Nathan Yonkee |
6:f16ae7276254 | 51 | led_buf2[i] = led_buf1[i]; |
| Nathan Yonkee |
6:f16ae7276254 | 52 | } |
| Nathan Yonkee |
6:f16ae7276254 | 53 | for (int i = 0; i < LED_NUM; ++i) { |
| Nathan Yonkee |
6:f16ae7276254 | 54 | led_buf1[i] = green|blue|red; |
| Nathan Yonkee |
6:f16ae7276254 | 55 | led_buf2[i] = led_buf1[i]; |
| Nathan Yonkee |
6:f16ae7276254 | 56 | } |
| tulanthoar | 3:7d7945d4f224 | 57 | spiOne.frequency(LED_FREQ); |
| tulanthoar | 3:7d7945d4f224 | 58 | spiTwo.frequency(LED_FREQ); |
| Nathan Yonkee |
6:f16ae7276254 | 59 | dotStar(&spiOne, led_buf1); |
| Nathan Yonkee |
6:f16ae7276254 | 60 | dotStar(&spiTwo, led_buf2); |
| Nathan Yonkee |
6:f16ae7276254 | 61 | Thread::wait(1000); |
| tulanthoar | 3:7d7945d4f224 | 62 | |
| Nathan Yonkee |
6:f16ae7276254 | 63 | int pattern[4] = {}; |
| Nathan Yonkee |
6:f16ae7276254 | 64 | int old_pattern[4] = {}; |
| Nathan Yonkee |
6:f16ae7276254 | 65 | int which_color = 0; |
| Nathan Yonkee |
6:f16ae7276254 | 66 | const int waitTime = 500; |
| Nathan Yonkee |
6:f16ae7276254 | 67 | bool sleeping = false; |
| Nathan Yonkee |
6:f16ae7276254 | 68 | bool set_one = true; |
| Nathan Yonkee |
6:f16ae7276254 | 69 | int offset = 0; |
| Nathan Yonkee |
6:f16ae7276254 | 70 | int colorIndex = 0; |
| Nathan Yonkee |
6:f16ae7276254 | 71 | int colorInput = 0; |
| Nathan Yonkee |
6:f16ae7276254 | 72 | for (heartbeat.start(callback(blink)); ; Thread::wait(waitTime)) { |
| Nathan Yonkee |
6:f16ae7276254 | 73 | offset++; |
| Nathan Yonkee |
6:f16ae7276254 | 74 | if(touch_pad.buttonPressed() == 1){ |
| Nathan Yonkee |
6:f16ae7276254 | 75 | which_color++; |
| Nathan Yonkee |
6:f16ae7276254 | 76 | if(which_color > 2) which_color = 0; |
| Nathan Yonkee |
6:f16ae7276254 | 77 | dotStar(&spiTwo, led_buf2, 16); |
| Nathan Yonkee |
6:f16ae7276254 | 78 | dotStar(&spiOne, led_buf1, 16); |
| Nathan Yonkee |
6:f16ae7276254 | 79 | }; |
| Nathan Yonkee |
6:f16ae7276254 | 80 | if(touch_pad.buttonPressed() == 2){ |
| Nathan Yonkee |
6:f16ae7276254 | 81 | set_one = !set_one; |
| Nathan Yonkee |
6:f16ae7276254 | 82 | dotStar(&spiTwo, led_buf2, 16); |
| Nathan Yonkee |
6:f16ae7276254 | 83 | dotStar(&spiOne, led_buf1, 16); |
| Nathan Yonkee |
6:f16ae7276254 | 84 | } |
| Nathan Yonkee |
6:f16ae7276254 | 85 | if (touch_pad.buttonPressed() == 3){ |
| Nathan Yonkee |
6:f16ae7276254 | 86 | Thread::wait(1000); |
| Nathan Yonkee |
6:f16ae7276254 | 87 | if (touch_pad.buttonPressed() == 3){ sleeping = true; |
| Nathan Yonkee |
6:f16ae7276254 | 88 | dotStar(&spiTwo, led_buf2, 0); |
| Nathan Yonkee |
6:f16ae7276254 | 89 | dotStar(&spiOne, led_buf1, 0); |
| Nathan Yonkee |
6:f16ae7276254 | 90 | } |
| Nathan Yonkee |
6:f16ae7276254 | 91 | } |
| Nathan Yonkee |
6:f16ae7276254 | 92 | colorInput = floor(colorIn.read()*0xff); |
| Nathan Yonkee |
6:f16ae7276254 | 93 | if(which_color == 2) blue = colorInput << 16; |
| Nathan Yonkee |
6:f16ae7276254 | 94 | else if(which_color == 1) red = colorInput; |
| Nathan Yonkee |
6:f16ae7276254 | 95 | else if(which_color == 0) green = colorInput << 8; |
| Nathan Yonkee |
6:f16ae7276254 | 96 | else green = 0xff << 8; |
| tulanthoar | 3:7d7945d4f224 | 97 | pattern[0] = green | red; |
| tulanthoar | 3:7d7945d4f224 | 98 | pattern[1] = green | blue; |
| tulanthoar | 3:7d7945d4f224 | 99 | pattern[2] = blue | red; |
| tulanthoar | 3:7d7945d4f224 | 100 | pattern[3] = green| blue | red ; |
| Nathan Yonkee |
6:f16ae7276254 | 101 | if(set_one){ |
| Nathan Yonkee |
6:f16ae7276254 | 102 | for (int i = 0; i < 4; i++) { |
| Nathan Yonkee |
6:f16ae7276254 | 103 | old_pattern[i] = led_buf2[i]; |
| Nathan Yonkee |
6:f16ae7276254 | 104 | } |
| Nathan Yonkee |
6:f16ae7276254 | 105 | } |
| Nathan Yonkee |
6:f16ae7276254 | 106 | else{ |
| Nathan Yonkee |
6:f16ae7276254 | 107 | for (int i = 0; i < 4; i++) { |
| Nathan Yonkee |
6:f16ae7276254 | 108 | old_pattern[i] = led_buf1[i]; |
| Nathan Yonkee |
6:f16ae7276254 | 109 | } |
| Nathan Yonkee |
6:f16ae7276254 | 110 | }; |
| Nathan Yonkee |
6:f16ae7276254 | 111 | /* cI = offset; */ |
| Nathan Yonkee |
6:f16ae7276254 | 112 | for (int i = 0; i < LED_NUM; ++i) { |
| tulanthoar | 3:7d7945d4f224 | 113 | /* c = ((color + i) % 7) + 1; */ |
| Nathan Yonkee |
6:f16ae7276254 | 114 | /* led_buf1[i] = (c & 4 ? 0xff0000 : 0) | (c & 2 ? 0xff00 : 0) | (c & 1 ? 0xff : 0); */ |
| Nathan Yonkee |
6:f16ae7276254 | 115 | /* led_buf1[i] = even ? gr : gb; */ |
| Nathan Yonkee |
6:f16ae7276254 | 116 | /* led_buf1[i] = rb|green; */ |
| Nathan Yonkee |
6:f16ae7276254 | 117 | /* if(!even) led_buf1[i] = 0x0f000 | 0xff; */ |
| Nathan Yonkee |
6:f16ae7276254 | 118 | /* else led_buf1[i] = green | 0xff; */ |
| Nathan Yonkee |
6:f16ae7276254 | 119 | /* led_buf1[i] = led_buf1[i] | 0x0f0000; */ |
| tulanthoar | 3:7d7945d4f224 | 120 | /* even = !even; */ |
| Nathan Yonkee |
6:f16ae7276254 | 121 | /* ++cI; */ |
| Nathan Yonkee |
6:f16ae7276254 | 122 | /* if(cI > 3) cI = 0; */ |
| Nathan Yonkee |
6:f16ae7276254 | 123 | colorIndex = (offset + i) % 3; |
| Nathan Yonkee |
6:f16ae7276254 | 124 | colorIndex = 3; |
| Nathan Yonkee |
6:f16ae7276254 | 125 | if(set_one){ |
| Nathan Yonkee |
6:f16ae7276254 | 126 | led_buf1[i] = pattern[colorIndex]; |
| Nathan Yonkee |
6:f16ae7276254 | 127 | led_buf2[i] = old_pattern[colorIndex]; |
| Nathan Yonkee |
6:f16ae7276254 | 128 | } |
| Nathan Yonkee |
6:f16ae7276254 | 129 | else{ |
| Nathan Yonkee |
6:f16ae7276254 | 130 | |
| Nathan Yonkee |
6:f16ae7276254 | 131 | led_buf1[i] = old_pattern[colorIndex]; |
| Nathan Yonkee |
6:f16ae7276254 | 132 | led_buf2[i] = pattern[colorIndex]; |
| Nathan Yonkee |
6:f16ae7276254 | 133 | } |
| tulanthoar | 3:7d7945d4f224 | 134 | } |
| Nathan Yonkee |
6:f16ae7276254 | 135 | dotStar(&spiOne, led_buf1); |
| Nathan Yonkee |
6:f16ae7276254 | 136 | dotStar(&spiTwo, led_buf2); |
| Nathan Yonkee |
6:f16ae7276254 | 137 | while (sleeping) { |
| Nathan Yonkee |
6:f16ae7276254 | 138 | dotStar(&spiTwo, led_buf2, 0); |
| Nathan Yonkee |
6:f16ae7276254 | 139 | dotStar(&spiOne, led_buf1, 0); |
| tulanthoar | 3:7d7945d4f224 | 140 | Thread::wait(100); |
| Nathan Yonkee |
6:f16ae7276254 | 141 | if (touch_pad.buttonPressed() == 2){ |
| Nathan Yonkee |
6:f16ae7276254 | 142 | Thread::wait(1000); |
| Nathan Yonkee |
6:f16ae7276254 | 143 | if (touch_pad.buttonPressed() == 2){ |
| Nathan Yonkee |
6:f16ae7276254 | 144 | sleeping = false; |
| Nathan Yonkee |
6:f16ae7276254 | 145 | dotStar(&spiOne, led_buf1); |
| Nathan Yonkee |
6:f16ae7276254 | 146 | dotStar(&spiTwo, led_buf2); |
| Nathan Yonkee |
6:f16ae7276254 | 147 | } |
| Nathan Yonkee |
6:f16ae7276254 | 148 | } |
| Nathan Yonkee |
6:f16ae7276254 | 149 | |
| tulanthoar | 3:7d7945d4f224 | 150 | } |
| Nathan Yonkee |
6:f16ae7276254 | 151 | |
| tulanthoar | 3:7d7945d4f224 | 152 | } |
| tulanthoar | 3:7d7945d4f224 | 153 | } |
