Arduino.Данные
https://t.me/HotCheatSheetКонстанты
HIGH — может несколько отличаться в зависимости от того, как настроен вывод - как вход (INPUT) или как выход (OUTPUT).
Если функцией pinMode вывод сконфигурирован как вход (INPUT), то при считывании с него данных (функция digitalRead) микроконтроллер ответит HIGH в том случае, когда на выводе присутствует напряжение 3В или больше.
Если функцией pinMode вывод сконфигурирован как выход (OUTPUT) и функцией digitalWrite на него подан высокий уровень HIGH, то на выводе установится напряжение 5В.
LOW — может несколько отличаться в зависимости от того, как настроен вывод - как вход (INPUT) или как выход (OUTPUT).
Если функцией pinMode вывод сконфигурирован как вход (INPUT), то при считывании с него данных функцией digitalRead микроконтроллер ответит LOW в том случае, когда напряжение на выводе не превышает 2В.
Если функцией pinMode вывод сконфигурирован как выход (OUTPUT) и функцией digitalWrite на него подан низкий уровень LOW, то на выводе установится напряжение 0В.
INPUT
Выводы Ардуино (ATmega), сконфигурированные функцией pinMode() как входы (INPUT), находятся в высокоимпедансном состоянии. Это эквивалентно подключению к выводу последовательного резистора в 100 МОм, поэтому к цепям, подключенным к таким выводам, не предъявляется практически никаких требований. Такой режим удобен для считывания сигналов с датчиков, но не приемлем для питания светодиодов.
OUTPUT
Микроконтроллер ATmega в Ардуино имеет внутренние подтягивающие резисторы (резисторы, подключенные к питанию внутри микросхемы), которыми можно управлять. Если вы предпочитаете использовать их вместо внешних резисторов, подключенных к земле, - используйте параметр INPUT_PULLUP в функции pinMode(). Это позволит инвертировать поведение подключенного к выводу внешнего датчика: HIGH будет означать его отключение, а LOW - включение.
INPUT_PULLUP
Выводы, сконфигурированные функцией pinMode() как выходы (OUTPUT), находятся в низкоимпедансном состоянии. Это означает, что они могут обеспечить внешние цепи относительно большим током. Микроконтроллер ATmega может отдавать (положительный ток) или принимать (отрицательный) ток до 40 мА (миллиампер) от внешних устройств/цепей. Такой режим удобен для питания светодиодов, но бесполезен при считывании сигналов с датчиков. Выводы, сконфигурированные как выход, также могут быть выведены из строя при коротком замыкании на землю либо на цепь питания 5В.
true — булево значение равное 1, и вообще все символы не равные нулю.
false — булево значение равное 0.
целочисленные константы — набираемые числа, интерпретируемые как числа в десятичной системе счисления, поэтому для задания числа в другой системе необходимо использовать специальные префиксы.
Модификаторы:
'u' или 'U', чтобы привести константу к беззнаковому типу данных.
'l' или 'L', чтобы привести константу к типу данных long.
'ul' или 'UL', чтобы привести константу к типу unsigned long.
Примеры:
10 (десятичная) - 123
2 (двоичная) - B1111011, префикс - "B", работает только с 8-битными значениями (0 - 255), корректные символы 0-1
8 (восьмеричная) - 0173, префикс - "0", корректные символы 0-7
16 (шестнадцатиричная) - 0x7B, префикс - "0x", корректные символы 0-9, A-F, a-f
33u - имеет тип данных unsigned.
100000L - имеет тип данных long.
32767ul - имеет тип данных unsigned long.
константы с плавающей точкой — работает подобно целочисленным константам. Также имеет имеет символ экспоненты 'e' или 'E'.
10.0 равняется 10
2.34E5 равняется 234000
67e-12 равняется .000000000067
Типы данных
void — используется только при объявлении функций. Оно указывает на то, что объявляемая функция не возвращает никакого значения той функции, из которой она была вызвана.
Пример:
// операции выполняются в функциях "setup" и "loop"
// но общей программе никакой информации не возвращается
void setup()
{
// ...
}
void loop()
{
// ...
}
boolean — булевый символ имеет одно из двух значений: true или false.
Пример:
int LEDpin = 5; // светодиод подключен к выводу 5
int switchPin = 13; // ключ подключен к выводу 13, другой вывод подключен к земле
boolean running = false;
void setup()
{
pinMode(LEDpin, OUTPUT);
pinMode(switchPin, INPUT);
digitalWrite(switchPin, HIGH); // включить подтягивающий резистор
}
void loop()
{
if (digitalRead(switchPin) == LOW)
{ // ключ нажат - вывод подтянут к высокому уровню сигнала
delay(100); // задержка для устранения дребезга контактов ключа
running = !running; // инвертирование переменной running
digitalWrite(LEDpin, running) // индикация светодиодом
}
}
char — тип данных, который занимает в памяти 1 байт и хранит символьное значение. Символы пишутся в одинарных кавычках, например: 'A' (совокупность символов - строки - пишутся в двойых кавычках: "ABC").
Пример:
char myChar = 'A'; char myChar = 65; // оба значения эквивалентны
unsigned char — беззнаковый тип данных, занимающий в памяти 1 байт. Диапазон от 0 до 255.
Пример:
unsigned char myChar = 240;
byte — хранит 8-битное беззнаковое число, от 0 до 255.
Пример:
byte b = B10010; // "B" - префикс двоичной системы счисления (B10010 = 18 в десятичной системе)
int — основной тип данных для хранения чисел. Диапазон от -32768 до 32767.
Синтаксис:
int var = val;
Параметры:
var - имя вашей переменной типа int
val - значение, присваиваемое этой переменной
Пример:
int ledPin = 13;
unsigned int — схож с int-переменными тем, что они содержат двухбайтовые значения. Диапазон от 0 до 65535.
Синтаксис:
unsigned int var = val;
Параметры:
var - имя переменной типа unsigned int
val - значение, присваиваемое этой переменной
Пример:
unsigned int ledPin = 13;
word — хранит 16-битное беззнаковое число в диапазоне от 0 до 65535.
Пример:
word w = 10000;
long — обладает расширенным размером для хранения чисел и имеют размерность 32 бита (4 байта). Диапазон от -2 147 483 648 до 2 147 483 647.
Синтаксис:
long var = val;
Параметры:
var - имя переменной типа long
val - значение, присваиваемое этой переменной
Пример:
long speedOfLight = 186000L; // для справки о префиксе 'L' смотрите раздел о целочисленных константах
unsigned long — обладает расширенным размером для хранения чисел и имеют размерность 32 бита (4 байта). Диапазон от 0 до 4 294 967 295.
Синтаксис:
unsigned long var = val;
Параметры:
var - имя переменной типа unsigned long
val - значение, присваиваемое этой переменной
Пример:
unsigned long time;
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.print("Time: ");
time = millis();
//выводим время с момента запуска программы
Serial.println(time);
//ждем 1 секунду, чтобы не отсылать большой массив данных
delay(1000);
}
short — 16-битный тип данных. Диапазон от -32768 до 32767.
Синтаксис:
short var = val;
Параметры:
var - имя переменной типа short
val - значение, присваиваемое этой переменной
Пример:
short ledPin = 13;
float — часто используется для представления аналоговых или непрерывных величин. Диапазон от -3.4028235E+38 до 3.4028235E+38.
Синтаксис:
float var = val;
Параметры:
var - имя переменной типа float
val - значение, присваиваемое этой переменной
Пример:
float myfloat; float sensorCalbrate = 1.117;
double — дробное число двойной точности. В Uno и других платах на базе микроконтроллеров ATmega переменные типа double занимают 4 байта. Другими словами, в этих устройствах переменные типа double полностью аналогичны переменным float без какого-либо прироста точности.
string — массив символов, можно использовать тип данных String, который входит в ядро; либо объявить строку как массив символов char с нулевым символом в конце.
Пример:
char Str1[15];
char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'};
char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'};
char Str4[ ] = "arduino";
char Str5[8] = "arduino";
char Str6[15] = "arduino";
Преобразование типов
char() — приводит значение к типу char.
Синтаксис:
char(x)
Параметры:
x: значение любого типа
Возвращаемые значения:
char
byte() — приводит значение к типу byte.
Синтаксис:
byte(x)
Параметры:
x: значение любого типа
Возвращаемые значения:
byte
int() — приводит значение к типу int.
Синтаксис:
int(x)
Параметры:
x: значение любого типа
Возвращаемые значения:
int
word() — приводит значение к типу word или создает значение типа word из двух байт.
Синтаксис:
word(x)
word(h, l)
Параметры:
x: значение любого типа
h: старший байт (левая часть) значения word
l: младший байт (правая часть) значения word
Возвращаемые значения:
word
long() — приводит значение к типу long.
Синтаксис:
long(x)
Параметры:
x: значение любого типа
Возвращаемые значения:
long
float() — приводит значение к типу float.
Синтаксис:
float(x)
Параметры:
x: значение любого типа
Возвращаемые значения:
float
Область видимости переменной и спецификаторы
Область видимости переменной
Глобальная переменная - эта та переменная, которая может быть доступна ("видна") из любой функции программы.
Локальные переменные доступны только внутри тех функций, в которых они объявлены.
Пример:
int gPWMval; // эта переменная будет доступна из любой функции
void setup()
{
// ...
}
void loop()
{
int i; // переменная "i" "видна" только внутри "loop"
float f; // переменная "f" "видна" только внутри "loop"
// ...
for (int j = 0; j <100; j++){
// переменная j доступна только внутри скобок цикла for
}
}
static — используется для создания переменных, которые будут видны только одной функции.
Пример:
/* RandomWalk
* Paul Badger 2007
* RandomWalk в случайном порядке перемещается вверх или вниз между двумя
* точками. Длина максимального перемещения за один цикл задается
* параметром "stepsize".
* Статическая переменная увеличивается или уменьшается на случайную величину.
* Эта техника также известна как "розовый шум" или "пьяная походка".
*/
#define randomWalkLowRange -20
#define randomWalkHighRange 20
int stepsize;
int thisTime;
int total;
void setup()
{
Serial.begin(9600);
}
void loop()
{ // функция randomWalk
stepsize = 5;
thisTime = randomWalk(stepsize);
Serial.println(thisTime);
delay(10);
}
int randomWalk(int moveSize){
static int place; // переменная для хранения величины случайного перемещения - объявлена как static, поэтому
// сохраняет свое значение между вызовами функции. При этом другие функции не могут ее изменить
place = place + (random(-moveSize, moveSize + 1));
if (place < randomWalkLowRange){ // проверка нижнего и верхнего пределов
place = place + (randomWalkLowRange - place); // восстановление числа в положительном направлении
}
else if(place > randomWalkHighRange){
place = place - (place - randomWalkHighRange); // восстановление числа в отрицательном направлении
}
return place;
}
volatile — спецификатор переменной. Как правило, употребляется перед указанием типа переменной, чтобы изменить порядок ее обработки компилятором и последующей программой.
Пример:
// переключение светодиода при изменении состояния вывода
int pin = 13;
volatile int state = LOW;
void setup()
{
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, CHANGE);
}
void loop()
{
digitalWrite(pin, state);
}
void blink()
{
state = !state;
}
const — спецификатор, который изменяет поведение переменной и делает ее доступной только для чтения.
Пример:
const float pi = 3.14; float x; // .... x = pi * 2; // удобно использовать константы при математических вычислениях pi = 7; // ошибка - нельзя записывать значения (изменять) константы
Вспомогательная функция
sizeof() — возвращает количество байт, занимаемых типом переменной, либо количество байт, занимаемых массивом.
Синтаксис:
sizeof(variable)
Параметры:
variable: переменная любого типа или массив (например, int, float, byte)
Пример:
char myStr[] = "this is a test";
int i;
void setup(){
Serial.begin(9600);
}
void loop() {
for (i = 0; i < sizeof(myStr) - 1; i++){
Serial.print(i, DEC);
Serial.print(" = ");
Serial.write(myStr[i]);
Serial.println();
}
delay(5000); // задержка программы
}