Не равно arduino ide
Сначала приводит A и B , к указанному типу, а потом вычисляет результат A+B .
Приводит указатель A к указанному типу указателя.
Видео
if, используется в сочетании с операторами сравнения, проверяет, достигнута ли истинность условия, например, превышает ли входное значение заданное число. Формат оператора if следующий:
Программа проверяет, значение someVariable больше чем 50 или нет. Если да, то выполняются определенные действия. Говоря иначе, если выражение в круглых скобках истинно, выполняются операторы внутри фигурных скобок. Если нет, программа пропускает этот код.
Скобки после оператора if могут быть опущены. Если так сделано, только следующая строка (обозначенная точкой с запятой) становится оператором, выполняемым в операторе if.
Выражения, которые вычисляются внутри круглых скобок, могут состоять из одного или нескольких операторов.
Операторы сравнения
x != y (x не равно y)
x > y (x больше чем y)
x >= y (x больше чем или равно y)
Следите, чтобы случайно не использовать знак простого равенства (например, if (x = 10)). Знак простого равенства – это оператор присваивания, и устанавливает значение х равное 10 (заносит значение 10 в переменную х). Вместо этого используйте знак двойного равенства (например, if (x == 10)), который является оператором сравнения и проверяет, х равен 10 или нет. Последнее из двух выражений будет истинно, только если х равен 10, но предыдущее выражение всегда верно.
Это связано с тем, что С вычисляет выражение if (x=10) следующим образом: значение 10 присваивается х (помним, что простой знак равенства – это оператор присваивания), таким образом, х теперь равен 10. Затем условный if вычисляет 10, которое уже равно ИСТИНА, так как любое число, неравное 0, равно ИСТИНА. Поэтому if (x=10) будет всегда иметь логическое значение ИСТИНА, которое не является желательным результатом, когда используется оператор if. Вдобавок, переменной х будет присвоено значение 10, что также не является желаемым действием.
If также может быть частью разветвленной управляющей конструкции с использованием if. else
Язык программирования устройств Ардуино основан на C/C++. Он прост в освоении, и на данный момент Arduino — это, пожалуй, самый удобный способ программирования устройств на микроконтроллерах.
Базовые и полезные знания, необходимые для успешного программирования под платформу Arduino:
- Начало работы с Arduino в Windows
- Работа с Arduino Mini
- Цифровые выводы
- Аналоговые входы
- Широтно-импульсная модуляция
- Память в Arduino
- Использование аппаратных прерываний в Arduino
- Перепрошивка контроллера Atmega8U2 для Arduino Uno и Mega2560
- Переменные
- Функции
- Создание библиотек для Arduino
- Использование сдвигового регистра 74HC595 для увеличения количества выходов
- Прямое управления выходами через регистры микроконтроллера Atmega
Справочник языка Ардуино
Язык Arduino можно разделить на три раздела:
Сравнение float
Со сравнением float чисел всё не так просто из за особенности самой модели “чисел с плавающей точкой” – вычисления иногда производятся с небольшой погрешностью, из за этого сравнение может работать неверно! Пример из урока про вычисления:
Будьте внимательны при сравнении float чисел, особенно со строгими операциями
Спецификаторы памяти:
(указываются перед типом)
Объявление переменной в виде константы, её можно читать, но нельзя менять, т.к. она хранится в области flash памяти.
Объявление переменной, значение которой может быть изменено без явного использования оператора присвоения =. Используются для работы с прерываниями.
Объявление локальной переменной, значение которой не теряется, между вызовами функции. Если переменная объявлена глобально (вне функций), то её нельзя подключить в другом файле.
Объявление глобальной переменной, которая определена во внешнем файле.
Объявление локальной переменной, значение которой требуется хранить в регистрах процессора, а не в ОЗУ, для обеспечения ускоренного доступа.
Переменные, массивы, объекты, указатели, ссылки, . :
Это указание имени и типа переменной.
int A; // объявление переменной А
Это выделение памяти под переменную.
A =1; // определение ранее объявленной A
Действуют постоянно, в любом месте кода.
Создаются внутри функций, циклов и т.д.
удаляются из памяти при выходе из них.
Указывается в одинарных кавычках.
char A=' Z '; // присвоение символа «Z»
Указывается в двойных кавычках.
String A ; // присвоение строки «XY»
Это переменная с указанием класса, вместо типа, через объект можно обращаться к методам класса
Ссылка, это альтернативное имя переменной, она возвращает значение переменной, на которую ссылается.
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;
Создание альтернативного имени для типа
typedef bool dbl; // создаём свой тип «dbl», как тип bool
dbl A=1; // создаём переменную A типа bool
Это переменная состоящая из нескольких однотипных элементов, доступ к значениям которых осуществляется по их индексу.
int A[5]; // объявлен массив A из 5 элементов типа int
int A[2]=; // объявлен и определён массив A из 2 эл-тов
char A[ ]="Hi"; // создана строка A, как массив символов
Это объединение нескольких переменных под одним именем.
struct < int A=5; float B=3; >C; // создана структура «С»
int D = C.A; // получаем значение переменной A структуры С
int Z = C.A; // присваиваем Z значение A структуры С
Директивы:
Сравнение
Два числа можно сравнить при помощи операторов сравнения:
- == равенство ( a == b )
- != неравенство ( a != b )
- >= больше или равно ( a >= b )
- > больше ( a > b )
- < меньше ( a < b )
В рассмотренных выше абстрактных примерах с a и b мы получаем логическое значение, которое является результатом сравнения чисел. Пусть a = 10 и b = 20 , тогда скобка (a > b) вернёт значение false , потому что a меньше b . А вот (a != b) вернёт true , т.к. а действительно не равно b .
Для связи нескольких логических величин используются логические операторы:
- ! логическое НЕ, отрицание. Есть аналог – оператор not
- && логическое И. Есть аналог – оператор and
- || логическое ИЛИ. Есть аналог – оператор or
Получение адреса и разыменование указателя:
B=&C; // значением B станет адрес переменной C.
(взятие адреса) Возвращает адрес переменной или функции, а не значение.
B=*C; // значением B станет значение на которое ссылается указатель C.
(разыменование) Возвращает значение переменной по указателю, а не её адрес.
Данные
Константы
- HIGH | LOW
- INPUT | OUTPUT
- true | false
- Целочисленные константы
- Константы с плавающей запятой
Типы данных
Преобразование типов данных
Область видимости переменных и квалификаторы
Операторы:
Значения некоторых констант:
Ложь, используются вместо 0
Истина, используется вместо 1
Операторы сравнения: (возвращают 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
В языке C++ есть такое понятие, как логическая величина, которая принимает два значения: правда и ложь, true и false , 1 и 0. Для хранения логических величин у нас есть тип данных boolean ( bool ), который может принимать значения 0 ( false ) или 1 ( true ). Логические переменные часто называют флагами: если переменная равна true – флаг поднят, если false – опущен.
Условный оператор if
Условный оператор if (англ. “если”) позволяет разветвлять выполнение программы в зависимости от логических величин, т.е. результатов работы операторов сравнения и логических переменных.
Оператор else (англ. “иначе”) работает в паре с оператором if и позволяет предусмотреть действие на случай невыполнения if :
Также есть третья конструкция, позволяющая ещё больше разветвить код, называется она else if :
Посмотрим на все эти операторы в действии в большом примере:
Оператор if позволяет управлять программой и создавать разветвлённые действия в зависимости от разных условий. Обратите внимание на последний блок в примере выше, там где используется else if для выбора действия в зависимости от значения одной и той же переменной. Существует оператор выбора switch , позволяющий сделать код более красивым. О нём поговорим чуть ниже.
Прерывающие операторы:
Прерывает выполнение кода, в теле любого цикла или оператора switch . case, завершая его выполнение.
Прерывает выполнение кода в теле любого цикла, но не завершает его выполнение, а переходит к следующему проходу этого цикла.
void функция(параметры)
Прерывает выполнение кода в теле функции и передаёт управление коду, вызвавшему эту функцию. После оператора return можно указать значение, которое вернёт функция.
метка : . код ; . goto метка ;
Прерывает выполнение кода и передаёт управление коду, следующему за меткой.
Операторы
Управляющие операторы
Синтаксис
Арифметические операторы
- = (assignment)
- + (addition)
- - (subtraction)
- * (multiplication)
- / (division)
- % (modulo)
Операторы сравнения
- == (equal to)
- != (not equal to)
- <(less than)
- > (greater than)
- <=(less than or equal to)
- >= (greater than or equal to)
Логические операторы
Унарные операторы
- ++ (increment)
- -- (decrement)
- += (compound addition)
- -= (compound subtraction)
- *= (compound multiplication)
- /= (compound division)
Особенность bool
В уроке о типах данных я упоминал о том, что bool принимает значение true , если присвоить ему отличное от нуля число, то есть оператору if можно скормить любое число, и он вернёт true в любом случае, кроме нуля. Это бывает удобно в некоторых случаях, но также может и приводить к ошибкам, которые трудно отловить. if (50) <> – код в фигурных скобках будет выполнен.
Арифметические:
Присвоение
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
Функции
Цифровой ввод/вывод
Аналоговый ввод/вывод
Дополнительные фунции ввода/вывода
Работа со временем
Математические функции
Тригонометрические функции
Генераторы случайных значений
Внешние прерывания
Функции передачи данных
Библиотеки Arduino
Servo — библиотека управления сервоприводами.
EEPROM — чтение и запись энергонезависимой памяти микроконтроллера.
SPI — библиотека, реализующая передачу данных через интерфейс SPI.
Stepper — библиотека управления шаговыми двигателями.
Конструкция 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 идет 3 выражения, разделенных точкой с запятой, а после в фигурных скобках - код, который требуется повторить.
Первое выражение - это инициализация переменной, являющейся счетчиком цикла. Выполняется оно только 1 раз и в нем переменной присваивается начальное значение.
Второе выражение - это условие. Пока это условие возвращает true , код в фигурных скобках будет повторяться. Истинность условия проверяется перед каждом проходе цикла и как только оно становится ложным, цикл прерывается.
Третье выражение - это блок для изменения значение переменной (счетчика) цикла. Вызывается каждый раз после выполнения повторяющегося кода.
Пример: нужно 10 раз моргнуть светодиодом:
Здесь переменная счетчика - i , которая инициализируется значением ноль, после чего ее значение увеличивается. Повторяющийся код будет выполняться до тех пор, пока значение счетчика меньше 10.
while
Для повторения одного и того же кода иногда бывает неудобно использовать оператор цикла for . Например, когда не нужен счетчик. Для этого есть еще один оператор цикла - while .
Код в фигурных скобках будет выполняться до тех пор, пока переменная/функция/выражение в круглых скобках возвращает истину.
Допустим, нам нужно, чтобы машинка ехала вперед до тех пор, пока датчик не зафиксирует впереди препятствие:
Тут функция sensorNotDetectWall() возвращает true в случае, если впереди нет стены, а функция move() включает двигатель машинки на определенное количество секунд.
Спецификаторы памяти:
(указываются перед типом)
Объявление переменной в виде константы, её можно читать, но нельзя менять, т.к. она хранится в области flash памяти.
Объявление переменной, значение которой может быть изменено без явного использования оператора присвоения =. Используются для работы с прерываниями.
Объявление локальной переменной, значение которой не теряется, между вызовами функции. Если переменная объявлена глобально (вне функций), то её нельзя подключить в другом файле.
Объявление глобальной переменной, которая определена во внешнем файле.
Объявление локальной переменной, значение которой требуется хранить в регистрах процессора, а не в ОЗУ, для обеспечения ускоренного доступа.
ВАЖНОЕ ЗАМЕЧАНИЕ
Нужно быть крайне внимательным при работе с оператором switch , потому что код, находящийся внутри фигурных скобок switch() < >, является одним блоком кода для всех кейсов. Соответственно кейсы case – всего лишь ярлыки перехода между участками этого блока. Почему это так важно: все кейсы находятся в одной области видимости, то есть внутри switch не могут быть объявлены локальные переменные с одинаковыми именами:
Более того, крайне не рекомендуется создавать локальные переменные внутри кейсов, так как это может сломать код!
Что делать, если очень хочется? Обернуть содержимое кейса в блок при помощи фигурных скобок:
Тернарный оператор ?
Оператор знак вопроса ? , или тернарный оператор, является более коротким аналогом для записи конструкции if else . Действие с оператором ? имеет следующий вид:
условие ? выражение1 : выражение2
Это работает так: вычисляется условие, если оно истинно, то всё действие возвращает значение выражения 1, а если оно ложно, то всё действие возвращает значение выражения 2. Пример:
Аналогичная конструкция на if-else
Ещё вариант с вычислением:
Аналогичным образом можно использовать оператор ? для вывода данных и текста в последовательный порт (подробнее о нём в другом уроке):
Важный момент: если результат присваивается или передаётся в функцию, тип данных должен быть одинаковый! То есть код Serial.println((a > 9) ? 9 : "меньше 9"); приведёт к ошибке, так как мы пытаемся передать или int или char* , что не будет работать.
Также можно получать значения из функций, если они имеют одинаковый возвращаемый тип данных:
А можно ли сделать на операторе ? более сложную конструкцию, типа else if ? Можно!
Циклы:
for( инициализация ; условие ; приращение )
Инициализация - выполняется однократно. Условие - проверяется перед каждым проходом. Приращение - выполняется после каждого прохода. Код в теле цикла - выполняется, если выполняется условие.
while ( условие )
Условие - проверяется перед каждым проходом. Код в теле цикла - выполняется, если выполняется условие.
do < тело цикла; >while ( условие );
Условие - проверяется после каждого прохода. Код в теле цикла - выполняется, если выполняется условие.
Оператор выбора
Оператор выбора switch позволяет создать разветвление кода в зависимости от значения одной переменной. Синтаксис такой:
Наличие оператора default необязательно. Наличие оператора break обязательно, иначе сравнение пойдёт дальше, как показано для case 2, 3 и 4.
При помощи условных операторов и операторов выбора строится логика работы программы. Условный оператор поможет сравнить значение с датчика и принять решение, что делать дальше. Оператор выбора отлично справится с изменяющимися режимами работы программы или опросом кнопок, нажатых на ИК пульте.
Значения case обязательно должны быть константами, так как программа не сравнивает значение, а сразу переходит на нужный блок кода
Также конструкция на switch работает быстрее, чем аналогичная на else if : происходит выбор варианта и моментальный переход на нужный блок кода, а в else if в каждой строке производится проверка логического выражения.
Условные операторы:
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 описан ниже.
Модификаторы:
Число типа long (12345 L )
Число типа long lond (12345 LL )
Число беззнакового типа (12345 U )
Комбинация модификаторов (12345 UL )
Показатель экспоненты (3 E -5 = 3•10-5)
Значения некоторых констант:
Ложь, используются вместо 0
Истина, используется вместо 1
Низкий уровень
Высокий уровень
Конфигурация вывода как вход
Конфигурация вывода как выход
Конфигурация вывода как вход с подтяжкой
Передача младшим битом вперёд
Передача старшим битом вперёд
Тактовая частота Arduino в Гц
Число Пи
Половина числа Пи
Два числа Пи
Число Эйлера
Порядок условий
Порядок условий играет очень большую роль: логические выражения и переменные проверяются слева направо, и если результат всего выражения в скобках будет однозначно определён после проверки первого выражения – остальные выражения проверяться не будут. Например если в выражении if (a && b && c) хотя бы а имеет значение false , проверка остальных выражений ( b и c ) уже не выполняется, потому что всё выражение заведомо будет false .
Или наоборот: если в выражении if (a || b || c) хотя бы а будет true – всё выражение также будет true и b с c не будут проверяться.
Это может помочь в оптимизации кода: например, есть какой-то флаг и выражение, которое вычисляется прямо в условии и сразу проверяется. Если флаг опущен, микроконтроллер не будет тратить время на лишние вычисления и сразу покинет условие. Например:
Префиксы:
Запись числа в 2ой системе ( 0b 10101)
Запись числа в 2ой системе ( B 10101)
Запись числа в 8ой системе ( 0 12345)
Запись числа в 16ой системе ( 0x 1234A)
Читайте также: