Добрый день.
Я новичок в делах ардуино. И это мой первый самостоятельный проект.
Хочу сделать гирлянду с рандомно-вспихивающими и тухнущими диодами. Данные о состояние диодов хочу хранить в массиве. Далее в цикле пробегать по данному массиву и, в зависимости от флага состояния диода, выполнять действия из switch'a. Вроде бы все ок, но возникли проблемы с задержкой вспышек. В момент полного затухания ставится флаг на ожидание и кидается рандом для определения задержки и значение заносится в массив. В блоке switch'a, который отрабатывает данную задержку есть сравнение, в котором сравнивается текущее сначение счетчика (так же хранится в массиве) и значение задержки выбранного при окончании затухания. Если больше или равно, то переключаемся в рост, если меньше, то добавляем единицу в текущее значение.
Вроде все логично, но в какой-то момент все вырождается в картину на скриншоте, как бы я не крутил лимиты в рандоме.
Делать переключение просто по рандому не хочется, хотя оно хоть как-то работает. Просто хочу управлять периодом задержки более точно.
Код следующий:
Пробовал с millis(). Вот вариант case:0 выглядит так:
Помогите придумать как это сделать красивее и простите за глупые вопросы. Если все это было на форуме, то ткните, пожалуйста, меня мордой туда.
Я новичок в делах ардуино. И это мой первый самостоятельный проект.
Хочу сделать гирлянду с рандомно-вспихивающими и тухнущими диодами. Данные о состояние диодов хочу хранить в массиве. Далее в цикле пробегать по данному массиву и, в зависимости от флага состояния диода, выполнять действия из switch'a. Вроде бы все ок, но возникли проблемы с задержкой вспышек. В момент полного затухания ставится флаг на ожидание и кидается рандом для определения задержки и значение заносится в массив. В блоке switch'a, который отрабатывает данную задержку есть сравнение, в котором сравнивается текущее сначение счетчика (так же хранится в массиве) и значение задержки выбранного при окончании затухания. Если больше или равно, то переключаемся в рост, если меньше, то добавляем единицу в текущее значение.
Вроде все логично, но в какой-то момент все вырождается в картину на скриншоте, как бы я не крутил лимиты в рандоме.
Делать переключение просто по рандому не хочется, хотя оно хоть как-то работает. Просто хочу управлять периодом задержки более точно.
Код следующий:
C++:
const int minVal = 40;
const int maxVal = 255;
const int maxInterval = 2000;
// Массив данных в диодах.
//0 - пин диода
//1 - состояние (0 : в покое, 1 : приростает, 2 : убывает)
//2 - текущее значение яркости
//3 - предыдущее значение (previousMillis)
//4 - interval
int pinArray[][5] = {
{2, 0, 40, 0, 150}
, {3, 0, 200, 0, 150}
, {4, 0, 100, 0, 150}
};
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println("val1 , val2 , val3");
}
void loop() {
for (int i = 0; i < sizeof(pinArray) / sizeof(pinArray[0]); i++) { // идем по массиву светодиодов
switch (pinArray[i][1]) {
case 1: // Увеличение яркости
if (pinArray[i][2] >= maxVal) {
pinArray[i][1] = 2; // Яркость достигла максимума, переключаем на затухание
} else {
pinArray[i][2] = pinArray[i][2] + 10; // Добавляем яркости
}
break;
case 2: // Уменьшение яркости
if (pinArray[i][2] <= minVal) {
pinArray[i][1] = 0; // Ярсокость достигла минимума, переключаем в ждущий режим
pinArray[i][4] = random(1000, maxInterval); // гененируем интервал задержки
} else {
pinArray[i][2] = pinArray[i][2] - 5; // Уменьшаем яркость
}
break;
case 0: // Этап задержки
if (pinArray[i][3] >= pinArray[i][4]) { // Сравниваем значение счетчика в массиве со сначением задержки, если счетчик больше, то переключаем в режим увеличения яркости
pinArray[i][1] = 1;
} else {
pinArray[i][3]++; // Если счетчик меньше, то добавляем значение к нему.
}
break;
}
// Вывод графиков
if (i == (sizeof(pinArray) / sizeof(pinArray[0])) - 1) {
Serial.println(pinArray[i][2]);
} else {
Serial.print(pinArray[i][2]);
Serial.print(",");
}
}
}
C++:
long currentMillis = millis();
if (currentMillis - pinArray[i][3] >= pinArray[i][4]) {
pinArray[i][1] = 1;
pinArray[i][5] = currentMillis;
}
Изменено: