add rotary encoder, parameters, multiple strips
This commit is contained in:
parent
777f32b3af
commit
adad6b5117
2 changed files with 122 additions and 45 deletions
|
@ -15,3 +15,4 @@ framework = arduino
|
||||||
lib_deps =
|
lib_deps =
|
||||||
rfetick/MPU6050_light@^1.1.0
|
rfetick/MPU6050_light@^1.1.0
|
||||||
fastled/FastLED@^3.4.0
|
fastled/FastLED@^3.4.0
|
||||||
|
mathertel/RotaryEncoder@^1.5.0
|
||||||
|
|
166
src/main.ino
166
src/main.ino
|
@ -6,19 +6,22 @@
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
#include <FastLED.h>
|
#include <FastLED.h>
|
||||||
#include <MPU6050_light.h>
|
#include <MPU6050_light.h>
|
||||||
|
#include <RotaryEncoder.h>
|
||||||
|
|
||||||
#define LED_PIN 7
|
byte LED_PIN = 6;
|
||||||
|
|
||||||
byte mode = 5; // 0 for acceleration, 1 for fire, 2 for waterfall, 3 pride, 4 glitter, 5 pulse, 6 off
|
byte mode = 5; // 0 for acceleration, 1 for fire, 2 for waterfall, 3 pride, 4 glitter, 5 pulse, 6 off
|
||||||
const byte NUM_MODES = 8;
|
byte parameter = 128;
|
||||||
|
byte modeSelect;
|
||||||
|
const byte NUM_MODES = 9;
|
||||||
const byte debug = 3;
|
const byte debug = 3;
|
||||||
const byte STRIPS = 6;
|
const byte STRIPS = 6;
|
||||||
const byte NUM_LEDS = 10;
|
const byte NUM_LEDS = 15;
|
||||||
const byte FRAMES_PER_SECOND = 60;
|
const byte FRAMES_PER_SECOND = 60;
|
||||||
const float range = 0.5; //accelleration range in g
|
const float range = 0.5; //accelleration range in g
|
||||||
|
|
||||||
const byte BRIGHTNESS = 50;
|
byte BRIGHTNESS = 2;
|
||||||
const byte COOLING = 80;
|
const byte COOLING = 47;
|
||||||
const byte SPARKING = 50;
|
const byte SPARKING = 50;
|
||||||
uint8_t gHue = 0;
|
uint8_t gHue = 0;
|
||||||
|
|
||||||
|
@ -31,29 +34,45 @@ float h[NUM_BALLS] ; // An array of heights
|
||||||
float vImpact0 = sqrt( -2 * GRAVITY * h0 ); // Impact velocity of the ball when it hits the ground if "dropped" from the top of the strip
|
float vImpact0 = sqrt( -2 * GRAVITY * h0 ); // Impact velocity of the ball when it hits the ground if "dropped" from the top of the strip
|
||||||
float vImpact[NUM_BALLS] ; // As time goes on the impact velocity will change, so make an array to store those values
|
float vImpact[NUM_BALLS] ; // As time goes on the impact velocity will change, so make an array to store those values
|
||||||
float tCycle[NUM_BALLS] ; // The time since the last time the ball struck the ground
|
float tCycle[NUM_BALLS] ; // The time since the last time the ball struck the ground
|
||||||
int pos[NUM_BALLS] ; // The integer position of the dot on the strip (LED index)
|
byte pos[NUM_BALLS] ; // The integer position of the dot on the strip (LED index)
|
||||||
long tLast[NUM_BALLS] ; // The clock time of the last ground strike
|
long tLast[NUM_BALLS] ; // The clock time of the last ground strike
|
||||||
float COR[NUM_BALLS] ; // Coefficient of Restitution (bounce damping)
|
float COR[NUM_BALLS] ; // Coefficient of Restitution (bounce damping)
|
||||||
|
|
||||||
float accelerationHistory [STRIPS];
|
float accelerationHistory [STRIPS];
|
||||||
|
int encoderPosition = 1;
|
||||||
|
|
||||||
MPU6050 mpu(Wire);
|
MPU6050 mpu(Wire);
|
||||||
CRGB leds[NUM_LEDS * STRIPS];
|
CRGB leds[NUM_LEDS * STRIPS];
|
||||||
|
CRGB ledsR[NUM_LEDS * STRIPS];
|
||||||
CRGBPalette16 gPal;
|
CRGBPalette16 gPal;
|
||||||
CRGB flagcolors[6] = {CRGB::Red, CRGB::DarkOrange, CRGB::Yellow, CRGB::DarkGreen, CRGB::Blue, CRGB::DarkViolet};
|
CRGB flagcolors[3][6] {{CRGB::Red, CRGB::DarkOrange, CRGB::Yellow, CRGB::DarkGreen, CRGB::Blue, CRGB::DarkViolet},
|
||||||
|
{CRGB::DarkBlue, CRGB::DeepPink, CRGB::Gray, CRGB::Gray, CRGB::DeepPink, CRGB::DarkBlue},
|
||||||
|
{CRGB::DeepPink, CRGB::Gray, CRGB::DarkViolet, CRGB::Black, CRGB::Blue, CRGB::Black}};
|
||||||
|
|
||||||
const byte modeSwitchPin = 2;
|
const byte modeSwitchPin = 2;
|
||||||
|
RotaryEncoder encoder(A2, A3);
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
Serial.begin(19200);
|
Serial.begin(19200);
|
||||||
//setup LEDs
|
//setup LEDs
|
||||||
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS*STRIPS).setCorrection( TypicalLEDStrip );
|
FastLED.addLeds<WS2812, 6, GRB>(ledsR, NUM_LEDS * 0, NUM_LEDS).setCorrection( TypicalLEDStrip );
|
||||||
|
FastLED.addLeds<WS2812, 7, GRB>(ledsR, NUM_LEDS * 1, NUM_LEDS).setCorrection( TypicalLEDStrip );
|
||||||
|
FastLED.addLeds<WS2812, 8, GRB>(ledsR, NUM_LEDS * 2, NUM_LEDS).setCorrection( TypicalLEDStrip );
|
||||||
|
FastLED.addLeds<WS2812, 9, GRB>(ledsR, NUM_LEDS * 3, NUM_LEDS).setCorrection( TypicalLEDStrip );
|
||||||
|
FastLED.addLeds<WS2812, 10, GRB>(ledsR, NUM_LEDS * 4, NUM_LEDS).setCorrection( TypicalLEDStrip );
|
||||||
|
FastLED.addLeds<WS2812, 11, GRB>(ledsR, NUM_LEDS * 5, NUM_LEDS).setCorrection( TypicalLEDStrip );
|
||||||
FastLED.setBrightness( BRIGHTNESS );
|
FastLED.setBrightness( BRIGHTNESS );
|
||||||
|
|
||||||
|
|
||||||
pinMode(modeSwitchPin, INPUT_PULLUP);
|
pinMode(modeSwitchPin, INPUT_PULLUP);
|
||||||
|
pinMode(3, OUTPUT);
|
||||||
|
pinMode(4, OUTPUT);
|
||||||
|
pinMode(5, OUTPUT);
|
||||||
attachInterrupt(digitalPinToInterrupt(modeSwitchPin), setMode, RISING);
|
attachInterrupt(digitalPinToInterrupt(modeSwitchPin), setMode, RISING);
|
||||||
|
|
||||||
|
PCICR |= (1 << PCIE1);
|
||||||
|
PCMSK1 |= (1 << PCINT10) | (1 << PCINT11);
|
||||||
|
|
||||||
for (int i = 0; i<STRIPS; i++) {
|
for (int i = 0; i<STRIPS; i++) {
|
||||||
accelerationHistory[i] = 1;
|
accelerationHistory[i] = 1;
|
||||||
}
|
}
|
||||||
|
@ -82,6 +101,12 @@ void setup() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The Interrupt Service Routine for Pin Change Interrupt 1
|
||||||
|
// This routine will only be called on any signal change on A2 and A3: exactly where we need to check.
|
||||||
|
ISR(PCINT1_vect) {
|
||||||
|
encoder.tick(); // just call tick() to check the state.
|
||||||
|
}
|
||||||
|
|
||||||
float calculateOrientationData() {
|
float calculateOrientationData() {
|
||||||
mpu.update();
|
mpu.update();
|
||||||
float accCombined = sqrt(pow(mpu.getAccX(), 2) + pow(mpu.getAccY(), 2) + pow(mpu.getAccZ(), 2));
|
float accCombined = sqrt(pow(mpu.getAccX(), 2) + pow(mpu.getAccY(), 2) + pow(mpu.getAccZ(), 2));
|
||||||
|
@ -208,9 +233,9 @@ void drawFire(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawPride(){
|
void drawPride(byte parameter){
|
||||||
for (int strip = 0; strip < STRIPS; strip++){
|
for (int strip = 0; strip < STRIPS; strip++){
|
||||||
CRGB color = flagcolors[strip];
|
CRGB color = flagcolors[parameter % 3][strip];
|
||||||
for( int j = 0; j < NUM_LEDS; j++) {
|
for( int j = 0; j < NUM_LEDS; j++) {
|
||||||
int pixelnumber = (strip * NUM_LEDS) + j;
|
int pixelnumber = (strip * NUM_LEDS) + j;
|
||||||
leds[pixelnumber] = color;
|
leds[pixelnumber] = color;
|
||||||
|
@ -218,13 +243,13 @@ void drawPride(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawGlitter(){
|
void drawGlitter(byte parameter){
|
||||||
fadeToBlackBy( leds, STRIPS*NUM_LEDS, 10);
|
fadeToBlackBy( leds, STRIPS*NUM_LEDS, parameter/10);
|
||||||
int pos = random16(STRIPS*NUM_LEDS);
|
int pos = random16(STRIPS*NUM_LEDS);
|
||||||
leds[pos] += CHSV( gHue + random8(64), 200, 255);
|
leds[pos] += CHSV( gHue + random8(64), 200, 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawPulse(){
|
void drawPulse(byte parameter){
|
||||||
static int current_step;
|
static int current_step;
|
||||||
float steps = 2000;
|
float steps = 2000;
|
||||||
CRGB color;
|
CRGB color;
|
||||||
|
@ -232,23 +257,12 @@ void drawPulse(){
|
||||||
//float f = 0.5-0.5*cos(360/steps*float(current_step) + 360/steps*360/float(STRIPS)*float(strip));
|
//float f = 0.5-0.5*cos(360/steps*float(current_step) + 360/steps*360/float(STRIPS)*float(strip));
|
||||||
float f = cos(360/steps*float(current_step) + 360/steps*360/float(2*STRIPS)*float(strip));
|
float f = cos(360/steps*float(current_step) + 360/steps*360/float(2*STRIPS)*float(strip));
|
||||||
if (f < 0) f = 0;
|
if (f < 0) f = 0;
|
||||||
color = CHSV(gHue , 255, int(255*f));
|
if (mode == 5) {
|
||||||
for( int j = 0; j < NUM_LEDS; j++) {
|
color = CHSV(parameter , 255, int(255*f));
|
||||||
int pixelnumber = (strip * NUM_LEDS) + j;
|
}
|
||||||
leds[pixelnumber] = color;
|
else {
|
||||||
|
color = CHSV(224 , 255, int(255*f));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
current_step++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void drawKunsisLila(){
|
|
||||||
static int current_step;
|
|
||||||
float steps = 2000;
|
|
||||||
CRGB color;
|
|
||||||
for (int strip = 0; strip < STRIPS; strip++){
|
|
||||||
float f = cos(360/steps*float(current_step) + 360/steps*360/float(2*STRIPS)*float(strip));
|
|
||||||
if (f < 0) f = 0;
|
|
||||||
color = CHSV(224 , 255, int(255*f));
|
|
||||||
for( int j = 0; j < NUM_LEDS; j++) {
|
for( int j = 0; j < NUM_LEDS; j++) {
|
||||||
int pixelnumber = (strip * NUM_LEDS) + j;
|
int pixelnumber = (strip * NUM_LEDS) + j;
|
||||||
leds[pixelnumber] = color;
|
leds[pixelnumber] = color;
|
||||||
|
@ -289,18 +303,71 @@ void drawOff(){
|
||||||
}
|
}
|
||||||
|
|
||||||
void setMode(){
|
void setMode(){
|
||||||
mode++;
|
static unsigned long last_interrupt_time = 0;
|
||||||
if (mode >= NUM_MODES) {
|
unsigned long interrupt_time = millis();
|
||||||
mode = 0;
|
if (interrupt_time - last_interrupt_time > 200) {
|
||||||
|
if (modeSelect == 2) {
|
||||||
|
encoder.setPosition(mode);
|
||||||
|
modeSelect = 0;
|
||||||
|
digitalWrite(3, HIGH);
|
||||||
|
digitalWrite(4, LOW);
|
||||||
|
digitalWrite(5, LOW);
|
||||||
|
}
|
||||||
|
else if (modeSelect == 0) {
|
||||||
|
encoder.setPosition(parameter);
|
||||||
|
modeSelect = 1;
|
||||||
|
digitalWrite(3, LOW);
|
||||||
|
digitalWrite(4, HIGH);
|
||||||
|
digitalWrite(5, LOW);
|
||||||
|
}
|
||||||
|
else if (modeSelect == 1) {
|
||||||
|
encoder.setPosition(BRIGHTNESS);
|
||||||
|
modeSelect = 2;
|
||||||
|
digitalWrite(3, LOW);
|
||||||
|
digitalWrite(4, LOW);
|
||||||
|
digitalWrite(5, HIGH);
|
||||||
|
}
|
||||||
|
last_interrupt_time = interrupt_time;
|
||||||
}
|
}
|
||||||
if (debug <= 3) {
|
|
||||||
Serial.print("Blinkmode:\t");
|
|
||||||
Serial.println(mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
|
encoder.tick();
|
||||||
|
|
||||||
|
int newPos = encoder.getPosition();
|
||||||
|
if (encoderPosition != newPos) {
|
||||||
|
encoderPosition = newPos;
|
||||||
|
if (debug <= 3) {
|
||||||
|
Serial.print("Position:\t");
|
||||||
|
Serial.print(encoderPosition);
|
||||||
|
Serial.print("\t");
|
||||||
|
Serial.print("modeSelect:\t");
|
||||||
|
Serial.print(modeSelect);
|
||||||
|
Serial.print("\t");
|
||||||
|
}
|
||||||
|
if (modeSelect == 0) {
|
||||||
|
mode = encoderPosition % NUM_MODES;
|
||||||
|
}
|
||||||
|
else if (modeSelect == 1){
|
||||||
|
parameter = encoderPosition % 255;
|
||||||
|
}
|
||||||
|
else if (modeSelect == 2){
|
||||||
|
BRIGHTNESS = encoderPosition % 32;
|
||||||
|
}
|
||||||
|
if (debug <= 3) {
|
||||||
|
Serial.print("Blinkmode:\t");
|
||||||
|
Serial.print(mode);
|
||||||
|
Serial.print("\t");
|
||||||
|
Serial.print("Parameter:\t");
|
||||||
|
Serial.print(parameter);
|
||||||
|
Serial.print("\t");
|
||||||
|
Serial.print("Brightness:\t");
|
||||||
|
Serial.println(BRIGHTNESS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (mode == 0) {
|
if (mode == 0) {
|
||||||
// === Read acceleromter data === //
|
// === Read acceleromter data === //
|
||||||
float accCombined = calculateOrientationData();
|
float accCombined = calculateOrientationData();
|
||||||
|
@ -311,23 +378,32 @@ void loop() {
|
||||||
drawFire();
|
drawFire();
|
||||||
}
|
}
|
||||||
else if (mode == 3) {
|
else if (mode == 3) {
|
||||||
drawPride();
|
drawPride(parameter);
|
||||||
}
|
}
|
||||||
else if (mode == 4) {
|
else if (mode == 4) {
|
||||||
drawGlitter();
|
drawGlitter(parameter);
|
||||||
}
|
}
|
||||||
else if (mode == 5) {
|
else if ((mode == 5) || (mode ==6)) {
|
||||||
drawPulse();
|
drawPulse(parameter);
|
||||||
}
|
|
||||||
else if (mode == 6) {
|
|
||||||
drawKunsisLila();
|
|
||||||
}
|
}
|
||||||
else if (mode == 7) {
|
else if (mode == 7) {
|
||||||
bounceBalls();
|
bounceBalls();
|
||||||
}
|
}
|
||||||
else if (mode == 8) {
|
else {
|
||||||
drawOff();
|
drawOff();
|
||||||
}
|
}
|
||||||
|
FastLED.setBrightness( BRIGHTNESS * 8 );
|
||||||
|
if (mode != 2){
|
||||||
|
for (uint8_t i=0; i<NUM_LEDS*STRIPS; i++) {
|
||||||
|
ledsR[NUM_LEDS*STRIPS-1-i] = leds[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (uint8_t i=0; i<NUM_LEDS*STRIPS; i++) {
|
||||||
|
ledsR[i] = leds[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
FastLED.show();
|
FastLED.show();
|
||||||
gHue++;
|
gHue++;
|
||||||
FastLED.delay(1000 / FRAMES_PER_SECOND);
|
FastLED.delay(1000 / FRAMES_PER_SECOND);
|
||||||
|
|
Loading…
Reference in a new issue