当我使用 int“rite”设置 LED 时,它会更改 int“cnt”,我不明白为什么。
仅供参考,代码是一个修改后的拉森扫描仪,它应该沿着字符串运行一个单一的blip,点亮最后一个LED,一个单一的blip返回到开头并点亮第一个LED,它一遍又一遍地循环,每个末端都得到每次通过都更靠近中心,直到它们在中间相遇
您将在收缩函数的中间看到一条注释“THIS LINE”。 cnt 递增直到 (cnt < rite -1) as it should, after that it should decrement until it's greater than (left_end + 1). But cnt changes to 13824 before it starts decrementing.
代码运行良好,如果您注释掉该行或将变量更改为数字,它看起来不像我想要的 LED 灯条,但 cnt 不会更改为 13824。 我已经包含了串行监视器输出的一部分,在 20:00:51.387 你可以看到 int 变化。
有什么想法吗?
谢谢
/* Used to play with LED patterns. Select functions you want and add them to the Loop function. 9/16/24 */
#include "FastLED.h"
#define NUM_LEDS 20 // 144
#define DATA_PIN 5
CRGB leds[NUM_LEDS];
int cnt = 0, c1 = 150, c2 = 160, v1 = 0, v2 = 75, v3 = 150, v4 = 255, g = NUM_LEDS;
void setup() {
Serial.begin(115200);
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
}
void loop() {
Serial.println("loop");
clear();
shrink();
//larsen();
}
void clear() {
while (cnt < NUM_LEDS) {
leds[(cnt)] = CHSV(c2, 255, v1);
cnt++;
}
cnt = 0;
FastLED.show();
Serial.println("CLEARED");
}
void larsen() {
clear();
while (cnt < NUM_LEDS - 2) { // Larsen Scanner
leds[(cnt - 3)] = CHSV(c2, 255, v1);
leds[(cnt - 2)] = CHSV(c2, 255, v2);
leds[(cnt - 1)] = CHSV(c1, 255, v3);
leds[(cnt)] = CHSV(c1, 255, v4);
leds[(cnt + 1)] = CHSV(c1, 255, v3);
leds[(cnt + 2)] = CHSV(c2, 255, v2);
leds[(cnt + 3)] = CHSV(c2, 255, v1);
cnt++;
FastLED.show();
delay(8);
}
while (cnt > 0) {
Serial.print("cnt= ");
Serial.println(cnt);
leds[(cnt - 3)] = CHSV(c2, 255, v1);
leds[(cnt - 2)] = CHSV(c2, 255, v2);
leds[(cnt - 1)] = CHSV(c1, 255, v3);
leds[(cnt)] = CHSV(c1, 255, v4);
leds[(cnt + 1)] = CHSV(c1, 255, v3);
leds[(cnt + 2)] = CHSV(c2, 255, v2);
leds[(cnt + 3)] = CHSV(c2, 255, v1);
cnt--;
FastLED.show();
delay(8);
}
}
void bricks() { // Stacking Bricks Demo
clear();
Serial.println("TOP");
int c1 = 160, c2 = 160, c3 = 170, b = 0, cnt = 1, g = NUM_LEDS;
cnt=0;
while (g > 0) {
while (cnt < 5) {
leds[cnt] = CHSV(c1, 255, 255);
Serial.print("Brick cnt= ");
Serial.println(cnt);
cnt++;
FastLED.show();
}
cnt = 0;
while (cnt < g - 5) {
Serial.print("cnt1= ");
Serial.println(cnt);
Serial.print("g1= ");
Serial.println(g);
leds[cnt] = CHSV(c1, 255, 0);
leds[cnt + 5] = CHSV(c1, 255, 255);
delay(20);
FastLED.show();
cnt++;
Serial.print("cnt2= ");
Serial.println(cnt);
Serial.print("g2= ");
Serial.println(g);
}
delay(20);
g = g - 5;
cnt = 0;
}
}
void shrink(){
clear();
int left_end = 0, rite = NUM_LEDS, test;
cnt=0;
leds[cnt] = CHSV(c1,255,v4);
FastLED.show();
cnt++;
left_end++;
Serial.print("RESET cnt= ");
Serial.println(cnt);
Serial.print("left_end= ");
Serial.println(left_end);
Serial.print("rite= ");
Serial.println(rite);
while ( left_end< rite) {
while (cnt < rite-1) {
cnt++;
leds[cnt-1]=CHSV(c1,255,v1);
leds[cnt]=CHSV(c1,255,v4);
Serial.print("cnt= ");
Serial.print(cnt);
Serial.print(" cnt = on");
Serial.println(" cnt -1 = off");
FastLED.show();
delay(500);
}
leds[rite]=CHSV(c1,255,v4); // **** This Line *****
Serial.print("rite= ");
Serial.print(rite);
Serial.println(" rite = on");
FastLED.show();
Serial.print("cnt= "); // why 13824??
Serial.println(cnt);
rite--;
while (cnt > left_end+1) {
cnt--;
leds[cnt+1] = CHSV(c1,255,v1);
leds[cnt] = CHSV (c1,255,v4);
Serial.print("cnt= ");
Serial.print(cnt);
Serial.print(" cnt+1 = on");
Serial.println(" cnt = off");
FastLED.show();
delay(500);
}
leds[left_end]=CHSV(c1,255,v4);
Serial.print("left_end= ");
Serial.print(left_end);
Serial.println(" left_end = on");
FastLED.show();
delay(500);
left_end++;
}
}
串行监视器输出
20:00:50.393 -> cnt= 18 cnt = 打开 cnt -1 = 关闭
20:00:50.888 -> cnt= 19 cnt = 开 cnt -1 = 关
20:00:51.387 -> 仪式= 20 仪式=开
20:00:51.387 -> cnt= 13824
你正在跑出阵列的末端。
leds
定义了 20 个元素,编号为 0 到 19。当您存储到 leds[20]
时,它就超出了数组的末尾,内存中的下一个元素是 cnt
。