- •Что такое Arduino?
- •Структура:
- •Void setup()
- •Void loop()
- •Управляющие операторы
- •Прочий синттаксис
- •Арифметические операции
- •Логические операции
- •Указатели и ссылки
- •Битовые операции
- •Операторы сравнения:
- •If / else
- •Регистры портов
- •Compound Operators
- •Константы
- •Типы данных
- •Конвертирование типов переменных
- •Область действия переменной и квалификаторы
- •Volatile
- •Утилиты
- •Цифровой ввод вывод
- •Аналоговый ввод вывод
- •Расширенный ввод вывод
- •Математические функции
- •Тригонометрические функции
- •Функции случайных чисел
- •Биты и байты
- •Функции прерываний
- •Interrupts()
- •Коммуникации
- •Int Serial.Available()
- •Int Serial.Read()
- •Библиотеки
- •Eeprom Library
- •Ethernet library
- •Firmata Library
- •LiquidCrystal Library
Конвертирование типов переменных
Функции конвертирования типов переменных.
В качестве входного параметра принимается переменная любого типа.
Функция синтаксис тип возвращаемой переменной
char() char(x) char
byte() byte(x) byte
int() int(x) int
word() word(x) word(h, l) word
long() long(x) long
float() float(x) float
Область действия переменной и квалификаторы
Область действия переменной
Переменные в языке C имеют область действия переменной. Глобальные переменные видимы в любой функции программы. Локальные переменные видимы только для функции, в которой они были объявлены. В среде разработки Arduino глобальными, считаются все переменные объявленные вне функций.
Когда программа становится большой и более сложной, локальные переменные -являются отличным способом обезоапасить себя от лишних проблем, поскольку доступ к ним есть только у объявившей их функции. Это исключает ошибки модификации этой переменной другой функцией.
Иногда удобно объявлить переменную в теле цикла. В этом случае создается переменная, доступ к которой есть только внутри цикла.I
Пример:
int gPWMval; // глобальная переменная
void setup()
{
// ...
}
void loop()
{
int i; // "i" локальная переменная, видимая только для "loop"
float f; // "f" локальная переменная, видимая только для "loop"
// ...
for (int j = 0; j <100; j++){
// доступ к j есть толкьо внутри цикла.
}
}
Static
Слово Static используется для создания переменной, видимой только для одной фнукции. В отличие от уничтожаемой каждый раз при выходе из функции локальной переменной, эта остается объявленной.
Переменые, объявленные как Static будут созданы лишь однажды, при первом вызове функции.
Пример:
/* RandomWalk
* Paul Badger 2007
* RandomWalk wanders up and down randomly between two
* endpoints. The maximum move in one loop is governed by
* the parameter "stepsize".
* A static variable is moved up and down a random amount.
* This technique is also known as "pink noise" and "drunken walk".
*/
#define randomWalkLowRange -20
#define randomWalkHighRange 20
int stepsize;
int thisTime;
int total;
void setup()
{
Serial.begin(9600);
}
void loop()
{ // tetst randomWalk function
stepsize = 5;
thisTime = randomWalk(stepsize);
Serial.println(thisTime);
delay(10);
}
int randomWalk(int moveSize){
static int place; // variable to store value in random walk - declared static so that it stores
// values in between function calls, but no other functions can change its value
place = place + (random(-moveSize, moveSize + 1));
if (place < randomWalkLowRange){ // check lower and upper limits
place = place + (randomWalkLowRange - place); // reflect number back in positive direction
}
else if(place > randomWalkHighRange){
place = place - (place - randomWalkHighRange); // reflect number back in negative direction
}
return place;
}
Volatile
volatile это слово, известное как квалификатор переменной, оно обычно пишется перед типом переменной.
Объвление переменной как volatile является директивой компилятора. Компилятор - это программа, которая транслирует ваш C/C++ код в машинный код, который явлется настоящими инструкциями для чипов ATmega/
В частности данная дирректива указывает компилятору загружать переменную из ОЗУ, а не из регистров процессора, являющимися временным местом дисклокации переменных, с которыми в данный момент оперирует процессор. В некоторых случаях значение переменной, сохраненной в регистре может стать неточным.
Переменная должна быть объявлена как volatile в случае, если она может быть внезапно изменена во время выполнения основной программы. В МК таким слабым местом является использование прерываний.
Пример
// toggles LED when interrupt pin changes state
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
Данный квалификатор определяет перменную как read-only - только для чтения. Это значит, что вы можете использовать значение переменной, но не можете его менять. В случе обращения к перезаписи такой переменной компилятор выдаст ошибку.
Константы, объявленные квалификаторм const подчинаются всем правилам переменных. Это значит, что можно не использовать #define для объявления константы и использвоание const является более правильным,ч ем использование #denife.
Пример;
const float pi = 3.14;
float x;
// ....
x = pi * 2; // it's fine to use const's in math
pi = 7; // illegal - you can't write to (modify) a constant
#define или const
Вы можете использовать const или #define для создания цифровых или строковых констант. Для массивов вы можете использовать только const. На практике использование const имеет преимущество перед #define.
Переменные в языке C имеют область действия переменной.
Глобальные переменные видимы в любой функции программы. Локальные переменные видимы только для функции, в которой они были объявлены. В среде разработки Arduino глобальными, считаются все переменные объявленные вне функций.
Когда программа становится большой и более сложной, локальные переменные -являются отличным способом обезоапасить себя от лишних проблем, поскольку доступ к ним есть только у объявившей их функции. Это исключает ошибки модификации этой переменной другой функцией.
Иногда удобно обхъявлить переменную в теле цикла. В этом случае создается переменная, доступ к которой есть только внутри цикла.I
Пример:
int gPWMval; // глобальная переменная
void setup()
{
// ...
}
void loop()
{
int i; // "i" локальная переменная, видимая только для "loop"
float f; // "f" локальная переменная, видимая только для "loop"
// ...
for (int j = 0; j <100; j++){
// доступ к j есть толкьо внутри цикла.
}
}
