Помогите решить задачу с циклом
- Войдите на сайт для отправки комментариев
Чт, 12/11/2015 - 11:02
Проблема такая:
Пишу алгоритм для управления светодиодной лентой. Такой алгоритм плавно зажигает и плавно гасит красную линию светодиодов:
x = 1;
for (i = 1; i > 0; i = i + x){
redStrip.setSpeed(i);
if (i == 255){
x = -1;
}
delay(fadeSpeed);
}
Но когда я заключаю этот цикл в еще один (для 3-х кратного повторения):
x = 1;
for (q = 0; q < 2; q++){
for (i = 1; i > 0; i = i + x){
redStrip.setSpeed(i);
if (i == 255){
x = -1;
}
delay(fadeSpeed);
}
}Цикл все-равно выполняется только один раз. При отладке выяснилось, что переменная q приращивается три раза подряд после первого выполнения.
Я в программировании новичок и много не понимаю. Попробовал изменить код и получил повторение цикла вот так:
for (int q = 0; q < 5; q++){
for (i = 0; i < 255; i ++) {
redStrip.setSpeed(r++);
delay(fadeSpeed);
for (i = 0; i < 255; i ++) {
redStrip.setSpeed(r--);
delay(fadeSpeed);
}
}
Serial.println(q);
}при этом плавного нарастания яркости нет, но есть плавное затухание. Помогите пожалуйста решить задачку.
Выяснилось при помощи:
Serial.println(q); //в теле первого по вложенности цикла
т.е. когда красная линия светодиодов у меня тухнет в сериал мониторе выводится последовательность чисел 0, 1, 2 и естественно цикл сразу завершается.
Так полный скетч со вставленной печатью в студию!
Полный скетч и скопипастченый лог - чего печаталось.
Так полный скетч со вставленной печатью в студию!
Полный скетч и скопипастченый лог - чего печаталось.
[/quote]
#include <AFMotor.h> //Подключаем библиотеку для работы с шилдом // Подключаем линии светодиодов к клеммникам M1, M2, M3 AF_DCMotor greenStrip(1); //инициализация зеленой линии светодиодов AF_DCMotor redStrip(2); //инициализация красной линии светодиодов AF_DCMotor blueStrip(3); //инициализация синей линии светодиодов int fadeSpeed = 2; //переменная для fade эффекта int x; int i; int y; void setup() { Serial.begin(9600); } void red() { greenStrip.run(FORWARD); //включаем зеленую линию светдиодов redStrip.run(BACKWARD); //выключаем красную линию светодиодов blueStrip.run(FORWARD); //выключаем синию линию светодиодов } void green() { greenStrip.run(BACKWARD); //включаем зеленую линию светдиодов redStrip.run(FORWARD); //выключаем красную линию светодиодов blueStrip.run(FORWARD); //выключаем синию линию светодиодов } void blue() { greenStrip.run(FORWARD); //включаем зеленую линию светдиодов redStrip.run(FORWARD); //выключаем красную линию светодиодов blueStrip.run(BACKWARD); //выключаем синию линию светодиодов } void all() { greenStrip.run(BACKWARD); //включаем зеленую линию светдиодов redStrip.run(BACKWARD); //выключаем красную линию светодиодов blueStrip.run(BACKWARD); //выключаем синию линию светодиодов } void loop() { x = 1; for (y = 1; y < 5; y++) { for (i = 1; i > 0; i = i + x) { red(); redStrip.setSpeed(i); if (i == 255) x = -1; delay(fadeSpeed); } Serial.println(y); } x = 1; for (i = 1; i > 0; i = i + x) { green(); greenStrip.setSpeed(i); if (i == 255) x = -1; delay(fadeSpeed); } x = 1; for (i = 1; i > 0; i = i + x) { blue(); blueStrip.setSpeed(i); if (i == 255) x = -1; delay(fadeSpeed); } }У Вас х == -1. Перенесите ее на строчку вниз
[quote=JollyBiber]
У Вас х == -1. Перенесите ее на строчку вниз
На сколько мне известно: если в тело if состоит из одного оператора, то можно упускать фигурные скобки.
Ну какой там лог:) в данном скетче тупо выводится подряд 1, 2, 3, 4 после первой интерации цикла.
То, что он у Вас делает не то, чего Вы ожидаете. так это другой разговор, но работает он 4 раза, как и положено.
Чего Вы от него хотите? Что он по Вашему должен делать?
А, кажется дошло. Вы хотите, чтобы 4 раза i увеличавлось до 255, а потом уменьшалось до 1? Так? Ну, тогда поменяйте местами строки 42 и 43, а то он у Вас при втором проходе начинается уже с x равным -1.
строчку 42 поставить после 43
JollyBiber, надеюсь ТС не программист, потому как если бы он был таковым, то алгоритм его действий мог бы быть таким:
1. Прочитать мой пост
2. поменять местами 42 и 43
3. Прочитать Ваш пост
4. поменять местами 42 и 43
5. Запостить "Не, мужики, ни хрена не помогло!"
:))))))))))))))))))))))))
Как знать. У меня бывает "глаз замыливается" и в упор ошибку не вижу. А потом уже просто тупить начинаю. Особенно когда в переменной или функции с длинным именем опечатаешься, например на пыхе...
Огромное спасибо друзья! Все получилось. Я кстати не программист, но имею большое желание научиться программировать. Скетч кстати на 70% мой:) Вобщем доволен как слон. Получил полноценный контроллер RGB лентой.
Еще раз всем спасибо.