Advertisement
alextudiodev

MyDuralight5Working

Jan 23rd, 2020
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 25.41 KB | None | 0 0
  1. #include <BluetoothSerial.h>
  2. #include <FastLED.h>
  3. #include <Ticker.h>
  4. #include <Preferences.h>
  5.  
  6. Preferences prefs;
  7. Ticker tickerBluetooth, tickerEffects;
  8.  
  9. #define UPDATES_PER_SECOND 250
  10.  
  11. CRGBPalette16 currentPalette;
  12. TBlendType    currentBlending;
  13. extern CRGBPalette16 redWhiteBluePalette;
  14. extern const TProgmemPalette16 redWhiteBluePalette_p PROGMEM;
  15.  
  16. // Control Defines
  17. #define DEBUG_MESSAGES                                                      // выводить отладочные сообщения
  18.  
  19. #define BTN_PIN                                                          2  // пин-вход для подключения кнопки
  20. #define LED_PIN                                                         15  // пин-выход для подключения ленты
  21.  
  22. #ifdef DEBUG_MESSAGES
  23.   #define SERIAL_BAUDRATE                                           115200  // скорость работы последовательного порта
  24. #endif
  25.  
  26. // defines for LEDs strip
  27. #define NUM_LEDS                                                       300  // кол-во светодиодов    
  28. #define LED_TYPE                                                    WS2813  // тип светодиодов в ленте
  29. #define COLOR_ORDER                                                    GRB  // порядок передачи цветов для чипов светодиодов
  30.  
  31. /* Bluetooth Serial Operation Codes */
  32. // Opcodes Read
  33. #define GET_SOLID_COLOR                                               0x11  // 17
  34. #define GET_EFFECT_CHANGE_TIMEOUT                                     0x12  // 18
  35. #define GET_EFFECT_CHANGE_MODE                                        0x13  // 19
  36. #define GET_CURRENT_EFFECT                                            0x14  // 20
  37. #define GET_BRIGHTNESS                                                0x15  // 21
  38. #define GET_EFFECTS_COUNT                                             0x16  // 22
  39. #define GET_EFFECTS_LIST                                              0x17  // 23
  40.  
  41. // Opcodes Write
  42. #define SET_SOLID_COLOR                                               0x21  // 33
  43. #define SET_EFFECT_CHANGE_TIMEOUT                                     0x22  // 34
  44. #define SET_EFFECT_CHANGE_MODE                                        0x23  // 35
  45. #define SET_CURRENT_EFFECT                                            0x24  // 36
  46. #define SET_BRIGHTNESS                                                0x25  // 37
  47. #define SET_DEFAULTS                                                  0x26  // 38
  48. #define SET_EFFECT_DISABLED                                           0x27  // 41
  49. #define SET_EFFECT_ENABLED                                            0x28  // 42
  50. /**/
  51.  
  52. enum {
  53.   MODE_SOLID_COLOR          = 0x01,
  54.   MODE_ONE_EFFECT           = 0x02,
  55.   MODE_SEQUENTIAL_FORWARD   = 0x03,
  56.   MODE_SEQUENTIAL_BACKWARD  = 0x04,
  57.   MODE_RANDOM_EFFECT        = 0x05
  58. } modes_t;
  59.  
  60. // system lightning variables
  61. uint8_t  effectChangeTimeout = 0;                                           // 15-3600 with step 15 s
  62. uint8_t  effectChangeMode = 0;                                              // effect change modes: 0 - static color, 1 - sequential, 2 - random
  63. uint8_t  effectsCount = 0;                                                  // count of non empty effects
  64. uint8_t  brightness = 0;                                                    // brightness of LEDS on strip: 0 - 255
  65. //uint8_t  effectsStates[64];                                                 // states of effects in memory: 0 - empty, 1 - disabled, 2 - enabled
  66. CRGB     solidColor = 0xFF55FF55;                                            // color for static mode
  67.  
  68. volatile uint8_t currentEffect = 0;                                         // number of current displaying effect
  69. volatile uint8_t lastEffect    = 255;                                          // last diplayed effect
  70.  
  71. uint8_t effectsStates[] = { // 11 эффектов
  72.   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 0-10
  73.   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  74.   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  75.   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  76. };
  77.  
  78. struct CRGB leds[NUM_LEDS];             // массив светодиодов в подключенной ленте
  79. BluetoothSerial SerialBT;               // объект последовательного Bluetooth-порта
  80. bool isConnected = false;               // показывает, подключено ли устройство по Bluetooth
  81.  
  82. // variables for touch button
  83. //#define NORMAL_OPEN_BTN               // используется нормально открытая кнопка
  84. #define NEXT_TAP_TIMEOUT   400          // время ожидания следующего нажатия кнопки для обработки нескольких нажатий
  85. #define CLICK_TIME         200          // максимальное время удержания кнопки нажатой для распознавания нажатия
  86. #define HOLD_TIME         2000          // максимальное время удержания кнопки нажатой для распознавания короткого удержания
  87.  
  88. uint8_t  numberOfClicks = 0;            // кол-во нажатий на кнопку
  89. uint64_t lastTapTime    = 0;            // время последнего нажатия
  90. uint64_t startHoldTime  = 0;            // время начала удержания
  91. uint64_t endHoldTime    = 0;            // время отпускания кнопки
  92. bool     isClicked      = false;        // кнопка была нажата
  93. bool     isHold         = false;        // кнопка удерживалась
  94.  
  95. void btnCallback() {                    // обработчик прерывания нажатия и отпускания кнопки
  96.   #ifdef NORMAL_OPEN_BTN
  97.     if (digitalRead(BTN_PIN))
  98.   #else
  99.     if (!digitalRead(BTN_PIN))
  100.   #endif
  101.        startHoldTime = millis();
  102.   else endHoldTime = millis();
  103.  
  104.   if (startHoldTime && endHoldTime) {
  105.     if (endHoldTime - startHoldTime <= CLICK_TIME) {
  106.       isClicked = true;
  107.       if (millis() - lastTapTime > NEXT_TAP_TIMEOUT) {
  108.         numberOfClicks = 1;
  109.         lastTapTime = millis();
  110.       }
  111.       else {
  112.         numberOfClicks++;
  113.         lastTapTime = millis();
  114.       }
  115.     }
  116.     if (endHoldTime - startHoldTime >= HOLD_TIME) isHold = true;
  117.     startHoldTime = 0;
  118.     endHoldTime = 0;
  119.   }
  120.   else if (!startHoldTime && endHoldTime) {
  121.     startHoldTime = 0;
  122.     endHoldTime = 0;
  123.   }
  124. }
  125.  
  126. void printData() {                      // вывод хранимых данных в памяти
  127.   Serial.printf("Effects count:         %d\n",   effectsCount);
  128.   Serial.printf("Current effect:        %d\n",   currentEffect);
  129.   Serial.printf("Brightness:            %d\n",   brightness);
  130.   Serial.printf("Effect change mode:    %d\n",   effectChangeMode);
  131.   Serial.printf("Effect change timeout: %d\n",   effectChangeTimeout);
  132.   Serial.printf("Solid color:           R:0x%02X G:0x%02X B:0x%02X\n", solidColor.r, solidColor.g, solidColor.b);
  133.  
  134.   String buff = "";
  135.   for (uint8_t i = 0; i < sizeof(effectsStates); i++) { buff += effectsStates[i]; buff += "|"; }
  136.   Serial.println("Effects list: " + buff);
  137. }
  138.  
  139. void loadEffectsFromMem() {
  140.   size_t length = prefs.getBytesLength("es");
  141.   prefs.getBytes("es", effectsStates, length);
  142.   effectsCount = getEffectsCount();
  143. }
  144.  
  145. void loadPropsFromMem() {
  146.   currentEffect       = prefs.getUChar("ce",             1);
  147.   effectChangeMode    = prefs.getUChar("ecm",            1);
  148.   brightness          = prefs.getUChar("br",           128);
  149.   effectChangeTimeout = prefs.getUChar("ect",            1);
  150.   solidColor          = prefs.getInt("color", 0xFFFFFFFF);
  151.   if (effectsStates[currentEffect] != 3) changeEffect();
  152. }
  153.  
  154. uint8_t getActiveEffectsCount() {
  155.   uint8_t address = 0, count = 0;
  156.   while (address < sizeof(effectsStates))
  157.     if (effectsStates[address++] == 3) count++;
  158.   return count;
  159. }
  160.  
  161. uint8_t getEffectsCount() {
  162.   uint8_t count = 0;
  163.   for (uint8_t address = 0; address < sizeof(effectsStates); address++)
  164.     if (effectsStates[address] > 0 && effectsStates[address] < 4) count++;
  165.   return count;
  166. }
  167.  
  168. void callback(esp_spp_cb_event_t event, esp_spp_cb_param_t *param) {
  169.   if (event == ESP_SPP_SRV_OPEN_EVT) {
  170.     isConnected = true;
  171.     #ifdef DEBUG_MESSAGES
  172.       Serial.println("Client сonnected.");
  173.     #endif
  174.     tickerBluetooth.attach_ms(50, readBluetooth);
  175.     // отправлем все параметры подключенному устройству для синхронизации
  176.     if (isConnected) {
  177.       String buff = "";
  178.       buff += GET_EFFECTS_LIST; buff += "|";
  179.       for (uint8_t i = 0; i < effectsCount; i++) { buff += effectsStates[i]; buff += "|"; }
  180.       SerialBT.printf("%d|%d\n", GET_SOLID_COLOR,           (int)0xFF << 24 + (int)solidColor.r << 16 + (int)solidColor.g << 8 + (int)solidColor.b);        
  181.       SerialBT.printf("%d|%d\n", GET_EFFECT_CHANGE_TIMEOUT, effectChangeTimeout);        
  182.       SerialBT.printf("%d|%d\n", GET_EFFECT_CHANGE_MODE,    effectChangeMode);        
  183.       SerialBT.printf("%d|%d\n", GET_CURRENT_EFFECT,        currentEffect);      
  184.       SerialBT.printf("%d|%d\n", GET_BRIGHTNESS,            brightness);          
  185.       SerialBT.println(buff);
  186.     }
  187.   }
  188.   else if (event == ESP_SPP_CLOSE_EVT) {
  189.     isConnected = false;
  190.     #ifdef DEBUG_MESSAGES
  191.       Serial.println("Client disconnected.");
  192.     #endif
  193.     tickerBluetooth.detach();
  194.   }
  195. }
  196.  
  197. void changeEffect() {
  198.   if (effectChangeMode == MODE_SEQUENTIAL_FORWARD)      nextEffect();
  199.   else if (effectChangeMode == MODE_SEQUENTIAL_FORWARD) previousEffect();
  200.   else if (effectChangeMode == MODE_RANDOM_EFFECT)      randomEffect();
  201. }
  202.  
  203. void nextEffect() {
  204.   while (effectsStates[++currentEffect] != 3)
  205.     if (currentEffect == effectsCount) currentEffect = 0;
  206. }
  207.  
  208. void previousEffect() {
  209.   //currentEffect--;
  210.   //if (currentEffect == 0xFF) currentEffect = sizeof(effectsStates) - 1;
  211.   while (effectsStates[--currentEffect] != 3) {
  212.     //currentEffect--;
  213.     if (currentEffect == 0xFF) currentEffect = sizeof(effectsStates) - 1;
  214.   }
  215. }
  216.  
  217. void randomEffect() {
  218.   currentEffect = random8(sizeof(effectsStates));
  219.   while (effectsStates[currentEffect] != 3) currentEffect = random8(sizeof(effectsStates));
  220. }
  221.  
  222. void readBluetooth() {
  223.   String  buffer = "";
  224.   uint8_t cmd    = 0xFF;
  225.   int     data   = -1;
  226.   if (isConnected && SerialBT.available()) {
  227.     buffer = SerialBT.readString();
  228.     int splitterIndex = buffer.indexOf('|');
  229.     if (splitterIndex > -1) {
  230.       cmd = (uint8_t)buffer.substring(0, splitterIndex).toInt();
  231.       if ((buffer.length() - 1) > splitterIndex) data = buffer.substring(splitterIndex + 1).toInt();
  232.       #ifdef DEBUG_MESSAGES
  233.         Serial.printf("Command: 0x%02X\n", cmd);
  234.         Serial.printf("Data:    %d\n", data);
  235.       #endif
  236.       switch (cmd) {
  237.         case SET_SOLID_COLOR:
  238.           if (data >= 0xFF000000 && data <= 0xFFFFFFFF) {
  239.             solidColor = data;
  240.             prefs.putInt("color", data);  
  241.             if (isConnected) SerialBT.printf("%d|%d\n", GET_SOLID_COLOR, (int)0xFF << 24 + (int)solidColor.r << 16 + (int)solidColor.g << 8 + (int)solidColor.b);        
  242.             #ifdef DEBUG_MESSAGES
  243.               Serial.printf("Solid color: R:0x%02X G:0x%02X B:0x%02X\n", solidColor.r, solidColor.g, solidColor.b);
  244.               if (isConnected) SerialBT.printf("Solid color: R:0x%02X G:0x%02X B:0x%02X\n", solidColor.r, solidColor.g, solidColor.b);
  245.             #endif
  246.           }
  247.           else {
  248.             #ifdef DEBUG_MESSAGES
  249.               Serial.println(F("Wrong new solid color"));
  250.               if (isConnected) SerialBT.println(F("Wrong new solid color"));
  251.             #endif
  252.           }
  253.           break;
  254.         case SET_EFFECT_CHANGE_TIMEOUT:
  255.           if ((uint8_t)data >= 1 && (uint8_t)data <= 240) {
  256.             effectChangeTimeout = (uint8_t)data;        
  257.             prefs.putUChar("ect", effectChangeTimeout);  
  258.             tickerEffects.detach();
  259.             tickerEffects.attach_ms((uint64_t)effectChangeTimeout * 15000, changeEffect);      
  260.             if (isConnected) SerialBT.printf("%d|%d\n", GET_EFFECT_CHANGE_TIMEOUT, effectChangeTimeout);      
  261.             #ifdef DEBUG_MESSAGES
  262.               Serial.printf("Effect change timeout: %d s\n", effectChangeTimeout * 15);
  263.               if (isConnected) SerialBT.printf("Effect change timeout: %d s\n", effectChangeTimeout * 15);
  264.             #endif
  265.           }
  266.           else {            
  267.             #ifdef DEBUG_MESSAGES
  268.               Serial.println(F("Wrong new effect change timeout, must be 15-3600 s"));
  269.               if (isConnected) SerialBT.println(F("Wrong new effect change timeout, must be 15-3600 s"));
  270.             #endif
  271.           }
  272.           break;
  273.         case SET_EFFECT_CHANGE_MODE:
  274.           if (data >= 1 && data <= 5) {
  275.             effectChangeMode = (uint8_t)data;
  276.             prefs.putUChar("ecm", effectChangeMode);  
  277.             if (isConnected) SerialBT.printf("%d|%d\n", GET_EFFECT_CHANGE_MODE, effectChangeMode);            
  278.             #ifdef DEBUG_MESSAGES
  279.               Serial.printf("Effect change mode: %d\n", effectChangeMode);
  280.               if (isConnected) SerialBT.printf("Effect change mode: %d\n", effectChangeMode);
  281.             #endif
  282.           }
  283.           else {
  284.             //if (isConnected) SerialBT.write(ACK_FAILTURE);          
  285.             #ifdef DEBUG_MESSAGES
  286.               Serial.println(F("Wrong new effect change mode, must be 1-5"));
  287.               if (isConnected) SerialBT.println(F("Wrong new effect change mode, must be 1-5"));
  288.             #endif
  289.           }
  290.           break;
  291.         case SET_CURRENT_EFFECT:
  292.           if ((uint8_t)data >= 0 && (uint8_t)data < sizeof(effectsStates)) {
  293.             currentEffect = (uint8_t)data;
  294.             prefs.putUChar("ce", currentEffect);
  295.             if (isConnected) SerialBT.printf("%d|%d\n", GET_CURRENT_EFFECT, currentEffect);
  296.           }
  297.           else {          
  298.             #ifdef DEBUG_MESSAGES
  299.               Serial.printf("Wrong new current effect, must be 0-%d\n", sizeof(effectsStates) - 1);
  300.               if (isConnected) SerialBT.printf("Wrong new current effect, must be 0-%d\n", sizeof(effectsStates) - 1);
  301.             #endif
  302.           }
  303.           break;
  304.         case SET_BRIGHTNESS:
  305.           if (data >= 0 && data <= 255) {
  306.             brightness = constrain((uint8_t)data, 10, 255);
  307.             FastLED.setBrightness(brightness);
  308.             prefs.putUChar("br", brightness);  
  309.             if (isConnected) SerialBT.printf("%d|%d\n", GET_CURRENT_EFFECT, currentEffect);        
  310.             #ifdef DEBUG_MESSAGES
  311.               Serial.printf("Brightness: %d\n", brightness);
  312.               if (isConnected) SerialBT.printf("Brightness: %d\n", brightness);
  313.             #endif
  314.           }
  315.           else {
  316.             #ifdef DEBUG_MESSAGES
  317.               Serial.println(F("Wrong new brigtness, must be 0-255"));
  318.               if (isConnected) SerialBT.println(F("Wrong new brigtness, must be 0-255"));
  319.             #endif
  320.           }
  321.           break;
  322.         case GET_SOLID_COLOR:
  323.           if (isConnected) SerialBT.printf("%d|%d\n", GET_SOLID_COLOR, (int)0xFF << 24 + (int)solidColor.r << 16 + (int)solidColor.g << 8 + (int)solidColor.b);        
  324.           #ifdef DEBUG_MESSAGES
  325.             Serial.printf("Solid color: R:0x%02X G:0x%02X B:0x%02X\n", solidColor.r, solidColor.g, solidColor.b);
  326.             if (isConnected) SerialBT.printf("Solid color: R:0x%02X G:0x%02X B:0x%02X\n", solidColor.r, solidColor.g, solidColor.b);
  327.           #endif        
  328.           break;
  329.         case GET_EFFECT_CHANGE_TIMEOUT:
  330.           if (isConnected) SerialBT.printf("%d|%d\n", GET_EFFECT_CHANGE_TIMEOUT, effectChangeTimeout);        
  331.           #ifdef DEBUG_MESSAGES
  332.             Serial.printf("Effect change timeout: %d s\n", effectChangeTimeout);
  333.             if (isConnected) SerialBT.printf("Effect change timeout: %d s\n", effectChangeTimeout);
  334.           #endif        
  335.           break;
  336.         case GET_EFFECT_CHANGE_MODE:
  337.           if (isConnected) SerialBT.printf("%d|%d\n", GET_EFFECT_CHANGE_MODE, effectChangeMode);        
  338.           #ifdef DEBUG_MESSAGES
  339.             Serial.printf("Effect change mode: %d\n", effectChangeMode);
  340.             if (isConnected) SerialBT.printf("Effect change mode: %d\n", effectChangeMode);
  341.           #endif        
  342.           break;
  343.         case GET_CURRENT_EFFECT:
  344.           if (isConnected) SerialBT.printf("%d|%d\n", GET_CURRENT_EFFECT, currentEffect);      
  345.           #ifdef DEBUG_MESSAGES
  346.             Serial.printf("Current effect: %d\n", currentEffect);
  347.             if (isConnected) SerialBT.printf("Current effect: %d\n", currentEffect);
  348.           #endif        
  349.           break;
  350.         case GET_BRIGHTNESS:
  351.           if (isConnected) SerialBT.printf("%d|%d\n", GET_BRIGHTNESS, brightness);        
  352.           #ifdef DEBUG_MESSAGES
  353.             Serial.printf("Brightness: %d\n", brightness);
  354.             if (isConnected) SerialBT.printf("Brightness: %d\n", brightness);
  355.           #endif    
  356.           break;
  357.         case GET_EFFECTS_COUNT:
  358.           if (isConnected) SerialBT.printf("%d|%d\n", GET_EFFECTS_COUNT, effectsCount);  
  359.           #ifdef DEBUG_MESSAGES
  360.             Serial.printf("Effects count: %d/%d\n", getActiveEffectsCount(), effectsCount);
  361.             if (isConnected) SerialBT.printf("Effects count: %d/%d\n", getActiveEffectsCount(), effectsCount);
  362.           #endif        
  363.           break;
  364.         case GET_EFFECTS_LIST:
  365.           String buff = "";
  366.           buff += GET_EFFECTS_LIST; buff += "|";
  367.           for (uint8_t i = 0; i < effectsCount; i++) { buff += effectsStates[i]; buff += "|"; }
  368.           if (isConnected) SerialBT.println(buff);
  369.           #ifdef DEBUG_MESSAGES
  370.             Serial.println("Effects list: " + buff);
  371.             //if (isConnected) SerialBT.printf("Effects list: " + buffer);
  372.           #endif
  373.           break;
  374.         case SET_EFFECT_DISABLED:
  375.           if ((uint8_t)data < sizeof(effectsStates)) {
  376.             effectsStates[(uint8_t)data] = 1;
  377.             prefs.putBytes("es", effectsStates, sizeof(effectsStates));
  378.             if (currentEffect == (uint8_t)data) {
  379.               if (effectChangeMode == MODE_ONE_EFFECT) nextEffect();
  380.               else if (effectChangeMode == MODE_SEQUENTIAL_FORWARD || effectChangeMode == MODE_SEQUENTIAL_FORWARD || effectChangeMode == MODE_RANDOM_EFFECT) changeEffect();
  381.             }
  382.           }
  383.           else {
  384.             #ifdef DEBUG_MESSAGES
  385.               Serial.printf("Wrong effect number, must be 0-%d\n", sizeof(effectsStates) - 1);
  386.               if (isConnected) SerialBT.printf("Wrong effect number, must be 0-%d\n", sizeof(effectsStates) - 1);
  387.             #endif
  388.           }
  389.           break;
  390.         case SET_EFFECT_ENABLED:
  391.           if ((uint8_t)data < sizeof(effectsStates)) {
  392.             effectsStates[(uint8_t)data] = 3;
  393.             prefs.putBytes("es", effectsStates, sizeof(effectsStates));
  394.           }
  395.           else {
  396.             #ifdef DEBUG_MESSAGES
  397.               Serial.printf("Wrong effect number, must be 0-%d\n", sizeof(effectsStates) - 1);
  398.               if (isConnected) SerialBT.printf("Wrong effect number, must be 0-%d\n", sizeof(effectsStates) - 1);
  399.             #endif
  400.           }
  401.           break;
  402.         case SET_DEFAULTS: break;
  403.       }
  404.     }
  405.   }
  406. }
  407.  
  408. void setup() {
  409.   #ifdef DEBUG_MESSAGES
  410.     Serial.begin(SERIAL_BAUDRATE);
  411.     uint64_t chipid = ESP.getEfuseMac();//The chip ID is essentially its MAC address(length: 6 bytes).
  412.     Serial.printf("ESP32 Chip ID = 0x%04X%08X\n",(uint16_t)(chipid >> 32), (uint32_t)chipid);
  413.   #endif
  414.  
  415.   prefs.begin("duralight", false);
  416.   loadPropsFromMem();
  417.   loadEffectsFromMem();
  418.  
  419.   #ifdef DEBUG_MESSAGES
  420.     printData();
  421.   #endif
  422.  
  423.   tickerEffects.attach_ms((uint64_t)effectChangeTimeout * 15000, changeEffect);
  424.  
  425.   SerialBT.register_callback(callback);
  426.   if (!SerialBT.begin("Duralight")) {
  427.     #ifdef DEBUG_MESSAGES
  428.       Serial.println(F("An error occurred initializing Bluetooth"));
  429.     #endif
  430.     ESP.restart();
  431.   }
  432.   else {
  433.     #ifdef DEBUG_MESSAGES
  434.       Serial.println(F("Bluetooth initialized."));
  435.       Serial.println(F("The device started, now you can pair it with bluetooth."));
  436.     #endif
  437.    
  438.     LEDS.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  439.     LEDS.setBrightness(brightness);
  440.        
  441.     //attachInterrupt(digitalPinToInterrupt(BTN_PIN), btnCallback, CHANGE);
  442.   }
  443. }
  444.  
  445. void loop() {
  446.   if (lastEffect != currentEffect) {
  447.     prefs.putUChar("ce", currentEffect);        
  448.     #ifdef DEBUG_MESSAGES
  449.       Serial.printf("Current effect: %d\n", currentEffect);
  450.       if (isConnected) SerialBT.printf("Current effect: %d\n", currentEffect);
  451.     #endif
  452.     lastEffect = currentEffect;
  453.  
  454.     switch (currentEffect) {
  455.       case  0: currentPalette = RainbowColors_p;       currentBlending = LINEARBLEND; break; //  0
  456.       case  1: currentPalette = RainbowStripeColors_p; currentBlending = NOBLEND;     break; //  1
  457.       case  2: currentPalette = RainbowStripeColors_p; currentBlending = LINEARBLEND; break; //  2
  458.       case  3: setupPurpleAndGreenPalette();           currentBlending = LINEARBLEND; break; //  3
  459.       case  4: setupTotallyRandomPalette();            currentBlending = LINEARBLEND; break; //  4
  460.       case  5: setupBlackAndWhiteStripedPalette();     currentBlending = NOBLEND;     break; //  5
  461.       case  6: setupBlackAndWhiteStripedPalette();     currentBlending = LINEARBLEND; break; //  6
  462.       case  7: currentPalette = CloudColors_p;         currentBlending = LINEARBLEND; break; //  7
  463.       case  8: currentPalette = PartyColors_p;         currentBlending = LINEARBLEND; break; //  8
  464.       case  9: currentPalette = redWhiteBluePalette_p; currentBlending = NOBLEND;     break; //  9
  465.       case 10: currentPalette = redWhiteBluePalette_p; currentBlending = LINEARBLEND; break; // 10
  466.     }
  467.   }
  468.   if (startHoldTime)
  469.     if (millis() - startHoldTime >= HOLD_TIME) {
  470.       isHold = true;
  471.       startHoldTime = 0;
  472.     }
  473.  
  474.   if (isClicked) {
  475.     #ifdef DEBUG_MESSAGES
  476.       Serial.println("Click");
  477.     #endif
  478.     isClicked = false;
  479.   }
  480.   if (isHold) {
  481.     #ifdef DEBUG_MESSAGES
  482.       Serial.println("Hold");
  483.     #endif
  484.     isHold = false;
  485.   }
  486.  
  487.   if (numberOfClicks > 0 && millis() - lastTapTime > NEXT_TAP_TIMEOUT) {
  488.     #ifdef DEBUG_MESSAGES
  489.       Serial.print(numberOfClicks);
  490.       Serial.println(" clicks");
  491.     #endif
  492.     switch (numberOfClicks) {
  493.       case 1:
  494.         if      (effectChangeMode == MODE_SEQUENTIAL_FORWARD || effectChangeMode == MODE_ONE_EFFECT) nextEffect();
  495.         else if (effectChangeMode == MODE_SEQUENTIAL_BACKWARD) previousEffect();
  496.         else if (effectChangeMode == MODE_RANDOM_EFFECT) randomEffect();
  497.         break;
  498.       case 2:
  499.         if      (effectChangeMode == MODE_SEQUENTIAL_FORWARD || effectChangeMode == MODE_ONE_EFFECT) previousEffect();
  500.         else if (effectChangeMode == MODE_SEQUENTIAL_BACKWARD) nextEffect();
  501.         else if (effectChangeMode == MODE_RANDOM_EFFECT) randomEffect();
  502.         break;
  503.       case 3:
  504.         if      (effectChangeMode == MODE_ONE_EFFECT)           effectChangeMode = MODE_SEQUENTIAL_FORWARD;
  505.         else if (effectChangeMode == MODE_SEQUENTIAL_FORWARD)   effectChangeMode = MODE_SEQUENTIAL_BACKWARD;
  506.         else if (effectChangeMode == MODE_SEQUENTIAL_BACKWARD) effectChangeMode = MODE_RANDOM_EFFECT;
  507.         else if (effectChangeMode == MODE_RANDOM_EFFECT)        effectChangeMode = MODE_ONE_EFFECT;
  508.         break;
  509.       case 4:
  510.         if      (effectChangeMode == MODE_ONE_EFFECT)           effectChangeMode = MODE_RANDOM_EFFECT;
  511.         else if (effectChangeMode == MODE_SEQUENTIAL_FORWARD)   effectChangeMode = MODE_ONE_EFFECT;
  512.         else if (effectChangeMode == MODE_SEQUENTIAL_BACKWARD) effectChangeMode = MODE_SEQUENTIAL_FORWARD;
  513.         else if (effectChangeMode == MODE_RANDOM_EFFECT)        effectChangeMode = MODE_SEQUENTIAL_BACKWARD;
  514.         break;
  515.     }
  516.     numberOfClicks = 0;
  517.   }
  518.  
  519.   if (effectChangeMode == MODE_SOLID_COLOR) fill_solid(leds, NUM_LEDS, solidColor);
  520.   else {
  521.     static uint8_t startIndex = 0;
  522.     startIndex = startIndex + 1;
  523.     fillLEDsFromPaletteColors(startIndex);
  524.   }
  525.   FastLED.show();
  526.   FastLED.delay(1000 / UPDATES_PER_SECOND);
  527. }
  528.  
  529. void fillLEDsFromPaletteColors(uint8_t colorIndex) {
  530.   uint8_t brightness = 255;
  531.   for(uint16_t i = 0; i < NUM_LEDS; i++) {
  532.     leds[i] = ColorFromPalette(currentPalette, colorIndex, brightness, currentBlending);
  533.     colorIndex += 3;
  534.   }
  535. }
  536.  
  537. void setupTotallyRandomPalette() {
  538.   for(int i = 0; i < 16; i++) currentPalette[i] = CHSV(random8(), 0xFF, random8());
  539. }
  540.  
  541. void setupBlackAndWhiteStripedPalette() {
  542.   fill_solid(currentPalette, 16, CRGB::Black);
  543.   currentPalette[0] = CRGB::White;
  544.   currentPalette[4] = CRGB::White;
  545.   currentPalette[8] = CRGB::White;
  546.   currentPalette[12] = CRGB::White;
  547. }
  548.  
  549. void setupPurpleAndGreenPalette() {
  550.   CRGB purple = CHSV(HUE_PURPLE, 0xFF, 0xFF);
  551.   CRGB green  = CHSV(HUE_GREEN, 0xFF, 0xFF);
  552.   CRGB black  = CRGB::Black;
  553.   currentPalette = CRGBPalette16(green, green, black, black, purple, purple,
  554.     black, black, green, green, black, black, purple, purple, black, black);
  555. }
  556.  
  557. const TProgmemPalette16 redWhiteBluePalette_p PROGMEM = {
  558.   CRGB::Red,  CRGB::Gray, CRGB::Blue,  CRGB::Black,
  559.   CRGB::Red,  CRGB::Gray, CRGB::Blue,  CRGB::Black,
  560.   CRGB::Red,  CRGB::Red,  CRGB::Gray,  CRGB::Gray,
  561.   CRGB::Blue, CRGB::Blue, CRGB::Black, CRGB::Black
  562. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement