мистика с millis()
- Войдите на сайт для отправки комментариев
Чт, 12/09/2019 - 21:59
Привет. Какая странность происходит с 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 сбрасывается
Что я делаю не так?
Забыл написать) Светодиодная адресная лента длиной в 30 светодиодов, питание отдельное, к ардуине подключена через резистор
Попробуйте поменять 9600 на 115200.
Не знаю как может скорость порта влиять на millis(). Но все равно проверил - не помогло.
Ты в строке 48 выходишь за пределы массива. Вот и вылезают всякие глюки. Поправь логику вычисления индекса.
Да, все верно. Спасибо за ответ. Исправил