Azure_Skies

Untitled

Jun 9th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 22.13 KB | None | 0 0
  1. /*
  2.      SUPER-DUPER COOL ARDUINO BASED MULTICOLOR SOUND PLAYING LIGHTSABER!
  3.    HARDWARE:
  4.      Addressable LED strip (WS2811) to get any blade color and smooth turn on effect
  5.      MicroSD card module to play some sounds
  6.      IMU MPU6050 (accel + gyro) to generate hum. Frequency depends on angle velocity of blade
  7.      OR measure angle speed and play some hum sounds from SD
  8.    CAPABILITIES:
  9.      Smooth turning on/off with lightsaber-like sound effect
  10.      Randomly pulsing color (you can turn it off)
  11.      Sounds:
  12.        MODE 1: generated hum. Frequency depends on angle velocity of blade
  13.        MODE 2: hum sound from SD card
  14.          Slow swing - long hum sound (randomly from 4 sounds)
  15.          Fast swing - short hum sound (randomly from 5 sounds)
  16.      Bright white flash when hitting
  17.      Play one of 16 hit sounds, when hit
  18.        Weak hit - short sound
  19.        Hard hit - long "bzzzghghhdh" sound
  20.      After power on blade shows current battery level from 0 to 100 percent
  21.      Battery safe mode:
  22.        Battery is drain BEFORE TURNING ON: GyverSaber will not turn on, button LED will PULSE a couple of times
  23.        Battery is drain AFTER TURNING ON: GyverSaber will be turned off automatically
  24.    CONTROL BUTTON:
  25.      HOLD - turn on / turn off GyverSaber
  26.      TRIPLE CLICK - change color (red - green - blue - yellow - pink - ice blue)
  27.      QUINARY CLICK - change sound mode (hum generation - hum playing)
  28.      Selected color and sound mode stored in EEPROM (non-volatile memory)
  29. */
  30.  
  31. // ---------------------------- SETTINGS -------------------------------
  32. #define NUM_LEDS 44         // number of leds
  33. #define BTN_TIMEOUT 800     // button hold delay, ms
  34. #define RGB_BTN_TIMEOUT 400     // button hold delay, ms
  35. #define BRIGHTNESS 255      // max LED brightness (0 - 255)
  36.  
  37. #define SWING_TIMEOUT 500   // timeout between swings
  38. #define SWING_L_THR 150     // swing angle speed threshold
  39. #define SWING_THR 300       // fast swing angle speed threshold
  40. #define STRIKE_THR 150      // hit acceleration threshold
  41. #define STRIKE_S_THR 320    // hard hit acceleration threshold
  42. #define FLASH_DELAY 80      // flash time while hit
  43.  
  44. #define PULSE_ALLOW 1       // blade pulsation (1 - allow, 0 - disallow)
  45. #define PULSE_AMPL 20       // pulse amplitude
  46. #define PULSE_DELAY 30      // delay between pulses
  47.  
  48. #define R1 100000           // voltage divider real resistance
  49. #define R2 51000            // voltage divider real resistance
  50. #define BATTERY_SAFE 1      // battery monitoring (1 - allow, 0 - disallow)
  51.  
  52. #define DEBUG 1             // debug information in Serial (1 - allow, 0 - disallow)
  53. // ---------------------------- SETTINGS -------------------------------
  54.  
  55. #define LED_PIN 6      // 5
  56. #define BTN A0         // A0
  57. #define RGBBTN A1      // A1
  58. #define IMU_GND A2     // A2
  59. #define SD_GND A3      // A3
  60. #define BTN_LED 8      //  
  61. #define pinR 3          // 3
  62. #define pinG 4         // 4
  63. #define pinB 5         // 5
  64.  
  65. #define modeCt 3
  66.  
  67. // -------------------------- LIBS ---------------------------
  68. #include <SD.h>
  69. #include <Wire.h>
  70. #include <I2Cdev.h>
  71. #include <MPU6050.h>
  72. //#include <toneAC.h>         // hum generation library, does not work with Teensy
  73. #include <FastLED.h>
  74. #include <SPI.h>
  75. #include <Audio.h>
  76. #include <SerialFlash.h>
  77. //#include <avr/pgmspace.h>   // PROGMEM library
  78.  
  79. CRGB leds[NUM_LEDS];
  80. MPU6050 accelgyro;
  81. // -------------------------- LIBS ---------------------------
  82.  
  83.  
  84. //---------------------Audio-----------------------------
  85.  
  86. AudioPlaySdWav           playWav1;
  87. AudioMixer4              mix1;
  88. AudioOutputAnalog        dac;
  89.  
  90. AudioConnection            c1(playWav1, 0, mix1, 0);
  91. //AudioConnection          patchCord2(playWav1, 1, dac, 1);
  92.  
  93. #define SDCARD_CS_PIN    10
  94. #define SDCARD_MOSI_PIN  11
  95. #define SDCARD_MISO_PIN  12
  96. #define SDCARD_SCK_PIN   13
  97.  
  98.  
  99. /* put in setup
  100.  
  101.   SPI.setMOSI(SDCARD_MOSI_PIN);
  102.   SPI.setSCK(SDCARD_SCK_PIN);
  103.    if (!(SD.begin(SDCARD_CS_PIN))) {
  104.     // stop here, but print a message repetitively
  105.     while (1) {
  106.       Serial.println("Unable to access the SD card");
  107.       delay(500);
  108.     }
  109.   }
  110.  
  111. */
  112.  
  113. //---------------------Audio-----------------------------
  114.  
  115.  
  116. // ------------------------------ VARIABLES ---------------------------------
  117. int16_t ax, ay, az;
  118. int16_t gx, gy, gz;
  119. unsigned long ACC, GYR, COMPL;
  120. int gyroX, gyroY, gyroZ, accelX, accelY, accelZ, freq, freq_f = 20;
  121. float k = 0.2;
  122. unsigned long humTimer = -9000, mpuTimer, nowTimer;
  123. int stopTimer;
  124. boolean bzzz_flag, ls_chg_state, ls_state;
  125. boolean btnState, btn_flag, hold_flag, rgbBtnState, rgb_btn_flag, rgb_hold_flag;
  126. byte btn_counter, rgb_btn_counter;
  127. unsigned long btn_timer, rgb_btn_timer, PULSE_timer, swing_timer, swing_timeout, battery_timer, bzzTimer;
  128. byte nowNumber;
  129. byte LEDcolor;  // 0 - red, 1 - green, 2 - blue, 3 - pink, 4 - yellow, 5 - ice blue
  130. byte nowColor, red, green, blue, redOffset, greenOffset, blueOffset;
  131. boolean swing_flag, swing_allow, strike_flag, HUMmode=true;
  132. float voltage;
  133. int PULSEOffset;
  134. int hue = 0;
  135. int mode = 0;
  136. uint8_t gHue = 0;
  137. // ------------------------------ VARIABLES ---------------------------------
  138.  
  139. // --------------------------------- SOUNDS ----------------------------------
  140. const char strike1[] PROGMEM = "SK1.WAV";
  141. const char strike2[] PROGMEM = "SK2.WAV";
  142. const char strike3[] PROGMEM = "SK3.WAV";
  143. const char strike4[] PROGMEM = "SK4.WAV";
  144. const char strike5[] PROGMEM = "SK5.WAV";
  145. const char strike6[] PROGMEM = "SK6.WAV";
  146. const char strike7[] PROGMEM = "SK7.WAV";
  147. const char strike8[] PROGMEM = "SK8.WAV";
  148.  
  149. const char* const strikes[] PROGMEM  = {
  150.   strike1, strike2, strike3, strike4, strike5, strike6, strike7, strike8
  151. };
  152.  
  153. int strike_time[8] = {779, 563, 687, 702, 673, 661, 666, 635};
  154.  
  155. const char strike_s1[] PROGMEM = "SKS1.WAV";
  156. const char strike_s2[] PROGMEM = "SKS2.WAV";
  157. const char strike_s3[] PROGMEM = "SKS3.WAV";
  158. const char strike_s4[] PROGMEM = "SKS4.WAV";
  159. const char strike_s5[] PROGMEM = "SKS5.WAV";
  160. const char strike_s6[] PROGMEM = "SKS6.WAV";
  161. const char strike_s7[] PROGMEM = "SKS7.WAV";
  162. const char strike_s8[] PROGMEM = "SKS8.WAV";
  163.  
  164. const char* const strikes_short[] PROGMEM = {
  165.   strike_s1, strike_s2, strike_s3, strike_s4,
  166.   strike_s5, strike_s6, strike_s7, strike_s8
  167. };
  168. int strike_s_time[8] = {270, 167, 186, 250, 252, 255, 250, 238};
  169.  
  170. const char swing1[] PROGMEM = "SWS1.WAV";
  171. const char swing2[] PROGMEM = "SWS2.WAV";
  172. const char swing3[] PROGMEM = "SWS3.WAV";
  173. const char swing4[] PROGMEM = "SWS4.WAV";
  174. const char swing5[] PROGMEM = "SWS5.WAV";
  175.  
  176. const char* const swings[] PROGMEM  = {
  177.   swing1, swing2, swing3, swing4, swing5
  178. };
  179. int swing_time[8] = {389, 372, 360, 366, 337};
  180.  
  181. const char swingL1[] PROGMEM = "SWL1.WAV";
  182. const char swingL2[] PROGMEM = "SWL2.WAV";
  183. const char swingL3[] PROGMEM = "SWL3.WAV";
  184. const char swingL4[] PROGMEM = "SWL4.WAV";
  185.  
  186. const char* const swings_L[] PROGMEM  = {
  187.   swingL1, swingL2, swingL3, swingL4
  188. };
  189. int swing_time_L[8] = {636, 441, 772, 702};
  190.  
  191. char BUFFER[10];
  192. // --------------------------------- SOUNDS ---------------------------------
  193.  
  194. void setup() {
  195.   FastLED.addLeds<WS2812B, LED_PIN, BGR>(leds, NUM_LEDS);
  196.   //FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  197.   FastLED.setBrightness(100);  // ~40% of LED strip brightness
  198.   setAll(0, 0, 0);             // and turn it off
  199.  
  200.   Wire.begin();
  201.  // Wire.setSDA(18);
  202.  // Wire.setSCL(19);
  203.  
  204.   dac.analogReference(EXTERNAL);
  205.   AudioMemory(10);
  206.   mix1.gain(0, 1);
  207.  
  208.   Serial.begin(9600);
  209.   Serial.println("Booting up");
  210.   // ---- НАСТРОЙКА ПИНОВ ----
  211.   pinMode(BTN, INPUT_PULLUP);
  212.   pinMode(RGBBTN, INPUT_PULLUP);
  213.   pinMode(IMU_GND, OUTPUT);
  214.   pinMode(SD_GND, OUTPUT);
  215.   pinMode(BTN_LED, OUTPUT);
  216.   pinMode(10, OUTPUT);
  217.   pinMode(A14, OUTPUT);
  218.  
  219.   digitalWrite(IMU_GND, 0);
  220.   digitalWrite(SD_GND,  0);
  221.   digitalWrite(BTN_LED, 1);
  222.   // ---- НАСТРОЙКА ПИНОВ ----
  223.  
  224.   randomSeed(analogRead(2));    // starting point for random generator
  225.  
  226.   // IMU initialization
  227.   accelgyro.initialize();
  228.   accelgyro.setFullScaleAccelRange(MPU6050_ACCEL_FS_16);
  229.   accelgyro.setFullScaleGyroRange(MPU6050_GYRO_FS_250);
  230.  
  231.     if (accelgyro.testConnection()) Serial.println(F("MPU6050 OK"));
  232.     else Serial.println(F("MPU6050 fail"));
  233.  
  234.   SPI.setMISO(SDCARD_MISO_PIN);
  235.   SPI.setMOSI(SDCARD_MOSI_PIN);
  236.   SPI.setSCK(SDCARD_SCK_PIN);
  237.  
  238.    if (!(SD.begin(SDCARD_CS_PIN))) {
  239.     // stop here, but print a message repetitively
  240.     while (1) {
  241.       Serial.println("Unable to access the SD card");
  242.       delay(500);
  243.     }
  244.   }
  245.  
  246.  
  247.   delay(1000);                         // 1 second to show battery level
  248.   setAll(0, 0, 0);
  249.   FastLED.setBrightness(BRIGHTNESS);   // set bright
  250. }
  251.  
  252. // --- MAIN LOOP---
  253. void loop() {
  254.   //randomPULSE();
  255.   setLed(leds[NUM_LEDS - 1].r, leds[NUM_LEDS - 1].g, leds[NUM_LEDS - 1].b);
  256.   getFreq();
  257.   on_off_sound();
  258.   btnTick();
  259.   rgbBtnTick();
  260.   strikeTick();
  261.   swingTick();
  262.  
  263. switch (mode) {
  264.     case 0:
  265.       cycle();
  266.       break;
  267.     case 1:
  268.       randCycle();
  269.       break;
  270.     case 2:
  271.       rainbowCycle();
  272.       break;
  273.     case 3:
  274.       rainbow();
  275.       break;
  276.     case 4:
  277.       sinelon();
  278.       break;
  279.    case 5:
  280.       cylon();
  281.       break;
  282.   }
  283.  
  284.  
  285. }
  286. // --- MAIN LOOP---
  287.  
  288. void rgbBtnTick() {
  289.   rgbBtnState = !digitalRead(RGBBTN);
  290.   if (rgbBtnState && !rgb_btn_flag) {
  291.     if (DEBUG) Serial.println(F("BTN PRESS"));
  292.     rgb_btn_flag = 1;
  293.     rgb_btn_counter++;
  294.     rgb_btn_timer = millis();
  295.   }
  296.  
  297.    
  298.   if (!rgbBtnState && rgb_btn_flag) {
  299.     rgb_btn_flag = 0;
  300.     rgb_hold_flag = 0;
  301.   }
  302.   // если кнопка удерживается
  303.   if (rgb_btn_flag && rgbBtnState && (millis() - rgb_btn_timer > RGB_BTN_TIMEOUT) && !hold_flag) {
  304.     rgb_hold_flag = 1;
  305.     rgb_btn_counter = 0;
  306.   }
  307.   // если кнопка была нажата несколько раз до таймаута
  308.   if ((millis() - rgb_btn_timer > BTN_TIMEOUT) && (rgb_btn_counter != 0)) {
  309.    
  310.       if (rgb_btn_counter == 3) {               // 3 press count
  311.        
  312.       }
  313.       if (rgb_btn_counter == 5) {               // 5 press count
  314.                
  315.       }
  316.      
  317.    
  318.     rgb_btn_counter = 0;
  319.   }
  320. }
  321.  
  322.  
  323. void btnTick() {
  324.   btnState = !digitalRead(BTN);
  325.   if (btnState && !btn_flag) {
  326.     if (DEBUG) Serial.println(F("BTN PRESS"));
  327.     btn_flag = 1;
  328.     btn_counter++;
  329.     btn_timer = millis();
  330.   }
  331.   if (!btnState && btn_flag) {
  332.     btn_flag = 0;
  333.     hold_flag = 0;
  334.   }
  335.   // если кнопка удерживается
  336.   if (btn_flag && btnState && (millis() - btn_timer > BTN_TIMEOUT) && !hold_flag) {
  337.     ls_chg_state = 1;                     // flag to change saber state (on/off)
  338.     hold_flag = 1;
  339.     btn_counter = 0;
  340.   }
  341.   // если кнопка была нажата несколько раз до таймаута
  342.  
  343.   if ((millis() - btn_timer > BTN_TIMEOUT) && (btn_counter != 0)) {
  344.     if (btn_counter == 3) {               // 3 press count
  345.         mode++;                         // change mode
  346.         if (mode > modeCt) mode = 0;
  347.       }
  348.      
  349.     if (ls_state) {
  350.      
  351.       if (btn_counter == 5) {               // 5 press count
  352.         setLed(100, 100, 100);
  353.         HUMmode = !HUMmode;
  354.         if (HUMmode) {
  355.           //noTone(A14);
  356.           playWav1.play("ON.WAV");
  357.         } else {
  358.           playWav1.stop();
  359.          // tone(A14, freq_f);
  360.         }
  361.        
  362.       }
  363.     }
  364.     btn_counter = 0;
  365.   }
  366. }
  367.  
  368.  
  369.  
  370. void on_off_sound() {
  371.   if (ls_chg_state) {                // if change flag
  372.     if (!ls_state) {                 // if GyverSaber is turned off
  373.      
  374.         if (DEBUG) Serial.println(F("SABER ON"));
  375.         playWav1.play("ON.WAV");
  376.         delay(200);
  377.         light_up();
  378.         delay(200);
  379.         bzzz_flag = 1;
  380.         ls_state = true;               // remember that turned on
  381.         if (HUMmode) {
  382.           //noTone(A14);
  383.           playWav1.play("ON.WAV");
  384.         } else {
  385.           playWav1.stop();
  386.           //tone(A14, freq_f);
  387.         }
  388.      
  389.     } else {                         // if GyverSaber is turned on
  390.       //noTone(A14);
  391.       bzzz_flag = 0;
  392.       playWav1.play("OFF.WAV");
  393.       delay(300);
  394.       light_down();
  395.       delay(300);
  396.       playWav1.stop();
  397.       if (DEBUG) Serial.println(F("SABER OFF"));
  398.       ls_state = false;
  399.     }
  400.     ls_chg_state = 0;
  401.   }
  402.  
  403.   if (((millis() - humTimer) > 9000) && bzzz_flag && HUMmode) {
  404.     playFile("HUM.WAV");
  405.     humTimer = millis();
  406.     swing_flag = 1;
  407.     strike_flag = 0;
  408.   }
  409.   long delta = millis() - bzzTimer;
  410.   if ((delta > 3) && bzzz_flag && !HUMmode) {
  411.     if (strike_flag) {
  412.       playWav1.stop();
  413.       strike_flag = 0;
  414.     }
  415.     //tone(A14, freq_f);
  416.     bzzTimer = millis();
  417.   }
  418. }
  419.  
  420. void randomPULSE() {
  421.   if (PULSE_ALLOW && ls_state && (millis() - PULSE_timer > PULSE_DELAY)) {
  422.     PULSE_timer = millis();
  423.     PULSEOffset = PULSEOffset * k + random(-PULSE_AMPL, PULSE_AMPL) * (1 - k);
  424.     if (nowColor == 0) PULSEOffset = constrain(PULSEOffset, -15, 5);
  425.     redOffset = constrain(red + PULSEOffset, 0, 255);
  426.     greenOffset = constrain(green + PULSEOffset, 0, 255);
  427.     blueOffset = constrain(blue + PULSEOffset, 0, 255);
  428.     setAll(redOffset, greenOffset, blueOffset);
  429.   }
  430. }
  431.  
  432. void strikeTick() {
  433.   if ((ACC > STRIKE_THR) && (ACC < STRIKE_S_THR)) {
  434.    // if (!HUMmode) noTone(A14);
  435.     nowNumber = random(8);
  436.     // читаем название трека из PROGMEM
  437.     strcpy_P(BUFFER, (char*)pgm_read_word(&(strikes_short[nowNumber])));
  438.    playWav1.play(BUFFER);
  439.     hit_flash();
  440.     if (!HUMmode)
  441.       bzzTimer = millis() + strike_s_time[nowNumber] - FLASH_DELAY;
  442.     else
  443.       humTimer = millis() - 9000 + strike_s_time[nowNumber] - FLASH_DELAY;
  444.     strike_flag = 1;
  445.   }
  446.   if (ACC >= STRIKE_S_THR) {
  447.     //if (!HUMmode) noTone(A14);
  448.     nowNumber = random(8);
  449.     // читаем название трека из PROGMEM
  450.     strcpy_P(BUFFER, (char*)pgm_read_word(&(strikes[nowNumber])));
  451.     playWav1.play(BUFFER);
  452.     hit_flash();
  453.     if (!HUMmode)
  454.       bzzTimer = millis() + strike_time[nowNumber] - FLASH_DELAY;
  455.     else
  456.       humTimer = millis() - 9000 + strike_time[nowNumber] - FLASH_DELAY;
  457.     strike_flag = 1;
  458.   }
  459. }
  460.  
  461. void swingTick() {
  462.   if (GYR > 80 && (millis() - swing_timeout > 100) && HUMmode) {
  463.     swing_timeout = millis();
  464.     if (((millis() - swing_timer) > SWING_TIMEOUT) && swing_flag && !strike_flag) {
  465.       if (GYR >= SWING_THR) {      
  466.         nowNumber = random(5);          
  467.         // читаем название трека из PROGMEM
  468.         strcpy_P(BUFFER, (char*)pgm_read_word(&(swings[nowNumber])));
  469.         playWav1.play(BUFFER);              
  470.         humTimer = millis() - 9000 + swing_time[nowNumber];
  471.         swing_flag = 0;
  472.         swing_timer = millis();
  473.         swing_allow = 0;
  474.       }
  475.       if ((GYR > SWING_L_THR) && (GYR < SWING_THR)) {
  476.         nowNumber = random(5);            
  477.         // читаем название трека из PROGMEM
  478.         strcpy_P(BUFFER, (char*)pgm_read_word(&(swings_L[nowNumber])));
  479.         playWav1.play(BUFFER);              
  480.         humTimer = millis() - 9000 + swing_time_L[nowNumber];
  481.         swing_flag = 0;
  482.         swing_timer = millis();
  483.         swing_allow = 0;
  484.       }
  485.     }
  486.   }
  487. }
  488.  
  489. void getFreq() {
  490.   if (ls_state) {                                               // if GyverSaber is on
  491.     if (millis() - mpuTimer > 500) {                            
  492.       accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);      
  493.  
  494.       // find absolute and divide on 100
  495.       gyroX = abs(gx / 100);
  496.       gyroY = abs(gy / 100);
  497.       gyroZ = abs(gz / 100);
  498.       accelX = abs(ax / 100);
  499.       accelY = abs(ay / 100);
  500.       accelZ = abs(az / 100);
  501.  
  502.       // vector sum
  503.       ACC = sq((long)accelX) + sq((long)accelY) + sq((long)accelZ);
  504.       ACC = sqrt(ACC);
  505.       GYR = sq((long)gyroX) + sq((long)gyroY) + sq((long)gyroZ);
  506.       GYR = sqrt((long)GYR);
  507.       COMPL = ACC + GYR;
  508.       /*
  509.          // отладка работы IMU
  510.          Serial.print("$");
  511.          Serial.print(gyroX);
  512.          Serial.print(" ");
  513.          Serial.print(gyroY);
  514.          Serial.print(" ");
  515.          Serial.print(gyroZ);
  516.          Serial.println(";");
  517.       */
  518.       freq = (long)COMPL * COMPL / 1500;                        // parabolic tone change
  519.       freq = constrain(freq, 18, 300);                          
  520.       freq_f = freq * k + freq_f * (1 - k);                     // smooth filter
  521.       mpuTimer = micros();                                    
  522.     }
  523.   }
  524. }
  525.  
  526. void setPixel(int Pixel, byte red, byte green, byte blue) {
  527.   leds[Pixel].r = red;
  528.   leds[Pixel].g = green;
  529.   leds[Pixel].b = blue;
  530. }
  531.  
  532. void setAll(byte red, byte green, byte blue) {
  533.   for (int i = 0; i < NUM_LEDS; i++ ) {
  534.     setPixel(i, red, green, blue);
  535.   }
  536.   FastLED.show();
  537. }
  538.  
  539. void light_up() {
  540.  
  541.   if (mode==3){
  542.  
  543.   }
  544.   else{
  545.   for (int i = 0; i < NUM_LEDS; i++) {
  546.           leds[i] = CHSV(hue, 255, 255);
  547.           FastLED.show();
  548.           delay(25);
  549.         }
  550.   }
  551. }
  552.  
  553. void light_down() {
  554.   for (int i = NUM_LEDS - 2 ; i >= 0 ; i--) {
  555.           leds[i] = CRGB::Black;
  556.           FastLED.show();
  557.           delay(50);
  558.         }
  559. }
  560.  
  561. void hit_flash() {
  562.   setAll(255, 255, 255);            
  563.   delay(FLASH_DELAY);                
  564.   setAll(red, blue, green);        
  565. }
  566.  
  567.  
  568. void cycle() {
  569.  
  570.   if (rgb_hold_flag)
  571.   {
  572.     Serial.println(hue);
  573.     hue++;
  574.    
  575.     setLed(leds[NUM_LEDS - 1].r, leds[NUM_LEDS - 1].g, leds[NUM_LEDS - 1].b);
  576.     if (!ls_state) {
  577.       leds[NUM_LEDS - 1] = CHSV(hue, 255, 255);
  578.  
  579.     }
  580.     if (ls_state) {
  581.       fill_solid(leds, NUM_LEDS,  CHSV(hue, 255, 255) );
  582.       setLed(leds[NUM_LEDS - 1].r, leds[NUM_LEDS - 1].g, leds[NUM_LEDS - 1].b);
  583.       FastLED.show();
  584.     }
  585.     delay(30);
  586.   }
  587.  
  588. }
  589.  
  590. void randCycle(){
  591.  
  592.     hue++;
  593.     delay(10);
  594.     setLed(leds[NUM_LEDS - 1].r, leds[NUM_LEDS - 1].g, leds[NUM_LEDS - 1].b);
  595.  
  596.     if (!ls_state) leds[NUM_LEDS - 1] = CHSV(hue, 255, 255);
  597.  
  598.     if (ls_state) {
  599.       fill_solid(leds, NUM_LEDS,  CHSV(hue, 255, 255) );
  600.      
  601.     }
  602.     FastLED.show();
  603.   }
  604.  
  605. void rainbow()
  606. {
  607.   // FastLED's built-in rainbow generator
  608.   fill_rainbow( leds, NUM_LEDS, gHue, 7);
  609. }
  610.  
  611.  
  612. void setLed(uint8_t r, uint8_t g, uint8_t b) {
  613.   // normalize the red LED - its brighter than the rest!
  614.   r = map(r, 0, 255, 0, 100);
  615.   g = map(g, 0, 255, 0, 150);
  616.  
  617. //  r = map(r, 0, 255, 0, BRIGHTNESS);
  618. //  g = map(g, 0, 255, 0, BRIGHTNESS);
  619.   b = map(b, 0, 255, 0, BRIGHTNESS);
  620.  
  621.   // common anode so invert!
  622.   r = map(r, 0, 255, 255, 0);
  623.   g = map(g, 0, 255, 255, 0);
  624.   b = map(b, 0, 255, 255, 0);
  625.   //  Serial.print("R = "); Serial.print(r, DEC);
  626.   //  Serial.print(" G = "); Serial.print(g, DEC);
  627.   //  Serial.print(" B = "); Serial.println(b, DEC);
  628.   analogWrite(pinR, r);
  629.   analogWrite(pinG, g);
  630.   analogWrite(pinB, b);
  631. }
  632.  
  633. void sinelon()
  634. {
  635.   static uint16_t num = 0;
  636.   static bool runonce = false; // Used to turn on the saber only 'once' while you hold the button.
  637.   static uint32_t mytime = millis();
  638.   static uint16_t mydelay = 20; // Change this to speed up/slow down your led effect.
  639.  
  640.    if (ls_state) {
  641.       // a colored dot sweeping back and forth, with fading trails
  642.       fadeToBlackBy( leds, NUM_LEDS, 2);
  643.       int pos = beatsin16( 13, 0, NUM_LEDS - 1 );
  644.       leds[pos] += CHSV( gHue, 255, 192);
  645.       EVERY_N_MILLISECONDS( 8 ) {
  646.         gHue++;
  647.       }
  648.    }
  649.   FastLED.show();
  650. }
  651.  
  652. void cylon(){
  653.   static uint16_t num = 0;
  654.   static bool runonce = false; // Used to turn on the saber only 'once' while you hold the button.
  655.   static uint32_t mytime = millis();
  656.   static uint16_t mydelay = 20; // Change this to speed up/slow down your led effect.  
  657.  
  658.    if (ls_state) {      
  659.  static uint8_t hue = 0;
  660.  // Serial.print("x");
  661.   // First slide the led in one direction
  662.   for(int i = 0; i < NUM_LEDS; i++) {
  663.     // Set the i'th led to red
  664.     leds[i] = CHSV(hue++, 255, 255);
  665.     // Show the leds
  666.     FastLED.show();
  667.     // now that we've shown the leds, reset the i'th led to black
  668.     // leds[i] = CRGB::Black;
  669.     fadeall();
  670.     // Wait a little bit before we loop around and do it again
  671.     delay(10);
  672.   }
  673. //  Serial.print("x");
  674.  
  675.   // Now go in the other direction.  
  676.   for(int i = (NUM_LEDS)-1; i >= 0; i--) {
  677.     // Set the i'th led to red
  678.     leds[i] = CHSV(hue++, 255, 255);
  679.     // Show the leds
  680.     FastLED.show();
  681.     // now that we've shown the leds, reset the i'th led to black
  682.     // leds[i] = CRGB::Black;
  683.     fadeall();
  684.     // Wait a little bit before we loop around and do it again
  685.     delay(10);
  686.   }
  687.    }
  688.   FastLED.show();
  689. }
  690.  
  691. void rainbowCycle() {
  692.   byte *c;
  693.   uint16_t i, j;
  694.   static uint16_t num = 0;
  695.   static bool runonce = false; // Used to turn on the saber only 'once' while you hold the button.
  696.   static uint32_t mytime = millis();
  697.   static uint16_t mydelay = 20; // Change this to speed up/slow down your led effect.
  698.  
  699.    if (ls_state) {
  700.   //for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
  701.   j = (millis() / 10) % (256 * 5);
  702.   for(i=0; i< NUM_LEDS; i++) {
  703.     c=Wheel(((i * 256 / NUM_LEDS) + j) & 255);
  704.     setPixel(i, *c, *(c+1), *(c+2));
  705.     setLed(leds[NUM_LEDS - 1].r, leds[NUM_LEDS - 1].g, leds[NUM_LEDS - 1].b);
  706.   }
  707.   FastLED.show();
  708. }
  709.    }
  710.  
  711.  
  712. byte * Wheel(byte WheelPos) {
  713.   static byte c[3];
  714.  
  715.   if(WheelPos < 85) {
  716.    c[0]=WheelPos * 3;
  717.    c[1]=255 - WheelPos * 3;
  718.    c[2]=0;
  719.   } else if(WheelPos < 170) {
  720.    WheelPos -= 85;
  721.    c[0]=255 - WheelPos * 3;
  722.    c[1]=0;
  723.    c[2]=WheelPos * 3;
  724.   } else {
  725.    WheelPos -= 170;
  726.    c[0]=0;
  727.    c[1]=WheelPos * 3;
  728.    c[2]=255 - WheelPos * 3;
  729.   }
  730.   return c;
  731. }
  732.  
  733. void fadeall() {
  734.   for (uint16_t i = 0; i < NUM_LEDS; i++) {
  735.     leds[i].nscale8(250);
  736.   }
  737. }
  738.  
  739.  
  740. void playFile(const char *filename)
  741. {
  742.   Serial.print("Playing file: ");
  743.   Serial.println(filename);
  744.  
  745.   // Start playing the file.  This sketch continues to
  746.   // run while the file plays.
  747.   playWav1.play(filename);
  748.  
  749.   // A brief delay for the library read WAV info
  750.   delay(5);
  751.  
  752.   // Simply wait for the file to finish playing.
  753.   while (playWav1.isPlaying()) {
  754.     // uncomment these lines if you audio shield
  755.     // has the optional volume pot soldered
  756.     //float vol = analogRead(15);
  757.     //vol = vol / 1024;
  758.     // sgtl5000_1.volume(vol);
  759.   }
  760. }
Add Comment
Please, Sign In to add comment