Arduino диапазон чисел

RoboCraft

рассмотрим специфичные математические функции Arduino

Описание:
Возвращает меньшее из двух чисел

Параметры:
x: первое число
y: второе число

Возвращаемое значение:
Меньшее число из двух

Примечание:
т.к. min(x, y) – это макрос – не стоит использовать функции внутри скобок, чтобы избежать неправильных результатов

Описание:
Возвращает большее из двух чисел

Параметры:
x: первое число
y: второе число

Возвращаемое значение:
Большее число из двух

Примечание:
т.к. max(x, y) – это макрос – не стоит использовать функции внутри скобок, чтобы избежать неправильных результатов

Описание:
Возвращает модуль (абсолютную величину) числа. (http://ru.wikipedia.org/wiki/Модуль_числа)

Параметры:
x: число

Возвращаемое значение:
x: если x больше или равен 0.
-x: если x меньше 0.

Примечание:
т.к. abs(x) – это макрос – не стоит использовать функции внутри скобок, чтобы избежать неправильных результатов

Описание:
Проверяет находится ли число x в диапазоне (a,b)

Параметры:
x: число для проверки
a: нижняя грань диапазона
b: верхняя грань диапазона

Возвращаемое значение:
x: если x лежит между a и b
a: если x меньше, чем a
b: если x больше, чем b

map(value, fromLow, fromHigh, toLow, toHigh)

Описание:
Отображает число из одного диапазона в другой.

Примечание:
Функция не проверяет – содержится ли число в необходимом диапазоне, поэтому можно вызвать функцию constrain() перед или после функции map().
Так же, «нижняя граница » диапазонов может быть больше или меньше, чем «верхняя граница», т.о. функция map() может быть использована, чтобы перевернуть диапазон чисел, например:

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

Функция map() оперирует целыми числами, поэтому никаких десятичных значений не выдаётся. Дробные остатки отсекаются, а не округляются или усредняются.

Параметры:
value: число для отображения
fromLow: нижняя граница текущего диапазона числа value
fromHigh: верхняя граница текущего диапазона числа value
toLow: нижняя граница целевого диапазона
toHigh: верхняя граница целевого диапазона

Возвращаемое значение:
Целое число типа long

Описание:
Функция предназначена для возведения числа в заданную степень.

Параметры:
base: число(float)
exponent: степень(float)

Возвращаемое значение:
Результат возведения в степень (double)

Описание:
Вычисляет квадрат числа: число умноженное на себя.

Параметры:
x: число

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

Описание:
Вычисляет квадратный корень числа.

Параметры:
x: число

Возвращаемое значение:
Квадратный корень числа, тип double

Описание:
Вычисляет синус угла (в радианах). Результат будет между -1 и 1.

Параметры:
rad: угол в радианах (float)

Возвращаемое значение:
Синус угла, тип double

Примечание:
Serial.print() и Serial.println() в версиях IDE до 0018 не поддерживали печати типа float.

Описание:
Вычисляет косинус угла (в радианах). Результат будет между -1 и 1.

Параметры:
rad: угол в радианах (float)

Возвращаемое значение:
Косинус угла, тип double

Примечание:
Serial.print() и Serial.println() в версиях IDE до 0018 не поддерживали печати типа float.

Описание:
Вычисляет тангенс угла (в радианах). Результат будет между плюс и минус бесконечностью 🙂

Параметры:
rad: угол в радианах (float)

Возвращаемое значение:
Тангенсс угла, тип double

Источник

Arduino.ru

map(value, fromLow, fromHigh, toLow, toHigh)

Функция пропорционально переносит значение (value) из текущего диапазона значений (fromLow .. fromHigh) в новый диапазон (toLow .. toHigh), заданный параметрами.

Функция map() не ограничивает значение рамками диапазона, как это делает функция constrain(). Contrain() может быть использован до или после вызова map(), если необходимо ограничить допустимые значения заданным диапазоном.

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

Возможно использование отрицательных значений:

Функция map() оперирует целыми числами. При пропорциональном переносе дробная часть не округляется по правилами, а просто отбрасывается.

Параметры
  • value: значение для переноса
  • fromLow: нижняя граница текущего диапазона
  • fromHigh: верхняя граница текущего диапазона
  • toLow: нижняя граница нового диапазона, в который переноситься значение
  • toHigh: верхняя граница нового диапазона
Возвращаемое значение

Значение в новом диапазоне

Пример
Дополнительно

Математически функция map() может быть записана так:

Источник

Arduino

Типы данных

Тип Занимаемый размер (байт) Минимальное значение Максимальное значение
boolean 1 false true
char 1 -128 127
byte 1 0 255
int, short 2 -32768 32767
unsigned int 2 0 65535
long 4 -2147483648 2147483647
unsigned long 4 0 4294967295
float, double 4 -3.4028235E+38 3.4028235E+38

boolean

Логический тип, может принимать только 2 значения — true (правда) и false (ложь). В памяти занимает 1 байт.

Тип позволяет хранить 1 алфавитно-цифровой символ и занимае 1 байт. Для записи символа используются одинарные кавычки.

В памяти хранится число, соответствующее записанному символу в таблице ASCII, поэтому над переменной можно производить арифметические действия.

Переменная это типа — знаковая, диапазон допустимых значений — от -128 до 127.

Тип для хранения однобайтового целого беззнакового числа. Соответственно диапазон значений от 0 до 255.

Пожалуй самый частоиспользуемый тип для хранения целых чисел со знаком — integer (целое число). Занимает 2 байта и может хранить цисла от -32768 до 32767.

На платформе Arduino также присутствует тип , который ничем не отличается от типа int .

unsigned int

Беззнаковое целое число, занимает так же, как и int , 2 байта. Диапазон значений — от 0 до 65535.

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

unsigned long

Беззнаковое целое число расширенного диапазона может хранить значения от 0 до 4294967295 и занимает 4 байта.

float

Тип данных чисел с плавающей точкой (или с плавающей запятой). Используется для нецелочисленных расчетов. В Arduino используется например для считывания значений с аналоговых пинов. Диапазон значений от -3.4028235E+38 до 3.4028235E+38,а занимает такая переменная 4 байта.

Точность — 6-7 знаков после запятой.

double

Тип ничем не отличается от типа float и введен для обратной совместимости. На многих других платформах он имеет большую чем у float точность.

string

Тип для хранение текстовых строк. Является массивом символов типа char и символа конца строки ‘\0’ в последнем его элементе. Не путать с классами string и String .

Строка может быть создана и инициализирована несколькими способами:

Если забыть указать символ конца строки при посимвольной инициализации или не отвести под него место, то функции работы со строками будут работать некорректно.

массив

Массив — это набор элементов одного типа с доступом к каждому элементу по индексу.

Нумерация индексов массива начинается с 0.

Ключевое слово void используется при объявлении функции, которая не возвращает значения.

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

Преобразование типов — это приведение значение переменной к другому типа, отличному от типа данной переменной.

Приведение типов делится на явное и неявное.

Пример явного приведения типа:

Пример неявного приведения типа:

Условная конструкция if принимает на вход значение типа boolean , поэтому целочисленное значение переменной a будет приведено к типа boolean .

Источник

Arduino

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

Функция min(x, y)

Описание

Возвращает наименьшее из двух чисел, поддерживает все числовые типы данных.

Синтаксис
Параметры

x — первое число

y — второе число

Возвращаемое значение

Меньшее из двух чисел

Пример
Примечания

Следует избегать использования функций внутри функции, например min(a++, b); , так как из-за внутренней реализации она может вернуть неверный результат.

Функция max(x, y)

Описание

Возвращает наибольшее из двух чисел, поддерживает все числовые типы данных.

Синтаксис
Параметры

x — первое число

y — второе число

Возвращаемое значение

Наибольшее из двух чисел

Пример
Примечания

Следует избегать использования функций внутри функции, например max(a++, b); , так как из-за внутренней реализации она может вернуть неверный результат.

Функция abs()

Описание

Возвращает модуль число (абсолютное значение числа).

Синтаксис
Параметры
Возвращаемое значение

Вернет x , если x — положительное число или 0, иначе вернет -x

Пример
Примечания

Следует избегать использования функций внутри функции, например abs(a++); , так как из-за внутренней реализации она может вернуть неверный результат.

Функция constrain(x, a, b)

Описание

Функция проверяет, входит ли число x в диапазон [a..b]. Если x меньше, чем a , то функция вернет a , если x больше, чем b , то вернет b . Иначе вернет x . Поддерживает все числовые типы.

Синтаксис
Параметры

x — проверяемое число

a — нижняя граница диапазона

b — верхняя граница диапазона

Возвращаемое значение

Если x входит в диапазон [a..b], то возвращает x , если оно меньше нижней границы, то вернется a , если же оно больше верхней границы, то вернется b .

Пример
Примечания

Следует избегать использования функций внутри функции, например constrain(Serial.parseInt(), minimumValue, maximumValue); , так как из-за внутренней реализации она может вернуть неверный результат.

Функция map(value, fromLow, fromHigh, toLow, toHigh)

Описание

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

Синтаксис

map(value, fromLow, fromHigh, toLow, toHigh)

Параметры

value — число, которое следует пропорциональное перенести из первого интервала во второй

fromLow — нижняя граница текущего интервала

fromHigh — верхняя граница текущего интервала

toLow — нижняя граница целевого интервала

toHigh — верхняя граница целевого интервала

Возвращаемое значение

Число, пропорционально перенесенное из одного интервала в другой

Пример
Примечания

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

Функция pow(base, exponent)

Описание

Функция возвращает результат операции возведения числа в степень. И параметры, и результат — числа с плавающей точкой.

Источник

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

Переменная – это ячейка в оперативной памяти микроконтроллера, которая имеет своё уникальное название (а также адрес в памяти) и хранит значение соответственно своему размеру. К переменной мы можем обратиться по её имени или адресу и получить это значение, либо изменить его. Зачем это нужно? В переменной могут храниться п ромежуточные результаты вычислений, полученные “снаружи” данные (с датчиков, Интернета, интерфейсов связи) и так далее.

Измерение информации

Прежде чем перейти к переменным и их типам, нужно вспомнить школьный курс информатики, а именно – как хранятся данные в “цифровом” мире. Любая память состоит из элементарных ячеек, которые имеют всего два состояния: 0 и 1. Эта единица информации называется бит (bit). Минимальным блоком памяти, к которому можно обратиться из программы по имени или адресу, является байт (byte), который в Arduino (и в большинстве других платформ и процессоров) состоит из 8 бит, таким образом любой тип данных будет кратен 1 байту.

Максимальное количество значений, которое можно записать в один байт, составляет 2^8 = 256. В программировании счёт всегда начинается с нуля, поэтому один байт может хранить число от 0 до 255. Более подробно о двоичном представлении информации и битовых операциях мы поговорим в отдельном уроке.

Стандартные типы переменных в Arduino по своему размеру кратны степени двойки, давайте их распишем:

  • 1 байт = 8 бит = 256
  • 2 байта = 16 бит = 65 536
  • 4 байта = 32 бита = 4 294 967 296

Типы данных

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

Название Альт. название Вес Диапазон Особенность
boolean bool 1 байт * 0 или 1, true или false Логический тип
char 1 байт -128… 127 Символ (точнее его код) из таблицы ASCII
int8_t 1 байт -128… 127 Целые числа
byte uint8_t 1 байт 0… 255 Целые числа
int ** int16_t , short 2 байта -32 768… 32 767 Целые числа. На ESP8266/ESP32 – 4 байта! См. ниже
unsigned int ** uint16_t , word 2 байта 0… 65 535 Целые числа. На ESP8266/ESP32 – 4 байта! См. ниже
long int32_t 4 байта -2 147 483 648… 2 147 483 647 Целые числа
unsigned long uint32_t 4 байта 0… 4 294 967 295 Целые числа
float 4 байта 1.175E-38.. 3.402E+38 Числа с плавающей точкой, точность: 6-7 знаков
double 4/8 байт 2.225E-308.. 1.797E+308 Для AVR то же самое, что float .

На ESP и прочих 32-бит МК – 8 байт, точность – 15-16 знаков

int64_t 8 байт *** -(2^64)/2… (2^64)/2-1 Целые числа
uint64_t 8 байт *** 2^64-1 Целые числа
  • (*) – да, bool занимает 1 байт (8 бит), так как это минимальная адресуемая ячейка памяти. Есть способы запаковать логические переменные в 1 бит, о них поговорим в другом уроке.
  • (**) – на ESP8266/ESP32 int и unsigned int занимает 4 байта, то есть является аналогами типов long и unsigned long !
  • (***) – Компилятор также поддерживает 64 битные числа. Стандартные Arduino-библиотеки с переменными этого типа не работают, поэтому можно использовать только в своём коде.

Целочисленные типы

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

  • Проще ориентироваться в максимальных значениях
  • Легче запомнить
  • Название более короткое
  • Проще изменить один тип на другой
  • Размер переменной задан жёстко и не зависит от платформы (например int на AVR это 2 байта, а на esp8266 – 4 байта)

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

  • UINT8_MAX – 255
  • INT8_MAX – 127
  • UINT16_MAX – 65 535
  • INT16_MAX – 32 767
  • UINT32_MAX – 4 294 967 295
  • INT32_MAX – 2 147 483 647
  • UINT64_MAX – 18 446 744 073 709 551 615
  • INT64_MAX – ‭9 223 372 036 854 775 807

Логический тип

bool – логический, он же булевый (придуман Джорджем Булем) тип данных, принимает значения 0 и 1 или false и true – ложь и правда. Используется для хранения состояний, например включено/выключено, а также для работы в условных конструкциях.

Также переменная типа bool принимает значение true , если присвоить ей любое отличное от нуля число.

Символьный тип

char – тип данных для хранения символов, символ указывается в одинарных кавычках: char var = ‘a’; . По факту это целочисленный тип данных, а переменная хранит номер (код) символа в таблице ASCII:

Отдельный символьный тип данных нужен для удобства работы, чтобы программа могла понять разницу между числом и символом, например для вывода на дисплей (чтобы вывести именно букву A, а не число 65). Из символов можно составлять строки, об этом более подробно поговорим в уроках про символьные строки и String-строки.

Дробные числа

float (англ. float – плавающий) – тип данных для чисел с плавающей точкой, т.е. десятичных дробей. Arduino поддерживает три типа ввода чисел с плавающей точкой:

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

Выше в таблице есть пометка “точность: 6-7 знаков” – это означает, что в этом типе можно хранить числа, размер которых не больше 6-7 цифр, остальные цифры будут утеряны! Причём целой части отдаётся приоритет. Вот так это выглядит в числах (в комментарии – реальное число, которое записалось в переменную):

Другие особенности float чисел и работу с ними мы рассмотрим в уроках про математические операции и условия.

Объявление и инициализация

  • Объявление переменной – резервирование ячейки памяти указанного типа на имя: тип_данных имя;
  • Присваивание – задание переменной значения при помощи оператора = (равно): имя = значение;
  • Инициализация переменной – объявление и присваивание начального значения: тип_данных имя = значение;

Можно объявить и инициализировать несколько переменных через запятую:

  • Переменная должна быть объявлена до использования, буквально выше по коду. Иначе вы получите ошибку Not declared in this scope – переменная не объявлена.
  • Нельзя объявить две и более переменных с одинаковым именем в одной области определения.

Константы

Что такое константа понятно из её названия – что-то, значение чего мы можем только прочитать и не можем изменить: при попытке изменить получим ошибку компиляции. Задать константу можно двумя способами:

Как переменную, указав перед типом данных слово const: const тип_данных имя = значение; . Пример: const byte myConst = 10; . Фактически это будет обычная переменная, но её значение нельзя поменять. Особенности:

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

При помощи директивы #define, без знака равенства и точки с запятой в конце: #define имя значение . Пример: #define BTN_PIN 10 . Работает так: указанное имя буквально заменяется в тексте программы на указанное значение. Такая дефайн-константа:

  • Не занимает места в оперативной памяти, а хранится во Flash памяти как часть кода программы.
  • Не имеет адреса в оперативной памяти.
  • Вычисления с такими константами оптимизируются и выполняются быстрее, так как это просто цифры.
  • Если имя дефайн-константы совпадёт с именем другого “объекта” в программе или даже в библиотеке – работа может быть непредсказуемой: можно получить невнятную ошибку компиляции, либо программа может просто работать некорректно! Дефайн буквально заменяет текст в коде программы, это довольно опасная штука.

Область видимости

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

Глобальная

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

Локальная

  • Объявляется внутри любого блока кода, заключённого в < фигурные скобки >.
  • Доступна для чтения и записи только внутри своего блока кода (и во всех вложенных в него).
  • Находится в оперативной памяти с момента объявления и до закрывающей фигурной скобки, то есть удаляется из памяти и её значение стирается.
  • При объявлении имеет случайное значение.

Важный момент: если имя локальной переменной совпадает с одной из глобальных, то приоритет обращения отдаётся локальной переменной (в её области определения).

Статические переменные

Вспомним, как работает обычная локальная переменная: при входе в свой блок кода локальная переменная создаётся заново, а при выходе – удаляется из памяти и теряет своё значение. Если локальная переменная объявлена как static – она будет сохранять своё значение на всём протяжении работы программы, но область видимости останется локальной: взаимодействовать с переменной можно будет только внутри блока кода, где она создана (и во всех вложенных в него).

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

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

Иногда требуется преобразовать один тип данных в другой: например, функция принимает int , а вы хотите передать ей byte . В большинстве случаев компилятор сам разберётся и преобразует byte в int , но иногда вылетает ошибка в стиле “попытка передать byte туда, где ждут int“. В таком случае можно преобразовать тип данных, для этого достаточно указать нужный тип данных в скобках перед преобразуемой переменной (тип_данных)переменная , иногда можно встретить запись тип_данных(переменная) . Результат вернёт переменную с новым типом данных, сам же тип данной у переменной не изменится. Например:

И всё! val будет обрабатываться как int , а не как byte .

Видео


Источник

Adblock
detector