Помогите решить задачу с циклом

tesak47
Offline
Зарегистрирован: 22.01.2015

Проблема такая:

Пишу алгоритм для управления светодиодной лентой. Такой алгоритм плавно зажигает и плавно гасит красную линию светодиодов:

  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);
  }

при этом плавного нарастания яркости нет, но есть плавное затухание. Помогите пожалуйста решить задачку.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
tesak47 пишет:
Но когда я заключаю этот цикл в еще один (для 3-х кратного повторения): ... Цикл все-равно выполняется только один раз.
 
Так не бывает.
 
tesak47 пишет:
При отладке выяснилось, что переменная q приращивается три раза подряд после первого выполнения.
 
Кем выяснилось? Какии образом выяснилось? Ставились какие-то печати отладочные или ещё что - всё в студию.
 
tesak47 пишет:
Попробовал изменить код и получил повторение цикла вот так:
 
Использование переменной цикла для вложенного цикла? Забавно. Второй (средний по вложенности) цикл, видимо отрабатывает единственный раз?
tesak47
Offline
Зарегистрирован: 22.01.2015

ЕвгенийП пишет:

 
Кем выяснилось? Какии образом выяснилось? Ставились какие-то печати отладочные или ещё что - всё в студию.
 

Выяснилось при помощи:

Serial.println(q); //в теле первого по вложенности цикла

т.е. когда красная линия светодиодов у меня тухнет в сериал мониторе выводится последовательность чисел 0, 1, 2 и естественно цикл сразу завершается.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так полный скетч со вставленной печатью в студию!

Полный скетч и скопипастченый лог - чего печаталось.

tesak47
Offline
Зарегистрирован: 22.01.2015

Так полный скетч со вставленной печатью в студию!

Полный скетч и скопипастченый лог - чего печаталось.

[/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, 2, 3, 4 после первой интерации цикла.
JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

У Вас х == -1. Перенесите ее на строчку вниз

tesak47
Offline
Зарегистрирован: 22.01.2015

[quote=JollyBiber]

У Вас х == -1. Перенесите ее на строчку вниз

На сколько мне известно: если в тело if состоит из одного оператора, то можно упускать фигурные скобки.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

tesak47 пишет:

Ну какой там лог:) в данном скетче тупо выводится подряд 1, 2, 3, 4 после первой интерации цикла.

А с чего Вы взяли, что внутренний цикл (строки 44-49) работает один раз? Из того что у Вас выводится как раз следует, что он отрабатывает 4 раза, как и положено.

То, что он у Вас делает не то, чего Вы ожидаете. так это другой разговор, но работает он 4 раза, как и положено.

Чего Вы от него хотите? Что он по Вашему должен делать?

А, кажется дошло. Вы хотите, чтобы 4 раза i увеличавлось до 255, а потом уменьшалось до 1? Так? Ну, тогда поменяйте местами строки 42 и 43, а то он у Вас при втором проходе начинается уже с x равным -1.

 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

строчку 42 поставить после 43

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

JollyBiber, надеюсь ТС не программист, потому как если бы он был таковым, то алгоритм его действий мог бы быть таким:

1. Прочитать мой пост
2. поменять местами 42 и 43
3. Прочитать Ваш пост
4. поменять местами 42 и 43
5. Запостить "Не, мужики, ни хрена не помогло!"

:))))))))))))))))))))))))

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Как знать. У меня бывает "глаз замыливается" и в упор ошибку не вижу. А потом уже просто тупить начинаю. Особенно когда в переменной или функции с длинным именем опечатаешься, например на пыхе...

tesak47
Offline
Зарегистрирован: 22.01.2015

Огромное спасибо друзья! Все получилось. Я кстати не программист, но имею большое желание научиться программировать. Скетч кстати на 70% мой:) Вобщем доволен как слон. Получил полноценный контроллер RGB лентой. 

Еще раз всем спасибо.