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
Diff: main.cpp
- Revision:
- 6:f16ae7276254
- Parent:
- 3:7d7945d4f224
- Child:
- 9:c13d60680417
--- a/main.cpp Sun Jul 02 17:37:21 2017 +0000
+++ b/main.cpp Sun Jul 02 11:58:22 2017 -0600
@@ -4,15 +4,14 @@
#include "mbed.h"
#include "rtos.h"
+#include "MPR121.h"
-#define LED_NUM 146
+#define LED_NUM 145
#define LED_FREQ 500000 // spi
-AnalogIn blueIn(PA_3);
-AnalogIn greenIn(PA_1);
-AnalogIn redIn(PA_0);
-DigitalIn onOff(PA_8);
-DigitalIn stripToggle(PB_1);
+I2C i2c(PA_10, PA_9);
+MPR121 touch_pad(i2c, MPR121::ADDR_VSS);
+AnalogIn colorIn(PA_0);
SPI spiOne(PB_5, PB_4, PB_3);
SPI spiTwo(PA_7, PA_6, PA_5);
@@ -23,58 +22,132 @@
/* } */
}
-void dotStar (SPI *const line, int led_buf[]) {
+void dotStar (SPI *const line, int led_buf[], int brightness = 31) {
int i;
for (i = 4; i --> 0; line->write(0)) { } // start frame
- for (i = 0; i < LED_NUM; ++i) {
- line->write((7<<5) | 31 ); // led frame
- line->write((led_buf[i] >> 16) & 0xff); // B
- line->write((led_buf[i] >> 8) & 0xff); // G
- line->write(led_buf[i] & 0xff); // R
- }
+ for (i = 0; i < LED_NUM; ++i) {
+ line->write((7<<5) | brightness ); // led frame
+ line->write((led_buf[i] >> 16) & 0xff); // B
+ line->write((led_buf[i] >> 8) & 0xff); // G
+ line->write(led_buf[i] & 0xff); // R
+ }
+ for (i = 0; i < LED_NUM; ++i) {
+ line->write((7<<5) | brightness ); // led frame
+ line->write((led_buf[i] >> 16) & 0xff); // B
+ line->write((led_buf[i] >> 8) & 0xff); // G
+ line->write(led_buf[i] & 0xff); // R
+ }
for (i = 4; i --> 0; line->write(1)) { } // end frame
}
int main() {
- int led_buf[LED_NUM] = {};
- int zero_buf[LED_NUM] = {};
- int i, blue, green, red;
- int cI = 0;
- int pattern[4] = {};
+ int led_buf1[LED_NUM] = {};
+ int led_buf2[LED_NUM] = {};
+ int blue = 0x0f << 16;
+ int green = 0x0f << 8;
+ int red = 0x0f;
+ for (int i = 0; i < LED_NUM; ++i) {
+ led_buf1[i] = green|blue|red;
+ led_buf2[i] = led_buf1[i];
+ }
+ for (int i = 0; i < LED_NUM; ++i) {
+ led_buf1[i] = green|blue|red;
+ led_buf2[i] = led_buf1[i];
+ }
spiOne.frequency(LED_FREQ);
spiTwo.frequency(LED_FREQ);
- dotStar(&spiOne, led_buf);
- dotStar(&spiTwo, led_buf);
+ dotStar(&spiOne, led_buf1);
+ dotStar(&spiTwo, led_buf2);
+ Thread::wait(1000);
- const int waitTime = 1000;
- for (heartbeat.start(callback(blink));; Thread::wait(waitTime)) {
- blue = static_cast<int>(floor(blueIn.read()*0xff))<< 16;
- green = static_cast<int>(floor(greenIn.read()*0xff))<< 8;
- red = floor(redIn.read()*0xff);
+ int pattern[4] = {};
+ int old_pattern[4] = {};
+ int which_color = 0;
+ const int waitTime = 500;
+ bool sleeping = false;
+ bool set_one = true;
+ int offset = 0;
+ int colorIndex = 0;
+ int colorInput = 0;
+ for (heartbeat.start(callback(blink)); ; Thread::wait(waitTime)) {
+ offset++;
+ if(touch_pad.buttonPressed() == 1){
+ which_color++;
+ if(which_color > 2) which_color = 0;
+ dotStar(&spiTwo, led_buf2, 16);
+ dotStar(&spiOne, led_buf1, 16);
+ };
+ if(touch_pad.buttonPressed() == 2){
+ set_one = !set_one;
+ dotStar(&spiTwo, led_buf2, 16);
+ dotStar(&spiOne, led_buf1, 16);
+ }
+ if (touch_pad.buttonPressed() == 3){
+ Thread::wait(1000);
+ if (touch_pad.buttonPressed() == 3){ sleeping = true;
+ dotStar(&spiTwo, led_buf2, 0);
+ dotStar(&spiOne, led_buf1, 0);
+ }
+ }
+ colorInput = floor(colorIn.read()*0xff);
+ if(which_color == 2) blue = colorInput << 16;
+ else if(which_color == 1) red = colorInput;
+ else if(which_color == 0) green = colorInput << 8;
+ else green = 0xff << 8;
pattern[0] = green | red;
pattern[1] = green | blue;
pattern[2] = blue | red;
pattern[3] = green| blue | red ;
- for (i = 0; i < LED_NUM; ++i) {
+ if(set_one){
+ for (int i = 0; i < 4; i++) {
+ old_pattern[i] = led_buf2[i];
+ }
+ }
+ else{
+ for (int i = 0; i < 4; i++) {
+ old_pattern[i] = led_buf1[i];
+ }
+ };
+ /* cI = offset; */
+ for (int i = 0; i < LED_NUM; ++i) {
/* c = ((color + i) % 7) + 1; */
- /* led_buf[i] = (c & 4 ? 0xff0000 : 0) | (c & 2 ? 0xff00 : 0) | (c & 1 ? 0xff : 0); */
- /* led_buf[i] = even ? gr : gb; */
- /* led_buf[i] = rb|green; */
- /* if(!even) led_buf[i] = 0x0f000 | 0xff; */
- /* else led_buf[i] = green | 0xff; */
- /* led_buf[i] = led_buf[i] | 0x0f0000; */
+ /* led_buf1[i] = (c & 4 ? 0xff0000 : 0) | (c & 2 ? 0xff00 : 0) | (c & 1 ? 0xff : 0); */
+ /* led_buf1[i] = even ? gr : gb; */
+ /* led_buf1[i] = rb|green; */
+ /* if(!even) led_buf1[i] = 0x0f000 | 0xff; */
+ /* else led_buf1[i] = green | 0xff; */
+ /* led_buf1[i] = led_buf1[i] | 0x0f0000; */
/* even = !even; */
- /* cI = (-(~cI & ~(cI >> 1))) & 0b11; */
- led_buf[i] = pattern[3];
- }
- if(stripToggle) {
- dotStar(&spiOne, led_buf);
+ /* ++cI; */
+ /* if(cI > 3) cI = 0; */
+ colorIndex = (offset + i) % 3;
+ colorIndex = 3;
+ if(set_one){
+ led_buf1[i] = pattern[colorIndex];
+ led_buf2[i] = old_pattern[colorIndex];
+ }
+ else{
+
+ led_buf1[i] = old_pattern[colorIndex];
+ led_buf2[i] = pattern[colorIndex];
+ }
}
- dotStar(&spiTwo, led_buf);
- while (!onOff.read()) {
- dotStar(&spiTwo, zero_buf);
- dotStar(&spiOne, zero_buf);
+ dotStar(&spiOne, led_buf1);
+ dotStar(&spiTwo, led_buf2);
+ while (sleeping) {
+ dotStar(&spiTwo, led_buf2, 0);
+ dotStar(&spiOne, led_buf1, 0);
Thread::wait(100);
+ if (touch_pad.buttonPressed() == 2){
+ Thread::wait(1000);
+ if (touch_pad.buttonPressed() == 2){
+ sleeping = false;
+ dotStar(&spiOne, led_buf1);
+ dotStar(&spiTwo, led_buf2);
+ }
+ }
+
}
+
}
}
