Переменные
Переменная — это ячейка памяти с именем, которая хранится в памяти контроллера и содержит числовое значения или числовой код буквенного символа. С числовыми типами данных (переменными) можно выполнять все математические операции: умножение, деление, сложение, вычитание, преобразование в другой тип данных и т.п. Переменная в скетче должна быть объявлена до использования, то есть выше по коду.
Переменная имеет имя, значение и тип. Пример объявления переменной в Arduino IDE (называется декларацией):
ТИП. В вышеприведенном примере тип переменной “int”, данный тип переменной занимает два байта памяти контроллера и может хранить числа от -32768 до 32767. Какие еще бывают типы переменных и какие числа они могут хранить мы разберем немного ниже.
ИМЯ. Имя переменной в примере “pin”, переменные могут быть названы любыми именами, которые не являются ключевыми словами языка программирования Arduino.
ЗНАЧЕНИЕ. Значение может быть присвоено любое в пределах заданного типа переменной, а может и не присваиваться вообще в этом случае переменной будут присвоено число равное нулю.
Переменные могут быть локальные и глобальные, доступ к глобальной переменной имеется из любого участка кода и объявляется она вначале кода, тогда как к локальной переменной доступ можно получить только внутри функции, в которой она объявлена.
Типы переменных
От выбранного типа переменной зависит то какое значение можно в переменную записать. Следует учитывать и то, что каждый тип данных занимает определенное количество байт в памяти контроллера и, и в Arduino может быть, от одного до четырех байт. Поэтому в целях экономии ресурсов микроконтроллера, если значение переменной не будет превышать, к примеру 125, то в этом случае не нужно использовать тип long, а достаточно будет типа byte.
В Arduino IDE можно использовать нижеследующие типы переменных:
Примечание: Тип данных char используется для хранения символов, символ указывается в одинарных кавычках:
char symbol = 'a';
По факту это целочисленный тип данных, а переменная хранит номер (код) символа в таблице ASCII.
Константы
Константа — это та же самая переменная только если значение переменной можно менять, то значение константы изменять нельзя. Константа всегда будет иметь значение, которое ей было присвоено при инициализации (объявлении). Константа может иметь те же типы данных что и переменные.
В Arduino IDE константа объявляется вот так:
Директива #define
Директива #define служит исключительно для удобства программиста и улучшения читаемости текста программы. #define это директива препроцессору, перед компиляцией препроцессор пройдется по всем исходникам и заменит переменную на значение еще до компиляции скетча. Директива может быть не только числом, но и любым куском кода. Записывается обязательно в начале скетча. При компиляции (перевод скетча в бинарный код) компилятор тупо меняет такой синоним на его содержимое.
В Arduino IDE команда #define записывается вот так:
Обратите внимание что в конце строки с командой #define не ставится точка с запятой как в остальных строках с кодом.
Пример реального использования переменных, констант и директивы #define:
Проведем несколько экспериментов:
Эксперимент 1
Провел эксперимент, в котором для объявления номеров пинов применил константы затем переменные и в третьем варианте директиву #define и после каждого применённого варианта компилировал скетч и смотрел отчет о занимаемой памяти в контроллере. Как показал эксперимент что нет разницы в объёме занимаемой памяти межу тремя вышеописанными способами объявления пинов. Эксперимент проводил в ARDUINO IDE версия программы 2.3.2
Вариант1
Скетч использует 940 байт (2%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 14 байт (0%) динамической памяти, оставляя 2034 байт для локальных переменных. Максимум: 2048 байт.
Вариант2
Скетч использует 940 байт (2%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 14 байт (0%) динамической памяти, оставляя 2034 байт для локальных переменных. Максимум: 2048 байт.
Вариант3
Скетч использует 940 байт (2%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 14 байт (0%) динамической памяти, оставляя 2034 байт для локальных переменных. Максимум: 2048 байт.
Эксперимент 2
При объявлении глобальных переменных я использовал разный тип переменной, часто используемый int и реже используемый byte вот что получилось:
Вариант1 с int
Скетч использует 940 байт (2%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 14 байт (0%) динамической памяти, оставляя 2034 байт для локальных переменных. Максимум: 2048 байт.
Вариант2 с byte
Скетч использует 918 байт (2%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 12 байт (0%) динамической памяти, оставляя 2036 байт для локальных переменных. Максимум: 2048 байт.
Как видите второй вариант скетча использует на 22 байта меньше памяти устройства и также глобальные переменные второго скетча на 2 байта меньше, чем в первом варианте.
Поэтому в целях экономии занимаемой памяти и оптимизации скетча имеет смысл использовать соответствующие типы переменных. Тип переменной int занимает 2байта а тип byte занимает 1байт. На примере вышеуказанного скетча переменные tekBut и prevBut не будут принимать значения более единицы (их значения 0 и 1) и поэтому тип int к данным переменным применять не целесообразно.