мистика с millis()

Die MF Die
Offline
Зарегистрирован: 25.11.2017

Привет. Какая странность происходит с millis(), при работе с библиотекой FastLED она возвращает неверное значение, если я указываю длину змейки больше 3

#include "FastLED.h"
#define NUM_LEDS 30
#define PIN 8
CRGB leds[NUM_LEDS];
boolean flag = false;
unsigned long OldTime;
unsigned long OldTime2;
int n=1;
void setup() {
  Serial.begin(9600);
  FastLED.addLeds<WS2812B, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(20); 
  OldTime = millis();
  OldTime2 = millis(); 
}
 

void loop() {   
 ///////////////////просто счетчик раз в секунду, который выводит millis и расчеты связанные с ним  
  if((millis() - OldTime2) > 1000){   
    Serial.print(n); Serial.println(") millis() - OldTime2 = РАЗНИЦА");
    Serial.print("    "); Serial.print(millis()); Serial.print(" - ");Serial.print(OldTime2);Serial.print(" = ");Serial.println(millis() - OldTime2);    
    Serial.println("");
    OldTime2 = millis();
    n++;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
  
 if(!flag){
   if((millis() - OldTime) > 5000){   
    flag = true;  
    Serial.println("===========================");
    Serial.println("БЕЖИТ ЗМЕЯЯЯЯЯЯЯЯЯЯ");
    Serial.print("millis() = ");Serial.println(millis());
    Serial.println("===========================");
    snake(3); /////////////////////// вызов функции snake 1 раз после старта 5 сек
   }
 }
 
}   

      
void snake(int longSnake){ // Функция запуска бегущей змейки
  
  for (int i = 0; i < NUM_LEDS; i++ ) {     
    leds[i] = CRGB(21, 71, 235);   
    for(int j=0; j < longSnake; j++){ ////////////////////////ЗДЕСЬ ТВОРИТСЯ МАГИЯ, ЕСЛИ ДЛИНА ЗМЕЙКИ БОЛЬШЕ 3,  OldTime2 присваивается большое число  
      leds[i+j] = leds[i];
    }   
     FastLED.show();    
    delay(100); // Скорость змейки
    leds[i] = CRGB(0, 0, 0);
    
  }  
}

Что в порте при длине в 3. Здесь все ОКЕЙ

1) millis() - OldTime2 = РАЗНИЦА
    1001 - 0 = 1001

2) millis() - OldTime2 = РАЗНИЦА
    2002 - 1001 = 1001

3) millis() - OldTime2 = РАЗНИЦА
    3005 - 2004 = 1001

4) millis() - OldTime2 = РАЗНИЦА
    4008 - 3007 = 1001

===========================
БЕЖИТ ЗМЕЯЯЯЯЯЯЯЯЯЯ
millis() = 5015
===========================
5) millis() - OldTime2 = РАЗНИЦА
    8082 - 4075 = 4007

6) millis() - OldTime2 = РАЗНИЦА
    9084 - 8083 = 1001

7) millis() - OldTime2 = РАЗНИЦА
    10087 - 9086 = 1001

А вот что в порте, если указать длину в 5

1) millis() - OldTime2 = РАЗНИЦА
    1001 - 0 = 1001

2) millis() - OldTime2 = РАЗНИЦА
    2002 - 1001 = 1001

3) millis() - OldTime2 = РАЗНИЦА
    3005 - 2004 = 1001

4) millis() - OldTime2 = РАЗНИЦА
    4008 - 3007 = 1001

===========================
БЕЖИТ ЗМЕЯЯЯЯЯЯЯЯЯЯ
millis() = 5015
===========================
5) millis() - OldTime2 = РАЗНИЦА
    15419258 - 3947304427 = 363082131

6) millis() - OldTime2 = РАЗНИЦА
    15420276 - 15419275 = 1003

7) millis() - OldTime2 = РАЗНИЦА
    15421288 - 15420286 = 1004

8) millis() - OldTime2 = РАЗНИЦА
    15422299 - 15421298 = 1003

Если указать длину в 7, ардуина вообще перезапускается после того, как змея добежит до конца и millis сбрасывается

Что я делаю не так?

Die MF Die
Offline
Зарегистрирован: 25.11.2017

Забыл написать) Светодиодная адресная лента длиной в 30 светодиодов, питание отдельное, к ардуине подключена через резистор

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Попробуйте поменять 9600 на 115200.

Die MF Die
Offline
Зарегистрирован: 25.11.2017

Не знаю как может скорость порта влиять на millis(). Но все равно проверил - не помогло.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Ты в строке 48 выходишь за пределы массива. Вот и вылезают всякие глюки. Поправь логику вычисления индекса.

Die MF Die
Offline
Зарегистрирован: 25.11.2017

Да, все верно. Спасибо за ответ. Исправил