Светлый фон

Я решил, что будет правильнее написать эту программу, выделив функцию проверки статуса в отдельную… хм… функцию. Я назвал ее checkbutton(), но мог бы назвать как угодно, если только ее название уже не зарезервировано для другой цели.

Вы видите функцию checkbutton() в нижней части листинга 5.3 с предшествующим ей словом void, потому что эта функция не возвращает никакого значения в остальную часть программы.

Слова void checkbutton() – это заголовок функции, после которого, как обычно, в фигурных скобках содержится сама процедура. Эта функция выполняет следующее:

заголовок

• Ждет 50 мс, пока прекратится дребезг контактов.

• Ожидает, пока будет отпущена кнопка.

• Ждет еще 50 мс, пока прекратится дребезг контактов отпущенной кнопки.

• Ждет, пока кнопка будет нажата снова (другими словами, ожидает завершения отпущенного состояния).

• Сбрасывает переменную ignore.

Когда микроконтроллер доходит до конца этой функции, куда он идет дальше? Все просто: он возвращается к строке, расположенной сразу за той, из которой была вызвана функция. Где она? Сразу под функцией сравнения, выше. Так и происходит вызов функции: вы просто указываете ее имя (включая круглые скобки, внутри которых иногда содержатся параметры, хотя в данном случае их нет).

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

Структура программы

Структура программы

Строка, которая начинается с if (millis() > ignore, предназначена для того же, что и Шаг 4 в моем алгоритме, но теперь все работает по-другому. Вместо того чтобы решить, отправлять ли микроконтроллер обратно к началу программы, принимается решение, вызывать ли функцию checkbutton(). Ранее я резюмировал ее логику так: «Если (кнопка не нажата ИЛИ системное время меньше значения ignore), вернуться к Шагу 0». Пересмотренный вариант гласит: «Если превышен период игнорирования кнопки И кнопка нажата, перейти к функции к checkbutton()».

После того как микроконтроллер выполнит это и вернется, он достигнет конца основной функции loop, которая всегда повторяется автоматически.

На самом деле эта программа выполняет только одну задачу. Она выбирает случайные числа и отображает их в виде конфигурации точек снова и снова. Если кнопка нажата, то программа делает паузу и ждет, а когда кнопку нажмут снова, программа продолжает делать то, что делала раньше. Процедура проверки кнопки – всего лишь кратковременный перерыв.