мистика с 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 выходишь за пределы массива. Вот и вылезают всякие глюки. Поправь логику вычисления индекса.
Да, все верно. Спасибо за ответ. Исправил