Программируем Arduino. Профессиональная работа со скетчами. - страница 9
Но иногда требуется выполнить команды определенное число раз. Добиться этого можно с помощью команды for, позволяющей использовать переменную-счетчик. Например, напишем скетч, который мигает светодиодом 10 раз. Далее вы узнаете, почему это решение нельзя признать идеальным при определенных обстоятельствах, но сейчас оно вполне отвечает нашим потребностям.
// sketch 01_01_blink_10
int ledPin = 13;
int delayPeriod = 200;
void setup()
{
pinMode(ledPin, OUTPUT);
}
void loop()
{
for (int i = 0; i < 10; i++)
{
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
}
}
ПРИМЕЧАНИЕ
Это наш первый законченный скетч, поэтому его имя указано в строке комментария в начале файла. Все скетчи с подобными именами можно загрузить на веб-сайте автора www.simonmonk.org. Чтобы установить все скетчи в окружение Arduino, распакуйте файл со скетчами в каталог Arduino, который находится в папке Documents (Документы). Среда разработки Arduino IDE автоматически создает эту папку при первом запуске.
Команда for определяет переменную с именем i и присваивает ей начальное значение 0. За точкой с запятой (;) следует текст i<10. Это условие продолжения цикла. Иными словами, пока значение i остается меньше 10, продолжают выполняться команды, заключенные в фигурные скобки.
Последний элемент в команде for — i++. Это сокращенная форма записи выражения i = i + 1, которое прибавляет 1 к значению i. Увеличение значения i на единицу происходит в конце каждого цикла. Это выражение гарантирует прекращение цикла, потому что, увеличивая i на 1, вы в конечном счете получите значение больше 10.
Функции
Функции — это способ группировки программных команд в удобный для использования блок. Функции помогают поделить скетч на управляемые и простые в использовании фрагменты.
Например, напишем скетч, который сначала быстро мигает светодиодом 10 раз, а затем начинает мигать с частотой один раз в секунду.
Прочитайте следующий листинг, а потом я объясню, как он работает.
// sketch 01_02_blink_fast_slow
int ledPin = 13;
void setup()
{
pinMode(ledPin, OUTPUT);
flash(10, 100);
}
void loop()
{
flash(1, 500);
}
void flash(int n, int delayPeriod)
{
for (int i = 0; i < n; i++)
{
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
}
}
Функция setup теперь включает строку flash(10, 100);. Она означает: «мигнуть 10 раз с периодом задержки delayPeriod 100 мс». Команда flash не является встроенной командой Arduino — вы создадите эту очень полезную функцию сами.
Определение функции находится в конце скетча. Первая строка в определении функции
void flash(int n, int delayPeriod)
сообщает Arduino, что определяется новая функция с именем flash, которая принимает два параметра, оба типа int. Первый параметр, с именем n, определяет, сколько раз светодиод должен мигнуть, а второй, с именем delayPeriod, определяет величину паузы после включения или выключения светодиода.
Эти два параметра можно использовать только внутри функции. Так, n используется в команде for, где определяет количество повторений цикла, а delayPeriod — внутри команд delay.
Функция loop скетча также использует функцию flash, но с более длинным периодом задержки delayPeriod и количеством повторений, равным 1. Так как эта команда находится внутри функции loop, она будет выполняться снова и снова, заставляя светодиод мигать непрерывно.
Цифровые входы
Чтобы извлечь максимум пользы из данного раздела, найдите короткий кусок провода или просто металлическую скрепку.
Загрузите следующий скетч и запустите его:
// sketch 01_03_paperclip
int ledPin = 13;
int switchPin = 7;
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(switchPin, INPUT_PULLUP);
}
void loop()
{
if (digitalRead(switchPin) == LOW)
{
flash(100);
}
else
{
flash(500);
}
}
void flash(int delayPeriod)
{
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
}
Используя кусок провода или выпрямленную скрепку, замкните контакты GND и 7, как показано на рис. 1.13. Это можно делать на включенной плате Arduino, но только после выгрузки в нее скетча. Это связано с тем, что некий предыдущий скетч мог настроить контакт 7 на работу в режиме выхода — в этом случае замыкание на GND может повредить контакт. Так как скетч настраивает контакт 7 на работу в режиме входа, его безопасно соединять с контактом GND.