#define DIM 6
#include <FastLED.h>
#define NUM_LEDS 4
#define NUM_RING 16
#define PIN_RING 9
#define PIN_LEDS 8
CRGB leds[NUM_LEDS];
CRGB ring[NUM_RING];
const uint8_t button[DIM] {2, 3, 4, 5, 6, 7};
bool trackRecorded[3]{false, false, false};
bool pressed[DIM] {false, false, false, false, false, false};
bool anyTrackSelected = false;
int lastPressed = 0;//Ne manca ovviamente uno per il progetto finale
bool state[DIM] {0, 0, 0, 0, 0, 0};
bool oldState[DIM] {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH};
uint8_t cont[DIM] {0, 0, 0, 0, 0, 0};
uint8_t modal = 0;
uint8_t ringUpdate = 0;
bool modeEffects = true;
void setup()
{
FastLED.addLeds<WS2812, PIN_RING, GRB>(ring, NUM_RING);
FastLED.addLeds<WS2812, PIN_LEDS, GRB>(leds, NUM_LEDS);
for (uint8_t i=0; i<DIM; i++){
pinMode(button[i],INPUT_PULLUP);
}
fill_solid (ring, NUM_RING, CRGB::Black);
FastLED.show();
Serial.begin(9600);
}
bool timer(uint16_t interval){
bool ret = false;
static unsigned long previousMillis, currentMillis;
currentMillis = millis() - previousMillis;
if (currentMillis >= interval){
previousMillis = millis();
ret = true;
}
return ret;
}
bool timer2(uint16_t interval){
bool ret = false;
static unsigned long previousMillis, currentMillis;
currentMillis = millis() - previousMillis;
if (currentMillis >= interval){
previousMillis = millis();
ret = true;
}
return ret;
}
void ring_Circle(uint32_t color){
static uint8_t position = 0;
if (timer2(60)){
position++;
}
if (position >= NUM_RING) {
position = 0;
}
for(int i = 0; i < NUM_RING; i++ ) {
fadeToBlackBy( ring, NUM_RING, 2); // 10 = long trail, 1 = short trail
ring[position] += color;
FastLED.show();
}
}
void ring_colors(){
switch (ringUpdate){
default:
fill_solid (ring, NUM_RING, CRGB::White);
FastLED.show();
modal = 0;
break;
case 1:
fill_solid (ring, NUM_RING, CRGB::Red);
FastLED.show();
modal = 1;
break;
case 2:
ring_Circle(CRGB::Green);
modal = 2;
break;
case 3:
ring_Circle(CRGB::Red);
FastLED.show();
modal = 3;
break;
case 4:
ring_Circle(CRGB::FairyLightNCC);
FastLED.show();
modal = 4;
break;
}
}
void mode(){
state[1] = digitalRead(button[1]);
if ((state[1]==LOW) && (oldState[1]==HIGH)){
if (timer(50)){
state[1] = digitalRead(button[1]);
pressed[1]=true;
if (++cont[1]>2) cont[1] = 1;
}
}
oldState[1] = state[1];
}
void track_1(){
state[2] = digitalRead(button[2]);
if((state[2]==LOW) && (oldState[2]==HIGH)){
if (timer(50)){
state[2] = digitalRead(button[2]);
pressed[2]=true;
lastPressed = 1;
anyTrackSelected = true;
}
if ((cont[1]==0) && (pressed[2]==true)){
pressed[2]=true;
pressed[3]=false;
pressed[4]=false;
}
if ((cont[1]>=1) && (pressed[2]==true)){
pressed[2]=true;
}
}
oldState[2] = state[2];
}
void track_2(){
state[3] = digitalRead(button[3]);
if((state[3]==LOW) && (oldState[3]==HIGH)){
if (timer(50)){
state[3] = digitalRead(button[3]);
pressed[3]=true;
lastPressed = 2;
anyTrackSelected=true;
}
if ((cont[1]==0) && (pressed[3]==true)){
pressed[2]=false;
pressed[3]=true;
pressed[4]=false;
}
if ((cont[1]>=1) && (pressed[3]==true)){
pressed[3]=true;
}
}
oldState[3] = state[3];
}
void track_3(){
state[4] = digitalRead(button[4]);
if((state[4]==LOW) && (oldState[4]==HIGH)){
if (timer(50)){
state[4] = digitalRead(button[4]);
pressed[4]=true;
lastPressed = 3;
anyTrackSelected=true;
}
if ((cont[1]==0) && (pressed[4]==true)){
pressed[2]=false;
pressed[3]=false;
pressed[4]=true;
}
if ((cont[1]>=1) && (pressed[4]==true)){
pressed[4]=true;
}
}
oldState[4] = state[4];
}
void set_tracksColors(){
if (modal == 0) { //default case
if (lastPressed==1){
leds[0] = CRGB::White;
leds[1] = CRGB::Black;
leds[2] = CRGB::Black;
}
if (lastPressed==2){
leds[0] = CRGB::Black;
leds[1] = CRGB::White;
leds[2] = CRGB::Black;
}
if (lastPressed==3){
leds[0] = CRGB::Black;
leds[1] = CRGB::Black;
leds[2] = CRGB::White;
}
if (lastPressed==0){
leds[0] = CRGB::Black;
leds[1] = CRGB::Black;
leds[2] = CRGB::Black;
}
FastLED.show();
}
if (cont[1] == 1) { //REC case
//Track one Recording
if ((lastPressed==1) && (pressed[2]==true) && (pressed[3]==false) && (pressed[4]==false)) {
leds[0] = CRGB::Red;
leds[1] = CRGB::Black;
leds[2] = CRGB::Black;
}
if ((lastPressed==1) && (pressed[2]==true) && (pressed[3]==true) && (pressed[4]==false)){
leds[0] = CRGB::Red;
leds[1] = CRGB::Green;
leds[2] = CRGB::Black;
}
if ((lastPressed==1) && (pressed[2]==true) && (pressed[3]==false) && (pressed[4] == true)){
leds[0] = CRGB::Red;
leds[1] = CRGB::Black;
leds[2] = CRGB::Green;
}
if ((lastPressed==1) && (pressed[2]==true) && (pressed[3]==true) && (pressed[4]==true)){
leds[0] = CRGB::Red;
leds[1] = CRGB::Green;
leds[2] = CRGB::Green;
}
//Track two Recording
if ((lastPressed==2) && (pressed[2]==false) && (pressed[3]==true) && (pressed[4]==false)){
leds[0] = CRGB::Black;
leds[1] = CRGB::Red;
leds[2] = CRGB::Black;
}
if ((lastPressed==2) && (pressed[2]==true) && (pressed[3]==true) && (pressed[4]==false)){
leds[0] = CRGB::Green;
leds[1] = CRGB::Red;
leds[2] = CRGB::Black;
}
if ((lastPressed==2) && (pressed[2]==false) && (pressed[3]==true) && (pressed[4]==true)){
leds[0] = CRGB::Black;
leds[1] = CRGB::Red;
leds[2] = CRGB::Green;
}
if ((lastPressed==2) && (pressed[2]==true) && (pressed[3]==true) && (pressed[4]==true)){
leds[0] = CRGB::Green;
leds[1] = CRGB::Red;
leds[2] = CRGB::Green;
}
//Track three Recording
if ((lastPressed==3) && (pressed[2]==false) && (pressed[3]==false) && (pressed[4]==true)){
leds[0] = CRGB::Black;
leds[1] = CRGB::Black;
leds[2] = CRGB::Red;
}
if ((lastPressed==3) && (pressed[2]==true) && (pressed[3]==false) && (pressed[4]==true)){
leds[0] = CRGB::Green;
leds[1] = CRGB::Black;
leds[2] = CRGB::Red;
}
if((lastPressed==3) && (pressed[2]==false) && (pressed[3]==true) && (pressed[4]==true)){
leds[0] = CRGB::Black;
leds[1] = CRGB::Green;
leds[2] = CRGB::Red;
}
if ((lastPressed==3) && (pressed[2]==true) && (pressed[3]==true) && (pressed[4]==true)){
leds[0] = CRGB::Green;
leds[1] = CRGB::Green;
leds[2] = CRGB::Red;
}
}
if (modal==2){ //PLAY case
//Track one Selected
if ((lastPressed==1) && (pressed[2]==true) && (pressed[3]==false) && (pressed[4]==false)) {
leds[0] = CRGB::White;
leds[1] = CRGB::Black;
leds[2] = CRGB::Black;
}
if ((lastPressed==1) && (pressed[2]==true) && (pressed[3]==true) && (pressed[4]==false)){
leds[0] = CRGB::White;
leds[1] = CRGB::Green;
leds[2] = CRGB::Black;
}
if ((lastPressed==1) && (pressed[2]==true) && (pressed[3]==false) && (pressed[4] == true)){
leds[0] = CRGB::White;
leds[1] = CRGB::Black;
leds[2] = CRGB::Green;
}
if ((lastPressed==1) && (pressed[2]==true) && (pressed[3]==true) && (pressed[4]==true)){
leds[0] = CRGB::White;
leds[1] = CRGB::Green;
leds[2] = CRGB::Green;
}
//Track two Selected
if ((lastPressed==2) && (pressed[2]==false) && (pressed[3]==true) && (pressed[4]==false)){
leds[0] = CRGB::Black;
leds[1] = CRGB::White;
leds[2] = CRGB::Black;
}
if ((lastPressed==2) && (pressed[2]==true) && (pressed[3]==true) && (pressed[4]==false)){
leds[0] = CRGB::Green;
leds[1] = CRGB::White;
leds[2] = CRGB::Black;
}
if ((lastPressed==2) && (pressed[2]==false) && (pressed[3]==true) && (pressed[4]==true)){
leds[0] = CRGB::Black;
leds[1] = CRGB::White;
leds[2] = CRGB::Green;
}
if ((lastPressed==2) && (pressed[2]==true) && (pressed[3]==true) && (pressed[4]==true)){
leds[0] = CRGB::Green;
leds[1] = CRGB::White;
leds[2] = CRGB::Green;
}
//Track three Selected
if ((lastPressed==3) && (pressed[2]==false) && (pressed[3]==false) && (pressed[4]==true)){
leds[0] = CRGB::Black;
leds[1] = CRGB::Black;
leds[2] = CRGB::White;
}
if ((lastPressed==3) && (pressed[2]==true) && (pressed[3]==false) && (pressed[4]==true)){
leds[0] = CRGB::Green;
leds[1] = CRGB::Black;
leds[2] = CRGB::White;
}
if((lastPressed==3) && (pressed[2]==false) && (pressed[3]==true) && (pressed[4]==true)){
leds[0] = CRGB::Black;
leds[1] = CRGB::Green;
leds[2] = CRGB::White;
}
if ((lastPressed==3) && (pressed[2]==true) && (pressed[3]==true) && (pressed[4]==true)){
leds[0] = CRGB::Green;
leds[1] = CRGB::Green;
leds[2] = CRGB::White;
}
}
FastLED.show();
}
void play(){
static uint8_t cases = 0;
if(pressed[1]==true && cont[1]==1){
switch (cases){
default:
ringUpdate = 1;
break;
case 1:
ringUpdate = 3;
break;
case 2:
ringUpdate = 4;
break;
}
}
if(pressed[1]==true && cont[1]==2){
switch (cases){
default:
ringUpdate = 2;
break;
}
}
if ((pressed[1]) && (anyTrackSelected)){
state[0] = digitalRead(button[0]);
if(state[0]==LOW && oldState[0]==HIGH){
if(timer(50)){
state[0] = digitalRead(button[0]);
pressed[0]=true;
if(lastPressed==1){
if(trackRecorded[0]==false){
Serial.println("Registro per la prima volta la traccia 1");
cases = 1;
}
if(trackRecorded[0]==true){
if(++cont[0] > 2) {cont[0] = 1;}
switch(cont[0]){
case 1:
Serial.println("Overdub sulla traccia 1");
cases = 2;
break;
case 2:
Serial.println("Stop overdub traccia 1");
cases = 0;
break;
}
}
trackRecorded[0] = true;
}
if(lastPressed==2){
if(trackRecorded[1]==false){
Serial.println("Registro per la prima volta la traccia 1");
cases = 1;
}
if(trackRecorded[1]==true){
if(++cont[0] > 2) {cont[0] = 1;}
switch(cont[0]){
case 1:
Serial.println("Overdub sulla traccia 2");
cases = 2;
break;
case 2:
Serial.println("Stop overdub traccia 2");
cases = 0;
break;
}
}
trackRecorded[1]=true;
}
if(lastPressed==3){
if(trackRecorded[2]==false){
Serial.println("Registro per la prima volta la traccia 1");
cases = 1;
}
if(trackRecorded[2]==true){
if(++cont[0] > 2) {cont[0] = 1;}
switch(cont[0]){
case 1:
Serial.println("Overdub sulla traccia 3");
cases = 2;
break;
case 2:
Serial.println("Stop overdub traccia 3");
cases = 0;
break;
}
}
trackRecorded[2]=true;
}
}
}
}
oldState[0] = state[0];
}
void blink(){
static bool blinkLeds = false;
if (timer(800)){
blinkLeds = !blinkLeds;
}
if (blinkLeds==true){
leds[0] = CRGB::Red;
FastLED.show();
}
if (blinkLeds==false){
leds[0] = CRGB::Black;
FastLED.show();
}
}
/*void play(){
if ((pressed[1]) && (anyTrackSelected)){
state[0] = digitalRead(button[0]);
if ((state[0]==LOW) && (oldState[0])==HIGH){
if(timer(50)){
state[0] = digitalRead(button[0]);
pressed[0]=true;
if (cont[1]==1){
if (lastPressed==1){
if (trackRecorded[0]==false){
modeEffects = false;
Serial.println("Registro per la prima volta traccia 1");
ringUpdate = 3;
}
if (trackRecorded[0]==true){
if(++cont[0] > 2) {cont[0] = 1;}
switch(cont[0]){
case 1:
Serial.println("Overdub sulla traccia 1");
ringUpdate = 4;
break;
case 2:
Serial.println("Stop overdub traccia 2");
ringUpdate = 1;
break;
}
}
trackRecorded[0]=true;
}
if (lastPressed==2){
if (trackRecorded[1]==false){
Serial.println("Registro per la prima volta traccia 2");
}
if (trackRecorded[1]==true){
Serial.println("Overdub sulla traccia 2");
}
trackRecorded[1]=true;
}
if (lastPressed==3){
if (trackRecorded[2]==false){
Serial.println("Registro per la prima volta traccia 3");
}
if (trackRecorded[2]==true){
Serial.println("Overdub sulla traccia 3");
}
trackRecorded[2]=true;
}
}
if (modal=2){
Serial.println("Play, ring circle verde");
FastLED.show();
}
}
}
}
oldState[0] = state[0];
}
*/
void clear(){
static unsigned long previousMillis, currentMillis;
state[5] = digitalRead(button[5]);
if(state[5]==LOW && oldState[5]==HIGH){
previousMillis = millis();
}
if(state[5]==HIGH && oldState[5]==LOW){
// Il pulsante è stato rilasciato
currentMillis = millis() - previousMillis;
if (currentMillis >= 1000){
}
}
oldState[5] = state[5];
}
void loop()
{
clear();
mode();
play();
track_1();
track_2();
track_3();
set_tracksColors();
ring_colors();
}