使用一个整数设置 LED 值会更改另一个整数

问题描述 投票:0回答:1

当我使用 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

arduino-uno fastled
1个回答
0
投票

你正在跑出阵列的末端。

leds
定义了 20 个元素,编号为 0 到 19。当您存储到
leds[20]
时,它就超出了数组的末尾,内存中的下一个元素是
cnt

© www.soinside.com 2019 - 2024. All rights reserved.