Nathan Yonkee / Mbed OS DotStar

Fork of DotStar by Suga koubou

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?

UserRevisionLine numberNew 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 }