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
- Committer:
- Nathan Yonkee
- Date:
- 2017-07-02
- Revision:
- 6:f16ae7276254
- Parent:
- 3:7d7945d4f224
- Child:
- 9:c13d60680417
File content as of revision 6:f16ae7276254:
/*
* APA102 (Adafruit DotStar LED Strip)
*/
#include "mbed.h"
#include "rtos.h"
#include "MPR121.h"
#define LED_NUM 145
#define LED_FREQ 500000 // spi
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);
Thread heartbeat;
void blink() {
/* for(DigitalOut led(LED2);; Thread::wait(500) ) { */
/* led = !led; */
/* } */
}
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) | 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_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_buf1);
dotStar(&spiTwo, led_buf2);
Thread::wait(1000);
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 ;
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_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; */
/* 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(&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);
}
}
}
}
}
