Введение
Arduino IDE — это интегрированная среда разработки для контроллеров Arduino, которая позволяет написать, загрузить и отладить код. Эта среда разработки доступна для нескольких операционных систем, включая Windows. Её можно скачать сайта: https://www.arduino.cc/en/software
Тип данных int
Перед тем, как перейти к особенностям типа данных int, объясним понятие «переменные», для обозначения значений которого они используются:
Переменной называется некое хранилище в ОЗУ микроконтроллера, имеющее свое единственное имя и адрес, находящийся в памяти, а также хранящее значение(численное или буквенное). Переменные, имеющие численные значения, могут использоваться в программе для стандартных математических операций: сложение, вычитание, умножение, деление, возведение в степень и изменение типа данных. К переменной можно сослаться по её имени, а также получить и изменить ее значение. Применяются переменные, в основном, для хранения промежуточных решений или результатов вычислений, полученных из хранилищ или внешних данных, не входящих в искомое. Используются в программе в следующем виде:
<тип переменной> <наименование переменной>=<значение переменной>
int a = 1;
Как хранится информация?
Любые данные(информация, решение задачи и различные вычисления) хранятся в памяти, в то время как память состоит из элементарных хранилищ, имеющих два состояния: ложь(0) и истина(1). Такая единица информации называется битом(bit). Байт(byte) является минимальным пакетом памяти, к которому можно сослаться по имени или адресному набору непосредственно из программы. Байт, в свою очередь, в Arduino и подавляющем большинстве платформ и процессоров состоит из 8 бит. Любой тип данных кратен 1 байту.
2^8=256 является предельным количеством состояний, или же значений, которых можно записать в 8 бит или 1 байт.
Счёт в программировании идет не с единицы, а с нуля, из-за этого 1 байт хранит число в диапазоне [0;255].
Наиболее распространенные типы переменных в микропроцессоре Arduino по размеру кратны степеням двойки:
1 байт=8 бит=256
2 байта=16 бит=65 536
4 байта=32 бита=4 294 967 296
Основные типы данных
Целочисленные типы данных являются основными для хранения численных значений переменных. Наиболее распространенных из них-int.
Тип данных int используется для хранения значений целых чисел в диапазоне от
-32 768 до 32 767. Вес каждого значения-2 байта , на микроконтроллерах типа ESP8266/ESP32-4.
Помимо типа int для обозначения целых чисел используют: int8_t(вес 1 байт, диапазон от -128 до 127), byte(вес 1 байт, альтернативное название uint8_t, диапазон от 0 до 255), unsigned int(вес 2 байта, альтернативное название uint16_t и word, диапазон от 0 до 65535), long(вес 4 байта, альтернативное название int32_t, диапазон от -2147483648 до 2147483647), unsigned long(вес 4 байта, альтернативное название uint32_t, диапазон от 0 до 4294967295), а также int64_t(вес 8 байт, диапазон от -(2^64)/2 до (2^64)/2-1) и uint64_t(вес 8 байт, диапазон от -2^64+1 до 2^64-1
Переменные, хранящие целочисленные значения, имеют альтернативные названия типов, которые:
- проще запомнить в связи с более короткими названиями
- короткие альтернативные названия позволяют быстро изменить типы данных
- размер переменных не зависит от типа микропроцессора), поскольку задан жестко.
Каждый тип имеет константы максимального значения, которые можно использовать в коде.
На Arduino Uno и иных платах, основанных на базе ATmega, int хранит 16-битное(2-байтовое) значение, имеющее диапазон от -32768 до 32767(от -2^15 и 2^15-1). На платах Due и SAMD(например, MKR1000 и Zero) int хранит 32-битное(4-байтовое) значение в диапазоне от -2147483648 до 2 147 483 647(-2^31 до 2^31-1).
Данный тип данных хранит отрицательные значения при помощи метода «дополнительного кода». Знаковый разряд, или же, Бит знака, помечает его как отрицательное. Оставшиеся биты обращаются в противоположное состояние и добавляется единица.
Arduino автоматически обращает отрицательные числа для простоты его использования, но при работе битового сдвига вправо вы можете получить ошибку в вычислениях.
Приведем в пример программу, которая подсчитывает количество проведенных операций(циклов).
int countUp = 0; //создание переменной, подсчитывающей количество циклов
void setup() {
Serial.begin(9600); //даем команду послать по последовательному порту данные со скоростью 9600 бит/сек, можно использовать без указания скорости, так как это является стандартным значением
}
void loop() {
countUp++; //добавляем единицу после выполнения цикла
Serial.println(countUp); //выводим настоящее значение переменной
delay(1000);
}
При превышении максимального значения заданного типа переменная «переполняется». В такой ситуации результат неизвестен, но в большинстве случаев сигналом для этого является возврат к начальному значению переменных. Как правило, для того, чтобы избежать данной ситуации, советуем использовать тип unsigned int.
Постоянные переменные
Константа-постоянная переменная, которую невозможно изменить, она неизменна на протяжении всего выполнения команды.
Существует два способа задания константы:
- Задать ее как переменную, при этом указав постоянность перед ее заданием:
const <тип переменной> <наименование переменной>=<значение переменной>
const int a = 10;
Принцип работы данной строки заключается в том, что это обыкновенная переменная, однако она неизменна. При компиляции все пройдет без ошибок, однако переменная не изменится. Такая переменная имеет имя, к которому можно сослаться, переменная хранится в ОЗУ контроллера. Однако использование данного способа существенно влияет на быстродействие микроконтроллера: вычисления с константой не оптимизируются.
- При помощи создания макроса #define:
#define <наименование переменной> <значение переменной>
#define a 10
Макрос, созданной директивой #define хранится в Flash памяти, являются частью кода, соответственно и оптимизируются. Однако имеются и недостатки, среди которых то, что она не имеет адресного имени.
Не советуется обозначать константы именами, используемыми в вычислениях другими переменными.