Arduino code functions

Arduino code functions

Return type

The function do some specific works. It may return a value as the result of the works. We MUST specify which type of value such as boolean, byte, char, double, float, int, long, String() .

If there is no value to returm, the returm type is void

Function Name

The function name consists of a name specified to the function. It represents the real body of the function. It is used to call function.

Parameters

The parameters are optional. it can be nothing, one or more parameters. Each parameter includes the data type of parameter and parameter name. The parameters are data to pass to function when it is called. The data type of parameters can be different

In other works, paremeters are input and the return value is output.

Function Body

The function body is the implementation of the function. It is placed in side a <> (curly braces).

If the return type is void, it does not need to use return to terminate the function. Otherwise, The return MUST be used.

Calling a Function

After declaring a function, calling the function is simple. It just need to put function name, parameters and terminated by a comma. In case of the return type is not void, we may need to use a variable to store the return value.

In the function call. we do not put the return type and parameter type.

Источник

Arduino Functions

Created on: 4 March 2015

Part 15 of the Arduino Programming Course

In this part of the Arduino programming course, you will learn how to write your own functions and use them in your sketches. The structure and use of functions is fully explained.

Functions were briefly encountered in part 1 of this programming course where some basic facts about functions where stated – 1) each function must have a unique name, 2) the function name is followed by parentheses () 3) functions have a return type, e.g. void, 4) the body of a function is enclosed in opening and closing braces <>.

We will start by examining the structure of a function and then see how to write functions.

The Structure of a Function

Before a function can be used in a sketch, it must be created. The following code is an example of a function that was created to print a dashed line in the Arduino IDE.

The code above that creates the function is called the function definition. The image below shows the components of a function.

Structure of a Simple Arduino Function

Function Name

When we create a function, it must be given a name. The naming convention for functions is the same as for variables:

  • The function name can be made up of alphanumeric characters (A to Z; a to z; 0 to 9) and the underscore (_).
  • The function name may not start with a number i.e. the numbers 0 to 9.
  • A function name must not be used that is the same as a language keyword or existing function.

The function name ends with parentheses (). Nothing is passed to the example function above, so the parentheses are empty. Passing values or parameters to functions will be explained later in this tutorial.

Return Type

A function must have a return type. The example function does not return anything, so has a return type of void. Returning a value from a function will be explained in the next part of this course.

Function Body

The function body is made up of statements placed between braces <>. The statements make up the functionality of the function (what the function will do when it is called).

When a function is used, it is said to be «called». We will look at how to call a function next.

Calling a Function

To use the function that was created above, it must be called in a sketch as shown in the sketch below.

In the sketch above, the DashedLine() function is created at the bottom of the file and then called twice at the top of the file as shown in the image below.

Calling a Function in an Arduino Sketch

To call a function, use the function name followed by opening and closing parentheses. Finally terminate the statement that calls the function with a semicolon.

Load the sketch to an Arduino and then open the terminal window. The sketch prints some text in a box as shown below.

Output from the DashedLine() Function

The first time that the function is called, it prints the dashed line shown in the top of the image. Text is then written to the serial monitor window by the statement below the function call. The function is then called again to print the same dashed line that completes the box.

Books that may interest you:

Why Use Functions

The function used in the example above is very simple, so all the benefits of using functions will not be seen immediately.

One advantage of using functions is that they avoid having to write the same code over and over again in a sketch which saves time and memory. Every time that a function is called, we are just reusing code that has been written once.

If a function needs to be modified, it only has to be done once and the modifications will take effect every place in a sketch that the function is called. If a function was not used, each place that the statements are found in a sketch to do a particular task would need to be located and modified.

Functions can be used to break a sketch up into pieces which make it more modular and easier to understand. Functions can be reused in other sketches.

Passing a Value to a Function

In the sketch above, the length of the line that the function prints out is fixed in the function. If we change the text that is in the box, it may not fit in the box properly. The function needs to be modified so that we can tell it what size line it must draw.

The above function can be modified to pass a value to it that will tell it how many characters long to make the line that it draws.

The modified sketch is shown below.

This video shows the modified sketch running:

—>

The DashedLine() function in the above sketch is modified so that an integer value can be passed to it. The line needs to be 24 characters long to fit the new menu text into it, so we pass it a value of 24.

Of course the function has to be modified to handle the value that is being passed to it:

The function needs to be able to accept an integer value that is passed to it. The variable type and the name of the variable are inserted between the opening an closing parentheses after the function name.

We can now use the len integer variable in the body of the DashedLine() function. The variable will contain whatever value was passed to it when the function was called.

The body of the sketch uses the len variable in a for loop to print out the correct number of dashes that make up the dashed line of the menu box.

Источник

Список команд Arduino

На этой странице представлен список всех (или почти всех) доступных “из коробки” команд для Arduino с кратким описанием и примерами. Часть информации взята из Гугла, в основном некоторые особенности языка, часть получена методом проб и ошибок. Полную информацию о том, как этим пользоваться, можно получить из уроков или официального reference. Также изо всех сил рекомендую вот этот онлайн справочник по C++, из него можно узнать гораздо больше о некоторых особенностях использования операторов и типов данных.

А ещё у меня есть краткий сборник всех основных Ардуино-функций для печати! Смотри в этом уроке.

Структура скетча

Синтаксис, структура кода

Ставится в конце каждого действия

Функция, содержимое которой выполняется один раз при запуске микроконтроллера. Подробнее – в этом уроке.

Функция, содержимое которой выполняется (или пытается выполняться) “по кругу” на протяжении всего времени работы МК. Подробнее – в этом уроке.

Директива, позволяющая подключать в проект дополнительные файлы с кодом.

В чём отличие <> и “”? Когда указываем название “в кавычках”, компилятор сначала ищет файл в папке со скетчем, а затем в папке с библиотеками. При использовании компилятор ищет файл только в папке с библиотеками

Директива, дающая команду препроцессору заменить указанное название на указанное значение. Чаще всего таким образом объявляют константы:

После компиляции все встречающиеся в тексте программы слова MOTOR_PIN будут заменены на цифру 10, а LED_PIN – на цифру 3. Такой способ хранения констант не использует оперативную память микроконтроллера. Также define позволяет делать т.н. макро функции. Например Ардуиновская функция sq (квадрат) является макро, который при компиляции превращается в умножение:

Директивы препроцессору, позволяющие включать или исключать участки кода по условию

При помощи условной компиляции очень удобно собирать и настраивать сложные проекты с кучей настроек и библиотек, подключаемых “по условию”. Например:

Если параметру DEBUG установить 1, то будет подключена библиотека Serial, если 0 – то нет. Таким образом получаем универсальный оптимизированный проект с отладкой. Подробнее – в этом уроке.

Условные директивы препроцессору, позволяют включать или исключать участки кода по условию: ifdef – определено ли? ifndef – не определено ли? Подробнее – в этом уроке.

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

Оператор прерывания функции, он же оператор возврата значения из функции. Подробнее – в этом уроке

Условия (if, switch)

Оператор сравнения и его друзья. Подробнее – в этом уроке.

Укороченная запись условия: (логика) ? правда : ложь. Подробнее – в этом уроке.

Оператор выбора, заменяет конструкцию с else if. Подробнее – в этом уроке.

Оператор break очень важен, позволяет выйти из switch. Но можно использовать так:

Циклы (for, while)

Цикл – “счётчик”. for (инициализация; условие; инкремент). Подробнее – в этом уроке.

Также используется для создания замкнутых циклов, т.к. настройки for необязательны. Выход только через break или goto

Цикл с предусловием. Подробнее – в этом уроке.

Может быть использован для создания замкнутого цикла, выход только через break или goto

Цикл с постусловием. Подробнее – в этом уроке.

Отличается от while тем, что гарантированно выполнится хотя бы один раз

Пропускает все оставшиеся в теле цикла действия и переходит к следующей итерации

Выходит из цикла

Операторы

Запятая ,

Запятая тоже является оператором, используется в следующих случаях:

  • Перечисление элементов в массивах (урок про массивы)
  • Перечисление аргументов в функциях (урок про функции)
  • Выполнение последовательности действий (сделать это И это)

Рассмотрим третий случай здесь:

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

Арифметические операторы – самые простые и понятные из всех

  • = присваивание
  • % остаток от деления
  • * умножение
  • / деление
  • + сложение
  • — вычитание

Большой урок по математическим действиям.

Сравнение и логика

  • == равенство (a == b)
  • != неравенство (a != b)
  • >= больше или равно
  • меньше или равно
  • > больше
  • меньше
  • ! логическое НЕ, отрицание. Аналог – оператор not
  • && логическое И. Аналог – оператор and
  • || логическое ИЛИ. Аналог – оператор or

Подробный урок по сравнениям и условиям.

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

  • ++ (плюс плюс) инкремент: a++ равносильно a = a + 1
  • — (минус минус) декремент: a — равносильно a = a – 1
  • += составное сложение: a += 10 равносильно a = a + 10
  • -= составное вычитание: a -= 10 равносильно a = a – 10
  • *= составное умножение: a *= 10 равносильно a = a * 10
  • /= составное деление: a /= 10 равносильно a = a / 10
  • %= прибавить остаток от деления: a %= 10 равносильно a = a + a % 10
  • &= составное битовое И: a &= b равносильно a = a & b
  • ^= составное исключающее ИЛИ: a ^= b равносильно a = a ^ b
  • |= составное ИЛИ: a |= b равносильно a = a | b

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

Битовые операции

  • & битовое И
  • битовый сдвиг влево
  • >> битовый сдвиг вправо
  • ^ битовое исключающее ИЛИ (аналогичный оператор – xor)
  • | битовое ИЛИ

По битовым операциям читай урок у меня на сайте.

Указатели и ссылки

  • & – возвращает адрес данных в памяти (адрес первого блока данных)
  • * – возвращает значение по указанному адресу
  • -> – оператор косвенного обращения к членам и методам (для указателей на структуры и классы). Является короткой записью конструкции через указатель: a->b равносильно (*a).b

Подробнее об указателях и ссылках читайте в отдельном уроке.

Работа с данными

Типы данных, переменные

Переменная – элементарная ячейка для хранения данных (цифр). Переменные разных типов имеют разный “размер ячейки” и имеют разный лимит на размер числа.

Название Альт. название Вес Диапазон Особенность
boolean bool 1 байт 0 или 1, true или false Логическая переменная. bool на Arduino тоже занимает 1 байт, а не бит!
char int8_t 1 байт -128… 127 Хранит номер символа из таблицы символов ASCII
byte uint8_t 1 байт 0… 255
int int16_t, short 2 байта -32 768… 32 767
unsigned int uint16_t, word 2 байта 0… 65 535
long int32_t 4 байта -2 147 483 648… 2 147 483 647 – 2 миллиарда… 2 миллиарда
unsigned long uint32_t 4 байта 0… 4 294 967 295 0… 4 миллиарда…
float 4 байта -3.4028235E+38… 3.4028235E+38 Хранит числа с плавающей точкой (десятичные дроби). Точность: 6-7 знаков
double 4 байта Для AVR то же самое, что float. А так он 8 байт
int64_t 8 байт -(2^64)/2… (2^64)/2-1 Очень большие числа. Serial не умеет такие выводить
uint64_t 8 байт 2^64-1 Очень большие числа. Serial не умеет такие выводить

Существует еще несколько специальных типов данных для символов. Подробнее можно почитать здесь.

  • wchar_t – 16 битный символ
  • char16_t – 2-х байтный char
  • char32_t – 4-х байтный char

Также есть такое понятие, как переопределение типов данных (не создавая новых типов), для этого используется ключевое слово typedef. Typedef работает следующим образом: typedef ; – создать новый тип данных на основе типа . Пример:

Создаёт тип данных под названием color, который будет абсолютно идентичен типу byte (то есть принимать 0-255). Теперь с этим типом можно создавать переменные:

Создали три переменные типа color, который тот же byte, только в профиль. Это всё!

Более подробно о переменных и данных можно почитать вот здесь.

Структуры

Структура (struct) – очень составной тип данных: совокупность разнотипных переменных, объединённых одним именем.

Ярлык будет являться новым типом данных, и, используя этот ярлык, можно объявлять уже непосредственно саму структуру:

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

  • Обращение к члену структуры производится вот по такой схеме: . и позволяет менять или читать значение.
  • Если две структуры имеют одинаковую структуру (объявлены одним ярлыком) то можно одну структуру просто приравнять к другой, все переменные запишутся соответственно на свои места.
  • Ещё одним удобным вариантом является присваивание значения вот таким образом: = ( ) , , >;

Более подробно про структуры читай тут.

Перечисления

Перечисления (enum – enumeration) – тип данных, представляющий собой набор именованных констант, нужен в первую очередь для удобства программиста.

Объявление перечисления чем-то похоже на объявление структуры:

Таким образом мы объявили ярлык. Теперь, используя этот ярлык, можно объявить само перечисление:

Также как и у структур, можно объявить перечисление без создания ярлыка (зачем нам лишняя строчка?):

Созданное таким образом перечисление является переменной, которая может принимать указанные для неё , также с этими именами её можно сравнивать. Теперь самое главное: имена для программы являются числами, начиная с 0 и далее по порядку увеличиваясь на 1. В абстрактном примере выше равно 0, равно 1, равно 2, и так далее. Помимо указанных имён, перечислению можно приравнять и число напрямую, но как бы зачем.

Более подробно про перечисления читай тут.

Классы

Классы в С++ – это основной и очень мощный инструмент языка, большинство “библиотек” являются классами. Иерархия такая:

Класс объявляется следующим образом:

Более подробно про работу с классами читай вот в этом уроке про классы.

Массивы

Для объявления массива достаточно указать квадратные скобки после имени переменной, тип данных – любой. Более подробно про массивы читай в уроке.

Строки (объект String)

String – очень мощный инструмент для работы со строками, т.е. текстовыми данными. Объявить строку можно несколькими способами:

Подробнее про строки String и массивы символов читай в этом уроке.

Строки можно сравнивать, складывать и вычитать, также для работы с ними есть куча функций:

myString.charAt(index);

Возвращает элемент строки myString под номером index. Аналог – myString[index];

myString.setCharAt(index, val);

Записывает в строку myString символ val на позицию index. Аналог – myString[index] = val;

myString.compareTo(myString2);

  • Возвращает отрицательное число, если myString идёт до myString2
  • Возвращает положительное число, если myString идёт после myString2
  • Возвращает 0, если строки одинаковы

myString.concat(value);

Присоединяет value к строке (value может иметь любой численный тип данных). Возвращает true при успешном выполнении, false при ошибке. Аналог – сложение, myString + value;

myString.endsWith(myString2);

Проверяет, заканчивается ли myString символами из myString2. В случае совпадения возвращает true

myString.startsWith(myString2);

Проверяет, начинается ли myString символами из myString2. В случае совпадения возвращает true

myString.equals(myString2);

Возвращает true, если myString совпадает с myString2. Регистр букв важен

myString.equalsIgnoreCase (myString2);

Возвращает true, если myString совпадает с myString2. Регистр букв неважен

myString.indexOf(val);
myString.indexOf(val, from);

Ищет и возвращает номер (позицию) значения val в строке, ищет слева направо, возвращает номер первого символа в совпадении. val может быть char или String, то есть ищем в строке другую строку или символ. Можно искать, начиная с позиции from. В случае, когда не может найти val в строке, возвращает -1.

myString.lastIndexOf(val);
myString.lastIndexOf(val, from);

Ищет и возвращает номер (позицию) значения val в строке, ищет справа налево, возвращает номер последнего символа в совпадении. val может быть char или String, то есть ищем в строке другую строку или символ. Можно искать, начиная с позиции from. В случае, когда не может найти val в строке, возвращает -1.

myString.length();

Возвращает длину строки в количестве символов

myString.remove(index);
myString.remove(index, count);

Удаляет из строки символы, начиная с index и до конца, либо до указанного count

myString.replace(substring1, substring2);

В строке myString заменяет последовательность символов substring1 на substring2.

myString.reserve(size);

Зарезервировать в памяти количество байт size для работы со строкой

myString.c_str();

Преобразовывает строку в “СИ” формат (null-terminated string) и возвращает указатель на полученную строку

myString.trim();

Удаляет пробелы из начала и конца строки. Действует со строкой, к которой применяется

myString.substring(from);
myString.substring(from, to);

Возвращает кусок строки, содержащейся в myString начиная с позиции from и до конца, либо до позиции to

myString.toCharArray(buf, len);

Раскидывает строку в массив – буфер buf (типа char []) с начала и до длины len

myString.getBytes(buf, len);

Копирует указанное количество символов len (вплоть до unsigned int) в буфер buf (byte [])

myString.toFloat();

Возвращает содержимое строки в тип данных float

myString.toDouble();

Возвращает содержимое строки в тип данных double

myString.toInt();

Возвращает содержимое строки в тип данных int

myString.toLowerCase();

Переводит все символы в нижний регистр. Было ААААА – станет ааааа

myString.toUpperCase();

Переводит все символы в верхний регистр. Было ааааа – станет ААААА

Спецификаторы переменных

  • const – константа, такую переменную нельзя изменить (будет ошибка). const int val = 10;
  • static – позволяет объявить локальную переменную внутри функции, и эта переменная не будет заново переобъявляться при повторном вызове функции. Эдакая локальная глобальная переменная. Почитать
  • volatile – указывает компилятору, что переменную не нужно оптимизировать, что её значение может меняться извне. Такой спецификатор должен быть применён к переменным, которые меняют своё значение в прерывании. Почитать
  • extern – указывает компилятору, что эта переменная объявлена в другом файле программы, но мы хотим пользоваться именно ей, а не создавать новую с таким же именем в этом файле программы. Позволяет читать/записывать в переменные, созданные в других файлах (библиотеках)!

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

Переменные разных типов данных могут быть преобразованы в друг друга, для этого достаточно указать нужный тип данных в скобках перед преобразуемой переменной (тип_данных)переменная . Результат вернёт переменную с новым типом данных, сам же тип данной у переменной не изменится (работает в рамках одного действия):

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

И для строк мы уже рассматривали выше

Иногда можно встретить преобразование типов через оператор cast . Отличную статью можно глянуть на Хабре, а я кратко опишу 4 основных каста:

  • reinterpret_cast – приведение типов без проверки, непосредственное указание компилятору. Применяется только в случае полной уверенности программиста в собственных действиях. Не снимает const и volatile , применяется для приведения указателя к указателю, указателя к целому и наоборот;
  • static_cast – преобразует выражения одного статического типа в объекты и значения другого статического типа. Поддерживается преобразование численных типов, указателей и ссылок по иерархии наследования как вверх, так и вниз. Преобразование проверяется на уровне компиляции и в случае ошибки приведения типов будет выдано сообщение;
  • dynamic_cast – используется для динамического приведения типов во время выполнения. В случае неправильного приведения типов для ссылок вызывается исключительная ситуация std::bad_cast, а для указателей будет возвращен 0;
  • const_cast – самое простое приведение типов. Снимает const и volatile , то есть константность и отказ от оптимизации компилятором переменной. Это преобразование проверяется на уровне компиляции и в случае ошибки приведения типов будет выдано сообщение.

Как пользоваться: на примере предыдущего примера

Подробный урок по типам данных смотри тут.

“Символьные” функции

Все следующие функции принимают как аргумент символ (тип char), анализируют его и возвращают true или false в зависимости от предназначения.

  • isAlpha(thisChar) – возвращает true, если thisChar – буква
  • isAlphaNumeric(thisChar) – возвращает true, если thisChar – буква или цифра
  • isAscii(thisChar) – возвращает true, если thisChar входит в таблицу ASCII
  • isControl(thisChar) – возвращает true, если thisChar – контрольный символ
  • isDigit(thisChar) – возвращает true, если thisChar – цифра
  • isGraph(thisChar) – возвращает true, если thisChar – печатаемый знак (кроме пробела)
  • isPrintable(thisChar) – возвращает true, если thisChar – печатаемый знак (включая пробел)
  • isHexadecimalDigit(thisChar) – возвращает true, если thisChar цифра 0-9 или буква A-F
  • isPunct(thisChar) – возвращает true, если thisChar – знак пунктуации
  • isLowerCase(thisChar) – возвращает true, если thisChar – буква в нижнем регистре (маленькая)
  • isUpperCase(thisChar) – возвращает true, если thisChar – буква в верхнем регистре (большая)
  • isSpace(thisChar) – возвращает true, если thisChar – пробел
  • isWhitespace(thisChar) – возвращает true, если thisChar – форматированный пробел (formfeed (‘\f’), newline (‘\n’), carriage return (‘\r’), horizontal tab (‘\t’), and vertical tab (‘\v’))

Работа с цифрами

Целые и дробные числа

Arduino поддерживает работу с целыми числами в разных системах исчисления:

Базис Префикс Пример Особенности
2 (двоичная) B или 0b (ноль бэ) B1101001 цифры 0 и 1
8 (восьмеричная) 0 (ноль) 0175 цифры 0 – 7
10 (десятичная) нет 100500 цифры 0 – 9
16 (шестнадцатеричная) 0x (ноль икс) 0xFF21A цифры 0-9, буквы A-F

ВАЖНО! Для арифметических вычислений по умолчанию используется ячейка long (4 байта), но при умножении и делении используется int (2 байта), что может привести к непредсказуемым результатам! Если при умножении чисел результат превышает 32’768, он будет посчитан некорректно. Для исправления ситуации нужно писать (тип данных) перед умножением, что заставит МК выделить дополнительную память для вычисления (например (long)35 * 1000). Также существую модификаторы, делающие примерно то же самое.

  • u или U – перевод в формат unsigned int (от 0 до 65’535). Пример: 36000u
  • l или L – перевод в формат long (-2 147 483 648… 2 147 483 647). Пример: 325646L
  • ul или UL – перевод в формат unsigned long (от 0 до 4 294 967 295). Пример: 361341ul

Посмотрим, как это работает на практике:

Arduino поддерживает работу с числами с плавающей точкой (десятичные дроби). Этот тип данных не является для неё “родным”, поэтому вычисления с ним производятся в несколько раз дольше, чем с целочисленным типом (около 7 микросекунд на действие). Arduino поддерживает три типа ввода чисел с плавающей точкой:

Тип записи Пример Чему равно
Десятичная дробь 20.5 20.5
Научный 2.34E5 2.34*10^5 или 234000
Инженерный 67e-12 67*10^-12 или 0.000000000067

С вычислениями есть такая особенность: если в выражении нет float чисел, то вычисления будут иметь целый результат (дробная часть отсекается). Для получения правильного результата нужно писать (float) перед действием, или использовать float числа при записи. Смотрим:

Ну и напоследок, при присваивании float числа целочисленному типу данных дробная часть отсекается. Если хотите математическое округление – его нужно использовать отдельно:

Математические функции и константы

Математических функций Arduino поддерживает очень много, малая часть из них являются макро функциями, идущими в комплекте с Arduino.h, все остальные же наследуются из мощной C++ библиотеки math.h

Функция Описание
cos (x) Косинус (радианы)
sin (x) Синус (радианы)
tan (x) Тангенс (радианы)
fabs (x) Модуль для float чисел
fmod (x, y) Остаток деления x на у для float
modf (x, *iptr) Возвращает дробную часть, целую хранит по адресу iptr http://cppstudio.com/post/1137/
modff (x, *iptr) То же самое, но для float
sqrt (x) Корень квадратный
sqrtf (x) Корень квадратный для float чисел
cbrt (x) Кубический корень
hypot (x, y) Гипотенуза ( корень(x*x + y*y) )
square (x) Квадрат ( x*x )
floor (x) Округление до целого вниз
ceil (x) Округление до целого вверх
frexp (x, *pexp) http://cppstudio.com/post/1121/
ldexp (x, exp) x*2^exp http://cppstudio.com/post/1125/
exp (x) Экспонента (e^x)
cosh (x) Косинус гиперболический (радианы)
sinh (x) Синус гиперболический (радианы)
tanh (x) Тангенс гиперболический (радианы)
acos (x) Арккосинус (радианы)
asin (x) Арксинус (радианы)
atan (x) Арктангенс (радианы)
atan2 (y, x) Арктангенс (y / x) (позволяет найти квадрант, в котором находится точка)
log (x) Натуральный логарифм х ( ln(x) )
log10 (x) Десятичный логарифм x ( log_10 x)
pow (x, y) Степень ( x^y )
isnan (x) Проверка на nan (1 да, 0 нет)
isinf (x) Возвр. 1 если x +бесконечность, 0 если нет
isfinite (x) Возвращает ненулевое значение только в том случае, если аргумент имеет конечное значение
copysign (x, y) Возвращает x со знаком y (знак имеется в виду + -)
signbit (x) Возвращает ненулевое значение только в том случае, если _X имеет отрицательное значение
fdim (x, y) Возвращает разницу между x и y, если x больше y, в противном случае 0
fma (x, y, z) Возвращает x*y + z
fmax (x, y) Возвращает большее из чисел
fmin (x, y) Возвращает меньшее из чисел
trunc (x) Возвращает целую часть числа с дробной точкой
round (x) Математическое округление
lround (x) Математическое округление (для больших чисел)
lrint (x) Округляет указанное значение с плавающей запятой до ближайшего целого значения, используя текущий режим округления и направление
Константа Значение
UINT8_MAX 255
INT8_MAX 127
UINT16_MAX 65535
INT16_MAX 32767
UINT32_MAX 4294967295
INT32_MAX 2147483647
Функция Значение
min(a, b) Возвращает меньшее из чисел a и b
max(a, b) Возвращает большее из чисел
abs(x) Модуль числа
constrain(val, low, high) Ограничить диапазон числа val между low и high
map(val, min, max, outMin, outMax) Перевести диапазон числа val (от min до max) в новый диапазон (от outMin до outMax). val = map(analogRead(0), 0, 1023, 0, 100); – получить с аналогового входа значения 0-100 вместо 0-1023. Работает только с целыми числами!
round(x) Математическое округление
radians(deg) Перевод градусов в радианы
degrees(rad) Перевод радиан в градусы
sq(x) Квадрат числа
Константа Значение Описание
INT8_MAX 127 Максимальное значение для char, int8_t
UINT8_MAX 255 Максимальное значение для byte, uint8_t
INT16_MAX 32767 Максимальное значение для int, int16_t
UINT16_MAX 65535 Максимальное значение для unsigned int, uint16_t
INT32_MAX 2147483647 Максимальное значение для long, int32_t
UINT32_MAX 4294967295 Максимальное значение для unsigned long, uint32_t
M_E 2.718281828 Число e
M_LOG2E 1.442695041 log_2 e
M_LOG10E 0.434294482 log_10 e
M_LN2 0.693147181 log_e 2
M_LN10 2.302585093 log_e 10
M_PI 3.141592654 pi
M_PI_2 1.570796327 pi/2
M_PI_4 0.785398163 pi/4
M_1_PI 0.318309886 1/pi
M_2_PI 0.636619772 2/pi
M_2_SQRTPI 1.128379167 2/корень(pi)
M_SQRT2 1.414213562 корень(2)
M_SQRT1_2 0.707106781 1/корень(2)
NAN __builtin_nan(“”) nan
INFINITY __builtin_inf() infinity
PI 3.141592654 Пи
HALF_PI 1.570796326 пол Пи
TWO_PI 6.283185307 два Пи
EULER 2.718281828 Число Эйлера е
DEG_TO_RAD 0.01745329 Константа перевода град в рад
RAD_TO_DEG 57.2957786 Константа перевода рад в град

Псевдослучайные числа

  • random(max) – возвращает случайное число в диапазоне от 0 до (max – 1)
  • random(min, max) – возвращает случайное число в диапазоне от min до (max – 1)
  • randomSeed(value) – дать генератору случайных чисел новую опорную точку для счёта. value – любое число. Обычно при старте программы (в setup) подают значение с неподключенного аналогового пина, получая таким образом 1024 набора случайных чисел

Биты и байты

Битовые операции – подробнее читай в отдельном уроке.

  • bit(val) – считает значение байта val по порядку (0 будет 1, 1 будет 2, 2 будет 4, 3 будет 8 и.т.д.)
  • bitClear(x, n) – устанавливает на 0 бит, находящийся в числе x под номером n
  • bitSet(x, n) – устанавливает на 1 бит, находящийся в числе x под номером n
  • bitWrite(x, n, b) – устанавливает на значение b (0 или 1) бит , находящийся в числе x под номером n
  • bitRead(x, n) – возвращает значение бита (0 или 1), находящегося в числе x под номером n
  • highByte(x) – извлекает и возвращает старший (крайний левый) байт переменной типа word (либо второй младший байт переменной, если ее тип занимает больше двух байт).
  • lowByte(x) – извлекает и возвращает младший (крайний правый) байт переменной (например, типа word).
  • bit_is_set(x, n) – проверка (возвращает 1 если включен) бита n в числе x
  • bit_is_clear(x, n) – проверка (возвращает 1 если выключен) бита n в числе x
  • loop_until_bit_is_set(x, n) – висеть в цикле (ждать), пока включен бит n в числе x
  • loop_until_bit_is_clear(x, n) – висеть в цикле (ждать), пока выключен бит n в числе x

Ввод-вывод

Цифровые пины

Устанавливает режим работы пина pin (ATmega 328: D0-D13, A0-A5) на режим mode:

  • INPUT – вход (все пины сконфигурированы так по умолчанию)
  • OUTPUT – выход (при использовании analogWrite ставится автоматически)
  • INPUT_PULLUP – подтяжка к питанию (например для обработки кнопок)

Читает состояние пина pin и возвращает :

  • 0 или LOW – на пине 0 Вольт (точнее 0-2.5В)
  • 1 или HIGH – на пине 5 Вольт (точнее 2.5-опорное В)

Подаёт на пин pin сигнал value:

  • 0 или LOW – 0 Вольт (GND)
  • 1 или HIGH – 5 Вольт (точнее, напряжение питания)

Запускает генерацию ШИМ сигнала (отдельный урок про ШИМ) на пине pin со значением value. Для стандартного 8-ми битного режима это значение 0-255, соответствует скважности 0-100%. Подробнее о смене частоты и разрядности ШИМ смотрите в этом уроке. ШИМ пины:

  • ATmega 328/168 (Nano, UNO, Mini): D3, D5, D6, D9, D10, D11
  • ATmega 32U4 (Leonardo, Micro): D3, D5, D6, D9, D10, D11, D13
  • ATmega 2560 (Mega): D2 – D13, D44 – D46

Аналоговые пины

Читает и возвращает оцифрованное напряжение с пина pin. АЦП на большинстве плат Arduino имеет разрядность 10 бит, так что возвращаемое значение 0 – 1023 при напряжении 0 – опорное на пине. Урок про аналоговые пины.

Устанавливает режим работы АЦП согласно mode:

  • DEFAULT: опорное напряжение равно напряжению питания МК
  • INTERNAL: встроенный источник опорного на 1.1V для ATmega168 или ATmega328P и 2.56V на ATmega8
  • INTERNAL1V1: встроенный источник опорного на 1.1V (только для Arduino Mega)
  • INTERNAL2V56: встроенный источник опорного на 2.56V (только для Arduino Mega)
  • EXTERNAL: опорным будет считаться напряжение, поданное на пин AREF

Как это влияет на работу? Значение 1023 функции analogRead() будет соответствовать опорному напряжению или выше его, соответственно поставив INTERNAL можно измерять напряжение от 0 до 1.1V с точностью (1.1 / 1023

1.2 мВ), напряжение выше 1.1V будет всегда 1023. После изменения источника опорного напряжения (вызова analogReference) первые несколько измерений могут быть нестабильными.

Нельзя использовать напряжение меньше 0V или выше 5V в качестве внешнего опорного в пин AREF. Также при использовании режима EXTERNAL нужно вызвать analogReference(EXTERNAL) до вызова функции analogRead(), иначе можно повредить микроконтроллер. Также можно подключить опорное в пин AREF через резистор на

5 кОм, но так как вход AREF имеет собственное сопротивление в 32 кОм, реальное опорное будет например 2.5 * 32 / (32 + 5) =

Аппаратные прерывания

Подключить прерывание (читай урок про прерывания) на номер прерывания pin, назначить функцию ISR как обработчик и установить режим прерывания mode:

  • LOW – срабатывает при сигнале LOW на пине
  • RISING – срабатывает при изменении сигнала на пине с LOW на HIGH
  • FALLING – срабатывает при изменении сигнала на пине с HIGH на LOW
  • CHANGE – срабатывает при изменении сигнала (с LOW на HIGH и наоборот)

Источник

Adblock
detector