Amateur Radio Station R9AL

      Автомат световых эффектов - это устройство устройство, которое может создавать различные световые эффекты в автоматическом или полуавтоматическом режиме. Самый просто автомат световых эффектов - "бегущий огонь" мы рассматривали на уроке 2 ("Мигаем светодиодами").

Соберем простую схему из 8-ми светодиодов:



И напишем простую программу, аналогичную той, что мы делали для 4 светодиодов на втором уроке:
int pin;

void setup()

{
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
pinMode(4, OUTPUT);
pinMode(3, OUTPUT);
pinMode(2, OUTPUT);
pinMode(1, OUTPUT);
pinMode(0, OUTPUT);
}

void loop()
{
  digitalWrite(0, HIGH); // Устанавливаем высокий уровень на выводе 0
  delay(200); // Ждем 200 миллисекунд
  digitalWrite(0, LOW); // Устанавливаем низкий уровень на выводе 0
  delay(200); // Ждем 200 миллисекунд

  digitalWrite(1, HIGH); // Устанавливаем высокий уровень на выводе 1
  delay(200); // Ждем 200 миллисекунд
  digitalWrite(1, LOW); // Устанавливаем низкий уровень на выводе 1
  delay(200); // Ждем 200 миллисекунд

  digitalWrite(2, HIGH); // Устанавливаем высокий уровень на выводе 2
  delay(200); // Ждем 200 миллисекунд
  digitalWrite(2, LOW); // Устанавливаем низкий уровень на выводе 2
  delay(200); // Ждем 200 миллисекунд

  digitalWrite(3, HIGH); // Устанавливаем высокий уровень на выводе 3
  delay(200); // Ждем 200 миллисекунд
  digitalWrite(3, LOW); // Устанавливаем низкий уровень на выводе 3
  delay(200); // Ждем 200 миллисекунд

  digitalWrite(4, HIGH); // Устанавливаем высокий уровень на выводе 4
  delay(200); // Ждем 200 миллисекунд
  digitalWrite(4, LOW); // Устанавливаем низкий уровень на выводе 4
  delay(200); // Ждем 200 миллисекунд

  digitalWrite(5, HIGH); // Устанавливаем высокий уровень на выводе 5
  delay(200); // Ждем 200 миллисекунд
  digitalWrite(5, LOW); // Устанавливаем низкий уровень на выводе 5
  delay(200); // Ждем 200 миллисекунд

  digitalWrite(6, HIGH); // Устанавливаем высокий уровень на выводе 6
  delay(200); // Ждем 200 миллисекунд
  digitalWrite(6, LOW); // Устанавливаем низкий уровень на выводе 6
  delay(200); // Ждем 200 миллисекунд

  digitalWrite(7, HIGH); // Устанавливаем высокий уровень на выводе 7
  delay(200); // Ждем 200 миллисекунд
  digitalWrite(7, LOW); // Устанавливаем низкий уровень на выводе 7
  delay(200); // Ждем 200 миллисекунд
}


Загружаем скетч и убеждаемся что программа работает. В этой программе мы управляем отдельно каждым светодиодом. Но можно за один шаг управлять сразу группой светодиодов.

Рассмотрим простой случай, например, нам нужно зажечь несколько светодиодов, а в следующий момент времени их погасить и зажечь те, которые до этого не горели. Потом все светодиоды погасить и начать сначала. Например, вот так:



Программа получается довольно громоздкая, тем не менее, таким способом можно писать программы для довольно сложных эффектов.
int pin;

void setup()

{
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
pinMode(4, OUTPUT);
pinMode(3, OUTPUT);
pinMode(2, OUTPUT);
pinMode(1, OUTPUT);
pinMode(0, OUTPUT);
}

void loop()
{
  digitalWrite(0, 1); // Устанавливаем высокий уровень на выводе 0
  digitalWrite(1, 0); // Устанавливаем высокий уровень на выводе 1
  digitalWrite(2, 0); // Устанавливаем высокий уровень на выводе 2
  digitalWrite(3, 1); // Устанавливаем высокий уровень на выводе 3
  digitalWrite(4, 1); // Устанавливаем высокий уровень на выводе 4
  digitalWrite(5, 0); // Устанавливаем высокий уровень на выводе 5
  digitalWrite(6, 1); // Устанавливаем высокий уровень на выводе 6
  digitalWrite(7, 0); // Устанавливаем высокий уровень на выводе 7
  delay(2000); // Ждем 200 миллисекунд

  digitalWrite(0, 0); // Устанавливаем высокий уровень на выводе 0
  digitalWrite(1, 1); // Устанавливаем высокий уровень на выводе 1
  digitalWrite(2, 1); // Устанавливаем высокий уровень на выводе 2
  digitalWrite(3, 0); // Устанавливаем высокий уровень на выводе 3
  digitalWrite(4, 0); // Устанавливаем высокий уровень на выводе 4
  digitalWrite(5, 1); // Устанавливаем высокий уровень на выводе 5
  digitalWrite(6, 0); // Устанавливаем высокий уровень на выводе 6
  digitalWrite(7, 1); // Устанавливаем высокий уровень на выводе 7
  delay(2000); // Ждем 200 миллисекунд

}



Чем сложнее эффекты - тем более громоздкой будет программа, поэтому такой подход "в лоб" не очень эффективен. Для того чтобы сократить код необходимо использовать различные математические операции, логические конструкции и циклы.

Циклы while



while(i < 200)  
{
 // выполнить что-то, повторив 200 раз
 i++;
}
While будет обрабатывать в цикле непрерывно то, что внутри фигурных скобок, пока истинно условие в круглых скобках. и бесконечно до тех пор, пока выражение в круглых скобках

do ... while

Цикл do работает так же, как и цикл while, за исключением того, что условие проверяется в конце цикла, таким образом, цикл do будет всегда выполняться хотя бы раз.
do
{
    // последовательность операторов
} while (проверка условия);

break

Break используется для принудительного выхода из циклов do, for или while, не дожидаясь завершения цикла по условию. Он также используется для выхода из оператора switch

continue

Оператор continue пропускает оставшиеся операторы в текущем шаге цикла. Вместо них выполняется проверка условного выражения цикла, которая происходит при каждой следующей итерации, например:

for (x = 0; x < 255; x ++)
{
    if (x > 40 && x < 120){      // если истина то прыгаем сразу на следующую итерацию цикла
        continue;
    }
 
    digitalWrite(PWMpin, x);
    delay(50);
 
}

return

Прекращает вычисления в функции и возвращает значение из прерванной функции в вызывающую, если это нужно.

Синтаксис
return;

return значение; // обе формы допустимы

Оператор goto

Условное "перемещение" выполнения программы к определенной метке-указателю в самой программе, при этом пропускается весь код до самой метки, а исполняется - после нее.

Синтаксис:
label:
//
// какой-либо код
//
goto label; // переходим к метке label
Замечание по использованию

Использование goto не рекомендуется в С программировании, многие авторы книг не советуют его применять вообще, так как это не является необходимым (с их точки зрения). Причины их негодования заключаются в том, что программист при частом использовании в коде, команды goto - может запустить программу в бесконечный цикл, который потом трудно будет найти - отладка программы значительно усложниться. С другой стороны, если взглянуть на ассемблерный код, то там часто используется подобный переход по метке.

При разумном применении, команда может значительно упростить код программы и сохранить время программиста. Например, в случае необходимости выхода из глубоких циклов for, while, проверок if и прочих многократно вложенных конструкций.







Copyright © R9AL 2021 Все права защищены

Рейтинг@Mail.ru Яндекс цитирования