Логические операторы if … else arduino

GPIO

Начнем с пинов, которых больше всего, это GPIO, с англ. General Purpose Input-Output, входы-выходы общего назначения, на плате они подписаны как D0–D13 и A0–A5. По картинке распиновки они называются PD*, PB* и PC*, (вместо звёздочки – цифра) отмечены тёмно-бежевым цветом. Почему “официально” они называются PD/PB/PC? Потому что пины объединены в пОрты по несколько штук (не более 8), на примере Нано есть три порта: D, B и C, соответственно пины так и подписаны: PD3 – Port D 3 – третий выход порта D. Это цифровые пины, способные выдавать логический сигнал (0 или VCC) и считывать такой же логический сигнал. VCC это напряжение питания микроконтроллера, при обычном использовании обычной платы Ардуино это 5 Вольт, соответственно это 5 вольтовая логика: 0V – сигнал низкого уровня (LOW), 5V – высокого уровня (HIGH). Напряжение питания микроконтроллера играет очень большую роль, об этом мы ещё поговорим. GPIO имеют несколько режимов работы: вход (INPUT), выход (OUTPUT) и вход с подтяжкой к питанию встроенным в МК резистором на 20 кОм (INPUT_PULLUP). Подробнее о режимах поговорим в отдельном уроке.

Все GPIO пины в режиме входа могут принять сигнал с напряжением от 0 до 5 вольт (на самом деле до 5.5 вольт, согласно даташиту на микроконтроллер). Отрицательное напряжение или напряжение, превышающее 5.5 Вольт приведёт к выходу пина или даже самого МК из строя. Напряжение 0-2.5 вольта считается низким уровнем (LOW), 2.5-5.5 – высоким уровнем (HIGH). Если GPIO никуда не подключен, т.е. “висит в воздухе”, он принимает случайное напряжение, возникающее из за наводок от сети (провода 220в в стенах) и электромагнитных волн на разных частотах, которыми пронизан современный мир.

GPIO в режиме выхода (OUTPUT) являются транзисторными выходами микроконтроллера и могут выдать напряжение 0 или VCC (напряжение питания МК). Стоит отметить, что микроконтроллер – логическое, а не силовое устройство, его выходы рассчитаны на подачу сигналов другим железкам, а не на прямое их питание. Максимальный ток, который можно снять с GPIO выхода ардуино – 40 мА. Если попытаться снять больше – пин выйдет из строя (выгорит выходной транзистор и всё). Что такое 40 мА? Обычный 5мм одноцветный светодиод потребляет 20 мА, и это практически единственное, что можно питать напрямую от Ардуино. Также не стоит забывать о максимальном токе со всех пинов, он ограничен 200 мА, то есть не более 10 светодиодов можно запитать от платы на полную яркость…

Таймеры (ШИМ)

Выводы таймеров: в микроконтроллере, помимо обычного вычислительного ядра, с которым мы работаем, находятся также “хардварные” счётчики, работающие параллельно со всем остальным железом. Эти счётчики также называют таймерами, хотя к таймерам они не имеют никакого отношения: счётчики буквально считают количество тиков, которые делает кварцевый генератор, задающий частоту работы для всей системы. Зная частоту генератора (обычно 16 МГц) можно с очень высокой точностью определять интервалы времени и делать что-то на этой основе. Какой нам прок от этих счётчиков? “Из коробки” под названием Arduino IDE мы имеем несколько готовых, основанных на таймерах инструментов (функции времени, задержек, измерения длин импульсов и другие).

В этой статье речь идёт о пинах и выходах, о них и поговорим: у каждого счётчика есть два выхода на GPIO. У нано (у МК ATmega328p) три счётчика, соответственно 6 выходов. Одной из возможностей счётчиков является генерация ШИМ сигнала, который и выводится на соответствующие GPIO. Для нано это D пины 5 и 6 (счётчик 0), 9 и 10 (таймер 1) и 3 и 11 (таймер 2). ШИМ сигналу посвящен отдельный урок, сейчас просто запомним, что с его помощью можно управлять яркостью светодиодов, скоростью вращения моторчиков, мощностью нагрева спиралей и многим другим. Но нужно помнить, что ограничение по току в 40 мА никуда не делось и питать от пинов ничего мощнее светодиодов нельзя.

Важные страницы

  • Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress у проверенных продавцов
  • Подборка библиотек для Arduino, самых интересных и полезных, официальных и не очень
  • Полная документация по языку Ардуино, все встроенные функции и макро, все доступные типы данных
  • Сборник полезных алгоритмов для написания скетчей: структура кода, таймеры, фильтры, парсинг данных
  • Видео уроки по программированию Arduino с канала “Заметки Ардуинщика” – одни из самых подробных в рунете
  • Поддержать автора за работу над уроками
  • Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту (alex@alexgyver.ru)

Запись/чтение регистра

Существует несколько способов установки битов в регистрах. Мы рассмотрим их все, чтобы столкнувшись с одним из них вы знали, что это вообще такое и как работает данная строчка кода. Абсолютно вся работа с регистрами заключается в установке нужных битов в нужном байте (в регистре) в состояние 0 или 1. Рекомендую прочитать урок по битовым операциям, в котором максимально подробно разобрано всё, что касается манипуляций с битами.

Давайте вернёмся к регистру таймера, который я показывал выше, и попробуем его сконфигурировать. Первый способ, это явное задание всего байта сразу, со всеми единицами и нулями. Сделать это можно так:

TCCR1B = 0b01010101

Таким образом мы включили и выключили нужные биты сразу, одним махом. Как вы помните из урока о типах данных и чисел, микроконтроллеру всё равно, в какой системе исчисления вы с ним работаете, то есть число у нас в двоичной системе, в десятичной это будет , а в шестнадцатеричной – . И вот эти три варианта абсолютно одинаковы с точки зрения результата:

TCCR1B = 0b01010101;
TCCR1B = 85;
TCCR1B = 0x55;

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

Гораздо чаще бывает нужно “прицельно” изменить один бит в байте, и тут на помощь приходят логические (битовые) функции и макросы. Рассмотрим все варианты, во всех из них это байт-регистр, и это номер бита, считая с правого края. То есть BIT это цифра от 0 до 7, либо название бита из даташита.

Установка бита в 1 Установка бита в 0 Описание
Использование битового сдвига <<
Используем 2 в степени <номер бита> (пример не рабочий!)
Используем ардуиновский макрос bit(), заменяющий сдвиг
Используем встроенную функцию _BV(), опять же аналог сдвига
Используем общепринятые макросы sbi и cbi
Используем ардуиновские функции bitSet() и bitClear()

Что хочу сказать по перечисленным вариантам: они все по сути являются одним и тем же, а именно – первым, просто обёрнуты в другие функции и макросы. Время выполнения всех вариантов одинаково, т.к. макро-функции не делают лишних действий, а приводят все способы к первому, со сдвигом и и . Все эти способы вы можете встретить в скетчах из интернета, это факт. Лично мне больше всего нравится ардуиновский bitSet и bitClear, потому что они имеют читаемое название и заранее сидят в библиотеке. Что касается и – то для их использования нужно в самом начале документа создать макросы:

#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) 
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

И после этого можно пользоваться и . 

Давайте рассмотрим пример, где просто подёргаем разными способами:

// для использования sbi и cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

void setup() {
  TCCR1B = 0;             // обнулили регистр
  bitSet(TCCR1B, CS11);   // включили бит №1
  cbi(TCCR1B, CS11);      // вЫключили бит №1
  TCCR1B |= _BV(4);       // включили бит №4
  TCCR1B |= (1 << WGM12); // включили бит №3
  TCCR1B &= ~_BV(WGM13);  // вЫключили бит №4
  bitClear(TCCR1B, 3);    // вЫключили бит №3
}

Можно ещё добавить вариант, где в одной строчке можно “прицельно” установить несколько битов:

void setup() {
  TCCR1B = 0;  // обнулили регистр
  // ставим бит 1, 3 и 4(WGM13)
  TCCR1B |= _BV(1) | _BV(3) | _BV(WGM13);
}

Я думаю тут всё понятно, давайте теперь попробуем “прицельно” прочитать бит  из регистра:

Чтение бита Описание
Вручную через сдвиг
Ардуиновская макро-функция

Два рассмотренных способа возвращают 0 или 1 в зависимости от состояния бита. Пример:

void setup() {
  TCCR1B = 0;             // обнулили регистр
  bitSet(TCCR1B, CS12);   // включили бит №2
  Serial.begin(9600);     // открыли порт
  Serial.println(bitRead(TCCR1B, 2)); // получили 1
}

Ещё больше примеров работы с битами смотри в предыдущем уроке по битовым операциям.

Вкладка “Инструменты”

Вкладка “Инструменты”

  • АвтоФорматирование – выравнивает код по табуляции. Крайне важная фишка, используйте её и комбинацию Ctrl+T как можно чаще
  • Архивировать скетч – сохраняет скетч как .zip архив
  • Исправить кодировку и перезагрузить – полезная штука, когда скачал чей-то код из интернета, а там поехала кодировка
  • Управлять библиотеками… – открывает менеджер библиотек, из которого можно установить библиотеки из официального списка 
  • Монитор порта
  • Плоттер по последовательному соединению – встроенный построитель графиков по идущим в порт данным
  • Плата – выбор платы, куда хотим загрузить прошивку
  • Процессор – выбор процессора, который стоит на плате. Обычно он один на выбор, но иногда есть варианты
  • Порт – COM порт, к которому подключена плата. Это всегда порт, отличный от COM1 (системный порт)
  • Программатор – выбор программатора для загрузки кода через программатор
  • Записать загрузчик – прошивает загрузчик, соответствующий выбранной плате и процессору в микроконтроллер при помощи программатора (который ISP)

Строки

// ====== СТРОКИ STRING ======
// полный урок тут: https://alexgyver.ru/lessons/strings/

String string0 = "Hello String";              // заполняем словами в кавычках
String string1 = String("lol ") + String("kek");  // сумма двух строк
String string2 = String('a');                 // строка из символа в одинарных кавычках
String string3 = String("This is string");    // конвертируем строку в String
String string4 = String(string3 + " more");   // складываем строку string3 с текстом в кавычках
String string5 = String(13);                  // конвертируем из числа в String
String string6 = String(20, DEC);             // конвертируем из числа с указанием базиса (десятичный)
String string7 = String(45, HEX);             // конвертируем из числа с указанием базиса (16-ричный)
String string8 = String(255, BIN);            // конвертируем из числа с указанием базиса (двоичный)
String string9 = String(5.698, 3);            // из float с указанием количества знаков после запятой (тут 3)

// длина строки
String textString = "Hello";
sizeof(textString);   // вернёт 6
textString.length();  // вернёт 5
// полный набор инструментов String тут https://alexgyver.ru/lessons/strings/

// ====== МАССИВЫ СИМВОЛОВ ======
// объявить массив текста длиной 6 символов
// и задать текст
char helloArray[] = "Hello!";

// объявить массив текста длиной 100 символов
// и задать в его начало текст
char textArray = "World";

// длина строки
char textArray = "World";
sizeof(textArray);  // вернёт 100
strlen(textArray);  // вернёт 5

Какие ещё языки используют для Arduino

Но чу! Под Arduino мож­но писать и на дру­гих языках!

С. Как и С++, Си лег­ко мож­но исполь­зо­вать для про­грам­ми­ро­ва­ния мик­ро­кон­трол­ле­ров Arduino. Толь­ко если С++ не тре­бу­ет ника­ких допол­ни­тель­ных про­грамм, то для С вам пона­до­бит­ся , что­бы пра­виль­но пере­ве­сти код в язык, понят­ный кон­трол­ле­рам AVR.

Python. Было бы стран­но, если бы тако­му уни­вер­саль­но­му язы­ку не нашлось при­ме­не­ния в робо­то­тех­ни­ке. Берё­те биб­лио­те­ки PySerial и vPython, при­кру­чи­ва­е­те их к Python и готово!

Java. Прин­цип такой же, как в Python: берё­те биб­лио­те­ки для рабо­ты с пор­та­ми и кон­трол­ле­ра­ми и мож­но начи­нать программировать.

HTML. Это, конеч­но, совсем экзо­ти­ка, но есть про­ек­ты, кото­рые застав­ля­ют HTML-код рабо­тать на Arduino.

А вооб­ще Arduino рабо­та­ет на кон­трол­ле­рах AVR, и про­шить их мож­но любым кодом, кото­рый ском­пи­ли­ро­ван под это желе­зо. Всё, что вам нуж­но — най­ти биб­лио­те­ку для ваше­го люби­мо­го язы­ка, кото­рая пре­об­ра­зу­ет нуж­ные коман­ды в машин­ный код для AVR.

Главное — алгоритмы

Любой робот — это один боль­шой алго­ритм. Что­бы научить­ся думать как про­грам­мист и писать свои алго­рит­мы с нуля, при­хо­ди­те в Практикум. 
Попробовать

Преобразование типов данных

В Ардуино преобразование переменной — это приведение значение переменной к другому типу. Например, требуется в программе преобразовать тип данных byte в тип данных int. Для этого требуется указать нужный тип переменной в скобках перед преобразуемой переменной — результат вернет переменную с новым типом данных. Приведем пример явного преобразования типа данных (переменных) Ардуино:

byte x = 150;
int y = (int)x;
// в переменную y будет записано значение переменной x, приведенной к типу byte
float x = 15,4;
int y = (int)x;
// в переменную y будет записано значение x, приведенной к целочисленному значению
// переменная будет округлена до 15

Заключение. Знание типов переменных поможет правильно использовать объем памяти в плате Arduino, что поможет работать микроконтроллеру намного быстрее и эффективнее. Использование переменных позволяет не запоминать какое-либо значение, для этого достаточно обратиться к ячейке памяти по заданному имени.

Случайный bool

Иногда бывает нужен случайный флаг, то есть /. Делается это очень просто: в уроке про условия я рассказывал, что () принимает при любом отличном от нуля значении. Это можно использовать для получения случайного / с заданной вероятностью! Просто присваиваем логической переменной результат функции , в которую передаём число, обратное вероятности получения :

bool rndFlag = random(5);

Переменная получит значение с вероятностью 1/5, то есть 20%. Если нужен с низкой вероятностью – используем инверсию:

bool rndFlag = !random(10);

Теперь переменная получит значение с вероятностью 10%.

Интерфейс

Сначала рассмотрим общий вид программы, т.е. как она выглядит после запуска. В самом центре – блокнот, то самое место, где пишется код. По умолчанию уже написаны два стандартных блока, setup и loop. К ним вернёмся в разделе уроков программирования. Всё остальное можно увидеть на скриншоте ниже.

  • Проверить – компиляция (сборка, проверка на ошибки…) кода без его загрузки в плату. То есть код можно написать и проверить на ошибки даже не подключая плату к компьютеру
  • Загрузить – компиляция и загрузка прошивки в плату
  • Создать/открыть/сохранить – тут всё понятно
  • Монитор порта – кнопка открывает монитор последовательного пора для общения с платой
  • Меню вкладок – работа с вкладками, о них поговорим ниже
  • Текущее состояние – тут выводится краткая информация о последнем действии: загрузка завершена, ошибка загрузки, автоформатирование завершено и т.д.
  • Лог работы – тут выводится лог компиляции и вообще все системные сообщения, отчёты об ошибках и размере скомпилированного кода
  • Конфигурация оборудования – выводится название выбранной платы, версии микроконтроллера и номер выбранного COM порта

Arduino IDE

Пробежимся по пунктам меню, которые я считаю первостепенно важными, с остальными можно познакомиться самостоятельно по ходу работы с программой. Версия моей IDE – 1.8.8, в новых что-то может отличаться

Цикл for

Цикл , в простонародии счётчик, в различных видах этот цикл есть и в других языках программирования, но на C++ он имеет очень гибкую настройку. При создании цикл принимает три “значения” (настройки): инициализация, условие и изменение. Цикл for обычно содержит переменную, которая изменяется на протяжении работы цикла, мы можем пользоваться её меняющимся значением в своих целях. Переменная является локальной для цикла, если она создаётся при инициализации.

  • Инициализация – здесь обычно присваивают начальное значение переменной цикла. Например:
  • Условие – здесь задаётся условие, при котором выполняется цикл. Как только условие нарушается, цикл завершает работу. Например:
  • Изменение – здесь указывается изменение переменной цикла на каждой итерации. Например:

Объединим три предыдущих пункта в пример:

for (int i = 0; i < 100; i++) {
  // тело цикла
}

В теле цикла мы можем пользоваться значением переменной , которая примет значения от 0 до 99 на протяжении работы цикла, после этого цикл завершается. Как это использовать? Вспомним предыдущий урок про массивы и рассмотрим следующий пример:

// создадим массив на 100 ячеек
byte myArray;

for (int i = 0; i < 100; i++) {
  // заполним все ячейки значением 25
  myArray = 25;
}

Именно при помощи цикла очень часто работают с массивами. Можно, например, сложить все элементы массива для поиска среднего арифметического:

// создадим массив данных
byte myVals[] = {5, 60, 214, 36, 98, 156};

// переменная для хранения суммы
// обязательно инициализируем в 0
int sum = 0;

for (int i = 0; i < 6; i++) {
  // суммируем весь массив в sum
  sum += myVals;
}

// разделим sum на количество элементов
// и получим среднее арифметическое!
sum /= 6;

// получилось 94!

Что касается особенностей использования в языке C++: любая его настройка является необязательной, то есть её можно не указывать для каких-то особенных алгоритмов. Например вы не хотите создавать переменную цикла, а использовать для этого другую имеющуюся переменную. Пожалуйста! Но не забывайте, что разделители настроек (точка с запятой) обязательно должны присутствовать на своих местах, даже если настроек нет!

// есть у нас какая-то переменная
int index = 0;

for (; index < 60; index += 10) {
  // переменная index принимает значения
  // 0, 10, 20, 30, 40, 50
}

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

// объявить i и j
// прибавлять i+1 и j+2
for (byte i = 0, j = 0; i < 10; i++, j += 2) {
  // тут i меняется от 0 до 9
  // и j меняется от 0 до 18
}

Также в цикле может вообще не быть настроек, и такой цикл можно считать вечным, замкнутым:

for (;;) {
  // выполняется вечно...
}

Использование замкнутых циклов не очень приветствуется, но иногда является очень удобным способом поймать какое-то значение, или дать программе “зависнуть” при наступлении ошибки. Но, как мы знаем, нет ничего вечного, поэтому из цикла таки можно выйти при помощи оператора .

Первая прошивка

Итак, разобрались со средой разработки, теперь можно загрузить первую прошивку. Можно загрузить пустую прошивку, чтобы просто убедиться, что все драйвера установились и платы вообще прошиваются. Рекомендуется делать это с новой платой, к которой никогда не подключались датчики и модули, чтобы исключить выход платы из строя по вине пользователя.

1. Плата подключается к компьютеру по USB, на ней должны замигать светодиоды. Если этого не произошло:

  • Неисправен USB кабель
  • Неисправен USB порт компьютера
  • Неисправен USB порт Arduino
  • Попробуйте другой компьютер, чтобы исключить часть проблем из списка
  • Попробуйте другую плату (желательно новую), чтобы исключить часть проблем из списка
  • На плате Arduino сгорел входной диод по линии USB из-за короткого замыкания, устроенного пользователем при сборке схемы
  • Плата Arduino сгорела полностью из-за неправильного подключения пользователем внешнего питания или короткого замыкания

2. Компьютер издаст характерный сигнал подключения нового оборудования, а при первом подключении появится окошко “Установка нового оборудования”. Если этого не произошло:

  • См. предыдущий список неисправностей
  • Кабель должен быть data-кабелем, а не “зарядным”
  • Кабель желательно втыкать напрямую в компьютер, а не через USB-хаб
  • Не установлены драйверы Arduino (во время установки IDE или из папки с программой), вернитесь к установке.

3. В списке портов (Arduino IDE/Инструменты/Порт) появится новый порт, обычно COM3. Если этого не произошло:

  • См. предыдущий список неисправностей
  • Некорректно установлен драйвер CH341 из предыдущего урока
  • Если список портов вообще неактивен – драйвер Arduino установлен некорректно, вернитесь к установке
  • Возникла системная ошибка, обратитесь к знакомому компьютерщику

4. Выбираем свою плату. Если это Arduino Nano, выбираем в Инструменты\Плата\Arduino Nano. Если другая – выбираем другую. Нажимаем стрелочку в левом верхнем углу (загрузить прошивку). Да, загружаем пустую прошивку.

Если появилась надпись “Загрузка завершена” – значит всё в порядке и можно прошивать другие скетчи. В любом случае на вашем пути встретятся другие два варианта событий, происходящих после нажатия на кнопку “Загрузка” – это ошибка компиляции и ошибка загрузки. Вот их давайте рассмотрим более подробно.

Beaglebone Black

Составные операторы

Предположим, что переменная A содержит 10, а переменная B содержит 20, тогда —

Имя оператора Оператор простой Описание пример
приращение ++ Оператор приращения, увеличивает целочисленное значение на единицу А ++ даст 11
декремент Оператор уменьшения, уменьшает целочисленное значение на единицу А— даст 9
сложное добавление + = Добавить И оператор присваивания. Добавляет правый операнд к левому операнду и присваивает результат левому операнду B + = A эквивалентно B = B + A
вычитание именованных чисел знак равно Вычитание И оператор присваивания. Вычитает правый операнд из левого операнда и присваивает результат левому операнду B — = A эквивалентно B = B — A
сложное умножение знак равно Оператор умножения И присваивания. Он умножает правый операнд на левый операнд и присваивает результат левому операнду B * = A эквивалентно B = B * A
сложное деление знак равно Оператор деления И присваивания. Он делит левый операнд на правый операнд и присваивает результат левому операнду B / = A эквивалентно B = B / A
составной модуль знак равно Модуль И оператор присваивания. Он принимает модуль с использованием двух операндов и присваивает результат левому операнду B% = A эквивалентно B = B% A
соединение поразрядно или | = побитовое ИЛИ и оператор присваивания A | = 2 — это то же самое, что A = A | 2
соединение поразрядно и знак равно Побитовый оператор И A & = 2 совпадает с A = A & 2

Управляющие операторы

if

Конструкция if проверяет, верно ли некоторое условие и если оно верно, то она выполняет определенный код. Существует два основных вида использования этого оператора — со скобками и без.

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

В качестве условия может быть константа, переменная, вызов функции или выражение:

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

Оператор if имеет также расширенный вид if..else, который также может использоваться со скобками и без:

В случае, если условие вернет true, будет выполнен код, следующий после if, а в случае, если вернет значение false, будет выполнен код после else.

И последний вид оператора такой:

В случае выполнения первого условия будет выполнен лишь код1 и далее условия проверяться не будут. В случае невыполнения первого условия будет проверено второе условие и в случае его выполнения выполнен только код2. В случае не выполнения первого и второго условий будет проверено третье условие и если оно верно, будет выполнен только код3. И наконец в случае невыполнения всех трех условий будет выполнен код4.

switch case

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

В данном примере в зависимости от значения переменной variable будет выполнен разный код: если ее значение равно 1, то будет выполнен код1, если 10 — то код2, если 15 — то код3, а если любое другое значение — код4.

Ключевое слово break позволяет после выполнения соответствующего кода сразу выйти из всей конструкции switch.

for

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

В круглых скобках после ключевого слова for идет 3 выражения, разделенных точкой с запятой, а после в фигурных скобках — код, который требуется повторить.

Первое выражение — это инициализация переменной, являющейся счетчиком цикла. Выполняется оно только 1 раз и в нем переменной присваивается начальное значение.

Второе выражение — это условие. Пока это условие возвращает true, код в фигурных скобках будет повторяться. Истинность условия проверяется перед каждом проходе цикла и как только оно становится ложным, цикл прерывается.

Третье выражение — это блок для изменения значение переменной (счетчика) цикла. Вызывается каждый раз после выполнения повторяющегося кода.

Пример: нужно 10 раз моргнуть светодиодом:

Здесь переменная счетчика — i, которая инициализируется значением ноль, после чего ее значение увеличивается. Повторяющийся код будет выполняться до тех пор, пока значение счетчика меньше 10.

while

Для повторения одного и того же кода иногда бывает неудобно использовать оператор цикла for. Например, когда не нужен счетчик. Для этого есть еще один оператор цикла — while.

Код в фигурных скобках будет выполняться до тех пор, пока переменная/функция/выражение в круглых скобках возвращает истину.

Допустим, нам нужно, чтобы машинка ехала вперед до тех пор, пока датчик не зафиксирует впереди препятствие:

Тут функция sensorNotDetectWall() возвращает true в случае, если впереди нет стены, а функция move() включает двигатель машинки на определенное количество секунд.

Язык Arduino

Если опыт­ный про­грам­мист посмот­рит на код для Arduino, он ска­жет, что это код на C++. Это неда­ле­ко от исти­ны: основ­ная логи­ка Арду­и­но реа­ли­зо­ва­на на C++, а свер­ху на неё надет фрейм­ворк Wiring, кото­рый отве­ча­ет за обще­ние с железом.

На это есть несколь­ко причин:

  1. У С++ сла­ва «слиш­ком слож­но­го язы­ка». Arduino пози­ци­о­ни­ру­ет­ся как мик­ро­кон­трол­ле­ры и робо­то­тех­ни­ка для начи­на­ю­щих, а начи­на­ю­щим ино­гда труд­но объ­яс­нить, что С++ не такой уж слож­ный для стар­та. Про­ще сде­лать фрейм­ворк и назвать его отдель­ным языком.
  2. В чистом С++ нет удоб­ных команд для AVR-контроллеров, поэто­му нужен был инстру­мент, кото­рый возь­мёт на себя все слож­ные функ­ции, а на выхо­де даст про­грам­ми­сту часто исполь­зу­е­мые команды.
  3. Раз­ра­бот­чи­ки дали про­грам­ми­стам про­сто писать нуж­ные им про­грам­мы, а все слу­жеб­ные коман­ды, необ­хо­ди­мые для пра­виль­но­го оформ­ле­ния кода на С++, взя­ла на себя спе­ци­аль­ная сре­да разработки.

Сре­да раз­ра­бот­ки (IDE) Arduino. 

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий