-
Notifications
You must be signed in to change notification settings - Fork 0
/
Strip.cpp
144 lines (121 loc) · 3.36 KB
/
Strip.cpp
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
#include "Strip.h"
#include "marco.h"
/**
* @brief 灯带构造函数
* @note 本灯带类并不代表单条灯条, 代表DBMAL的整个灯条系统(可能为多个)
*/
Strip::Strip() {
m_step = 1;
m_db = 0;
m_mirage_choice = 0; // 幻彩方案选择变量
m_music_choice = 1; // 音乐方案选择变量
FastLED.addLeds<WS2812, LED_PIN_LEFT, GRB>(m_leds[0], NUM_LEDS_PER_STRIP);
FastLED.addLeds<WS2812, LED_PIN_MID, GRB>(m_leds[1], NUM_LEDS_PER_STRIP);
FastLED.addLeds<WS2812, LED_PIN_RIGHT, GRB>(m_leds[2], NUM_LEDS_PER_STRIP);
for (int i = 0; i < NUM_STRIPS; i++) {
for (int j = 0; j < NUM_LEDS_PER_STRIP; j++) {
m_leds[i][j] = CRGB::Black; // 保证初始化时所有灯珠全灭
}
}
}
/**
* @brief 灯带颜色更新函数(无极)
*/
void Strip::UpdateFade() {
m_db = analogRead(VOLUME_PIN); // 获取声强传感器值
m_step = LIMIT(m_step, 0, 51); // 防止step速度为负
// 灯珠实际颜色渐变为目标颜色
for (int i = 0; i < NUM_STRIPS; i++) {
for (int j = 0; j < NUM_LEDS_PER_STRIP; j++) {
m_leds[i][j].r +=
LIMIT((int)((int)m_leds_target[i][j].r - (int)m_leds[i][j].r),
(-1 * m_step), m_step);
m_leds[i][j].g +=
LIMIT((int)((int)m_leds_target[i][j].g - (int)m_leds[i][j].g),
(-1 * m_step), m_step);
m_leds[i][j].b +=
LIMIT((int)((int)m_leds_target[i][j].b - (int)m_leds[i][j].b),
(-1 * m_step), m_step);
}
}
}
/**
* @brief 灯带颜色更新函数(立即)
*/
void Strip::Update() {
m_db = analogRead(VOLUME_PIN); // 获取声强传感器值
// 灯珠实际颜色直接变换为目标颜色, 不经历渐变
for (int i = 0; i < NUM_STRIPS; i++) {
for (int j = 0; j < NUM_LEDS_PER_STRIP; j++) {
m_leds[i][j] = m_leds_target[i][j];
}
}
}
/**
* @brief 关灯
*/
void Strip::Close() {
m_step = 1;
for (int i = 0; i < NUM_STRIPS; i++) {
for (int j = 0; j < NUM_LEDS_PER_STRIP; j++) {
m_leds_target[i][j] = CRGB::Black; // 保证初始化时所有灯珠全灭
}
}
}
/**
* @brief 常亮
* @note 台灯照明模式
*/
void Strip::Solid() {
m_step = 1;
for (int i = 0; i < NUM_STRIPS; i++) {
for (int j = 0; j < NUM_LEDS_PER_STRIP; j++) {
m_leds_target[i][j] = WARM_WHITE; // 灯珠颜色变为暖白
}
}
}
/**
* @brief 幻彩模式(非音乐随变)
*/
void Strip::Mirage() {
switch (m_mirage_choice) {
case 0:
MM_Dusk();
break;
case 1:
MM_Disco();
break;
case 2:
MM_Fantasy();
break;
default:
break;
}
}
/**
* @brief 音乐随变模式
*/
void Strip::Music() {
switch (m_music_choice) {
case 0:
MM_Disco();
break;
case 1:
MM_Fantasy();
break;
default:
break;
}
}
/**
* @brief 选择幻彩方案
* @param mirage_choice 幻彩方案编号
*/
void Strip::SetMirageChoice(int mirage_choice) {
m_mirage_choice = mirage_choice;
}
/**
* @brief 选择音乐方案
* @param music_choice 音乐方案编号
*/
void Strip::SetMusicChoice(int music_choice) { m_music_choice = music_choice; }