Как сделать цикл в ардуино

Обновлено: 07.07.2024

Также разберем еще один цикл, называемый циклом do while. Цикл do while всегда выполняется по крайней мере один раз, прежде чем будут выполнены какие-либо тесты, которые могут вывести выполнение программы из основного цикла.

Цикл while

Следующий скетч в точности повторяет скетч цикла for из статьи « For цикл в программировании Ардуино «, за исключением того, что в нем используется цикл while, чтобы мы могли видеть сходство между этими двумя циклами.

Цикл while начинается с ключевого слова while, за которым следует тестовое выражение между открывающейся и закрывающейся скобками. Открывающиеся и закрывающиеся фигурные скобки обозначают тело цикла.

Тестовое выражение

Как и в цикле for, в цикле while есть тестовое выражение, которое определяет, будут ли выполняться операторы в цикле или нет. Если тестовое выражение принимает значение истина, то выполняются операторы цикла дальше. Если тестовое выражение принимает значение ложь, операторы цикла не будут выполняться, но будут выполняться операторы, следующие за закрывающейся скобкой цикла, т.е. выполнение продолжается снаружи и ниже цикла.

Инициализация выражения

В цикле for было выражение инициализации как часть цикла. Цикл while может использовать любую переменную из скетча, содержащую допустимое значение. В примере скетча переменная, используемая в цикле (i), должна быть инициализирована при ее определении, иначе она будет содержать любое случайное значение.

Выражение приращения

Выражение приращения использовалось в примерах цикла for, приведенных в предыдущей статье. В примере цикла while выражение приращения помещается в тело цикла.

Как работает цикл while

В примере скетча происходит следующее:

  1. Переменная iинициализируется значением при запуске эскиза.
  2. Цикл while вычисляет тестовое выражение (i
  3. Тестовое выражение принимает значение истина, т.к.i меньше 10.
  4. Поскольку тестовое выражение истинно, операторы в цикле продолжают выполняться.
  5. Текущее значение i отображается, а затем увеличивается.
  6. Когда достигнута нижняя часть цикла, выполнение снова начинается в верхней части цикла.
  7. Тестовое выражение вычисляется снова, и оно снова истинно, поэтому цикл опять выполняется.

Только когда переменная i будет увеличена до 10, выражение цикла примет значение ложь, и цикл будет завершен.

Пример while цикла 2

В приведенном ниже примере скетча, цикл while используется для подсчета чисел до 25, добавляя пять к переменной каждый раз в цикле.


Сегодня руки дошли до того, чтобы оформить свои мысли относительно циклов в очередной пост.
Циклы наряду с операторами выбора являются важнейшими управляющими конструкциями. Основная задача циклов — это многократное повторение определенного набора операторов. Всего циклических конструкции в синтаксисе языка Си три:
while(условие);
do while(условие);
for(инициализация; условие; приращение);

Для большей гибкости управления циклами предусмотрено два оператора:
continue — заставляет программу пропустить все операторы до конца цикла и начать цикл заново;
break — пропустить все операторы до конца цикла и выйти из цикла.

Чтобы увидеть разницу между работой приведенных выше команд и управляющих конструкций, приведу сравнительную блок схему всех трёх циклов.


Между конструкциями while() и do while() принципиальная разница только в том, что тело циклa while() может быть не выполнено ни разу, если условие изначально ложное, а в do while() тело цикла сначала выполнится, а уже потом будет проверяться условие. Цикл for() — это практически программа в программе. В отличие от бейсика в Си этот оператор намного более гибкий.
Инициализация. Обычно в этом блоке происходит объявление типов переменных и присвоение значения им начальных значений. Здесь стоит помнить, что объявленные подобным образом переменные будут действительны только в рамках цикла и после выхода из него их значения будут недоступны. Можно оперировать глобальными переменными, т.е. теми, которые объявлены до функции main. Можно объявить несколько переменных, например:
for(int i=0, t=4;;)
Для этого цикла будут созданы переменные и им будут присвоены соответствующие значения. Самое большое ограничение в такой записи это то, что все объявляемые в заголовке цикла for() переменные, должны быть одного типа. Нельзя, например записать так:
for(int i=0, double t=4;;)
Это приведет к ошибке компиляции.
Условие. Чаще всего в условии переменная сравнивается с какой-то константой или другой переменной с целью выяснить, не пора ли выходить из цикла. Типичный пример for( int i=0; i 27 октября 2016 в 14:04

Сначала приводит A и B , к указанному типу, а потом вычисляет результат A+B .

Приводит указатель A к указанному типу указателя.

Спецификаторы памяти:
(указываются перед типом)

Объявление переменной в виде константы, её можно читать, но нельзя менять, т.к. она хранится в области flash памяти.

Объявление переменной, значение которой может быть изменено без явного использования оператора присвоения =. Используются для работы с прерываниями.

Объявление локальной переменной, значение которой не теряется, между вызовами функции. Если переменная объявлена глобально (вне функций), то её нельзя подключить в другом файле.

Объявление глобальной переменной, которая определена во внешнем файле.

Объявление локальной переменной, значение которой требуется хранить в регистрах процессора, а не в ОЗУ, для обеспечения ускоренного доступа.

Значения некоторых констант:

Ложь, используются вместо 0
Истина, используется вместо 1

Низкий уровень
Высокий уровень

Конфигурация вывода как вход
Конфигурация вывода как выход
Конфигурация вывода как вход с подтяжкой

Передача младшим битом вперёд
Передача старшим битом вперёд

Тактовая частота Arduino в Гц

Число Пи
Половина числа Пи
Два числа Пи
Число Эйлера

Префиксы:

Запись числа в 2ой системе ( 0b 10101)

Запись числа в 2ой системе ( B 10101)

Запись числа в 8ой системе ( 0 12345)

Запись числа в 16ой системе ( 0x 1234A)

Модификаторы:

Число типа long (12345 L )

Число типа long lond (12345 LL )

Число беззнакового типа (12345 U )

Комбинация модификаторов (12345 UL )

Показатель экспоненты (3 E -5 = 3•10-5)

Переменные, массивы, объекты, указатели, ссылки, . :

Это указание имени и типа переменной.
int A; // объявление переменной А

Это выделение памяти под переменную.
A =1; // определение ранее объявленной A

Действуют постоянно, в любом месте кода.

Создаются внутри функций, циклов и т.д.
удаляются из памяти при выходе из них.

Это переменная с указанием класса, вместо типа, через объект можно обращаться к методам класса

Ссылка, это альтернативное имя переменной, она возвращает значение переменной, на которую ссылается.

int A=5; // создана переменная A = 5
int & C=A; // создана ссылка C на переменную A
A++; C++; // в результате A=7 и C=7
// Ссылку нельзя переопределить: &C=Z;

Указатель, это переменная, значением которой является адрес.

int * Y1=&A; // указателю Y1, передан адрес переменной A
int ( * Y2)(int)=F; // указателю Y2, передан адрес функции F
B=Y1; // получаем адрес переменной A из указателя Y1
B= * Y1; // получаем значение A разыменовывая указатель
// Указатель можно переопределять: Y1=&Z;

Создание альтернативного имени для типа

Это переменная состоящая из нескольких однотипных элементов, доступ к значениям которых осуществляется по их индексу.

int A[5]; // объявлен массив A из 5 элементов типа int
int A[2]=; // объявлен и определён массив A из 2 эл-тов
char A[ ]="Hi"; // создана строка A, как массив символов

Это объединение нескольких переменных под одним именем.

Значения некоторых констант:

Ложь, используются вместо 0
Истина, используется вместо 1

Операторы:

Циклы:

for( инициализация ; условие ; приращение )

Инициализация - выполняется однократно. Условие - проверяется перед каждым проходом. Приращение - выполняется после каждого прохода. Код в теле цикла - выполняется, если выполняется условие.

while ( условие )

Условие - проверяется перед каждым проходом. Код в теле цикла - выполняется, если выполняется условие.

do < тело цикла; >while ( условие );

Условие - проверяется после каждого прохода. Код в теле цикла - выполняется, если выполняется условие.

Условные операторы:

if ( условие )

Код в теле оператора - будет выполнен если выполняется условие.

if ( условие ) < тело1; >else

Если условие выполняется, то будет выполнен код тела1, иначе, код тела2.

if ( условие1 ) < тело1; >else if ( условие2 )
Если выполняется условие1, то будет выполнен код тела1, иначе, если выполняется условие2, то будет выполнен код тела2. Можно указать любое количество условий

переменная = условие ? значение1 : значение2 ;

Если условие выполняется, то оператор ?: вернёт значение1, иначе, значение2. Аналог конструкции: if( условие )else

switch (переменная) < // проверяемое значение
case константа1: код; break; // сравнение и код
case константа2: код; break; // сравнение и код
default: код; // не обязательно
>

Будет выполнен весь код, который следует после константы, значение которой совпало с переменной. Если совпадений нет, то выполняется весь код, который следует после, необязательного, ключевого слова default. Оператор break описан ниже.

Прерывающие операторы:

Прерывает выполнение кода, в теле любого цикла или оператора switch . case, завершая его выполнение.

Прерывает выполнение кода в теле любого цикла, но не завершает его выполнение, а переходит к следующему проходу этого цикла.

void функция(параметры)

Прерывает выполнение кода в теле функции и передаёт управление коду, вызвавшему эту функцию. После оператора return можно указать значение, которое вернёт функция.

метка : . код ; . goto метка ;

Прерывает выполнение кода и передаёт управление коду, следующему за меткой.

Получение адреса и разыменование указателя:

B=&C; // значением B станет адрес переменной C.
(взятие адреса) Возвращает адрес переменной или функции, а не значение.

B=*C; // значением B станет значение на которое ссылается указатель C.
(разыменование) Возвращает значение переменной по указателю, а не её адрес.

Директивы:

Арифметические:

Присвоение
int A = 18; // A = 18

Сложение
int A = 18 + 4; // A = 22

Умножение
int A = 18 * 4; // A = 72

Деление
int A = 18 / 4; // A = 4

Остаток от деления
int A = 18 % 4; // A = 2

Операторы сравнения: (возвращают true или false)

Ложь, используются вместо 0
Истина, используется вместо 1

Операторы сравнения: == Если равно bool A = 18 == 4; // A = 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - != Если не равно bool A = 18 != 4; // A = 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Если больше bool A = 18 > 4; // A = 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >= Если больше или равно bool A = 18 >= 4; // A = 1



Продолжим работу со схемой, состоящую из 2-х светодиодов.

Кроме того, мы продолжим работать с кодом, который мы дорабатывали в 14 уроке.


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

Давайте разбираться, как это работает:

int z = 1 ; // объявляем переменную и присваиваем ей значение 1

Serial.println(z); //выводим текущее значение переменной z через последовательный порт

  • Выведение значения переменной через последовательный порт;
  • Увеличение значение переменной на 1 (по-научному – инкрементирование).

Благодаря увеличению значения переменной, в конечном итоге, программа выйдет из цикла. Если, представить на секунду, что мы забыли указать эту строку или произойдёт, какой-то сбой, то программа благополучно зациклится (иными словами зависнет).

Цикл начинает свою работу с того, что проверяет истинность условия. Если, z меньше или равно 10, то программа отрабатывает цикл. Затем следует повторная проверка условия и т.д. Когда значение переменной достигнет z = 11 , условие больше не будет истинным. Программа не отработает цикл и перейдёт в следующую строку, идущую сразу после фигурной скобки цикла.

Достаточно теории, переходим к практике. Заменим циклы for в исходном коде, на циклы while.

Мигалка в исполнении цикла FOR:

digitalWrite (greenLed, HIGH); //включаем зелёный светодиод

digitalWrite (greenLed, LOW); //выключаем зелёный светодиод

Мигалка в исполнении цикла WHILE:

int i=1; //объявляем переменную и присваиваем ей значение 1

digitalWrite(greenLed,HIGH); //включаем зелёный светодиод

digitalWrite(greenLed,LOW); //выключаем зелёный светодиод

Сохраняем программу и загружаем прошивку в контроллер. Смотрим на результат.

Читайте также: