-
Notifications
You must be signed in to change notification settings - Fork 0
/
Strip.h
152 lines (125 loc) · 4.02 KB
/
Strip.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#ifndef __STRIP_H
#define __STRIP_H
#include <FastLED.h>
#include "config.h"
#include "marco.h"
class Strip {
public:
/**
* @brief 灯带构造函数
* @note 本灯带类并不代表单条灯条, 代表DBMAL的整个灯条系统(可能为多个)
*/
explicit Strip();
/**
* @brief 灯带颜色更新函数(无极)
*/
void UpdateFade();
/**
* @brief 灯带颜色更新函数(立即)
*/
void Update();
/**
* @brief 关灯
*/
void Close();
/**
* @brief 常亮
* @note 台灯照明模式
*/
void Solid();
/**
* @brief 幻彩模式(非音乐随变)
*/
void Mirage();
/**
* @brief 音乐随变模式
*/
void Music();
/**
* @brief 选择幻彩方案
* @param mirage_choice 幻彩方案编号
*/
void SetMirageChoice(int mirage_choice);
/**
* @brief 选择音乐方案
* @param music_choice 音乐方案编号
*/
void SetMusicChoice(int music_choice);
private:
int m_step; // 颜色渐变步长
int m_db; // 声强传感器虚拟值
int m_mirage_choice; // 幻彩方案选择变量
int m_music_choice; // 音乐方案选择变量
CRGB m_leds[NUM_STRIPS][NUM_LEDS_PER_STRIP]; // 三排灯珠RGB颜色数组
CRGB m_leds_target[NUM_STRIPS]
[NUM_LEDS_PER_STRIP]; // 三排灯珠RGB变换目标颜色数组
/**
* @brief 黄昏模式
* @note 灯珠在橙色与红色色域间随机变换
*/
void MM_Dusk() {
static int H_Max = 48; // 橙色色域
static int H_Min = 0; // 红色色域
// 颜色变化较缓慢
m_step = 1;
for (int i = 0; i < NUM_STRIPS; i++) {
for (int j = 0; j < NUM_LEDS_PER_STRIP; j++) {
if (m_leds[i][j] == m_leds_target[i][j]) {
m_leds_target[i][j] =
CHSV(random(H_Min, H_Max + 1), random(240, 255 + 1),
random(200, 255 + 1));
}
}
}
}
/**
* @brief 蹦迪模式
* @note 灯珠在红蓝紫随变切换
*/
void MM_Disco() {
m_step = 4;
// 颜色变化较快
for (int i = 0; i < NUM_STRIPS; i++) {
for (int j = 0; j < NUM_LEDS_PER_STRIP; j++) {
if (m_leds[i][j] == m_leds_target[i][j]) {
m_leds_target[i][j] =
CRGB(random(255 + 1), random(255 + 1), random(255 + 1));
}
}
}
}
/**
* @brief 梦幻音乐随变模式
* @note 声强大小决定颜色渐变速率
* @note 声强大小决定颜色集群数量
* @note 声强大小决定颜色丰富程序(色域宽度)
*/
void MM_Fantasy() {
float color_rate = MAX(10.0f, ((float)m_db - (float)VOICE_DOWN_DB)) /
(float)VOICE_WIDTH_DB;
m_step = color_rate * 3.0f;
//根据输入分贝的大小决定颜色群数量
int group_num = color_rate * (float)TOP_COLOR_GROUP_NUM;
group_num = MAX(1, group_num);
int group_width = (float)NUM_LEDS_PER_STRIP / (float)group_num;
int color_down_bias = 255.0f - (color_rate * 155.0f);
CRGB color_group[4] = {
{random(color_down_bias, 255 + 1), random(color_down_bias, 255 + 1),
0},
{random(color_down_bias, 255 + 1), random(color_down_bias, 255 + 1),
random(color_down_bias, 255 + 1)},
{random(color_down_bias, 255 + 1), 0,
random(color_down_bias, 255 + 1)},
{0, random(color_down_bias, 255 + 1),
random(color_down_bias, 255 + 1)}};
// 颜色变化较快
for (int i = 0; i < NUM_STRIPS; i++) {
for (int j = 0; j < NUM_LEDS_PER_STRIP; j++) {
if (m_leds[i][j] == m_leds_target[i][j]) {
m_leds_target[i][j] = color_group[j / group_width % 4];
}
}
}
}
};
#endif