Працюємо з 09:00 до 19:00 Пн-Пт
Київ біля ТЦ Квадрат бул.Перова

Переменные в Arduino IDE разделяются на глобальные и локальные. Глобальные переменные доступны для чтения и записи в любом месте программы, в любой её функции. А к локальным переменным можно обращаться только в той функции, где они объявлены.


Глобальные переменные объявляются в тексте программы вне функций и перед всеми выражениями и функциями, внутри которых к ним планируется обращение. 


int pin1 = 13;
int pin2 = pin1 +2;
void setup() {
  pinMode(pin1, OUTPUT);
}
void loop() {
  digitalWrite(pin1, HIGH);
  delay(pin2);
  digitalWrite(pin1, LOW);
  delay(pin2);
}

Если объявить переменную в тексте программы после функции, где к ней есть обращение, то компилятор выдаст ошибку. В данном случае функция loop ничего не знает о существовании переменной g, так как она объявлена ниже по тексту программы.

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);    
  delay(g);                       
}
int g;

В процессе программирования может возникнуть накладка, когда будут объявлены две переменные с одинаковым именем глобальная и локальная. При этом компилятор не будет выдавать ошибку. И переменная с таким именем, после объявления её в функции, будет хранить новые значения только до конца выполнения этой функции, а глобально оставит старое значение. Возможно, это свойство и будет кому-то полезным, но если вы не планировали таких коллизий в своей программе, то внимательно называйте свои переменные. В данном примере в функции loop переменная pin1 хранит значение 13, а в функции setup значение 12.

int pin1 = 13;
void setup() {
  int pin1 = 12;
  pinMode(pin1, OUTPUT);
}
void loop() {
  digitalWrite(pin1, HIGH);
  delay(1000);               
  digitalWrite(pin1, LOW);
  delay(1000);                    
}

Так же в Arduino IDE стоит учитывать такую особенность: переменные , объявленные в цикле for или в других циклах, заключенных между фигурными кавычками {}, будут видны только внутри этого цикла. Так что переменная j на примере будет видна только между данными фигурными кавычками.

for (int j = 0; j < 100; j++) {
  //переменная j будет видна только 
  //внутри данного цикла for
  j = j + 5; //нет ошибки
}
j = j + 5; //ошибка

Стоит так же запомнить, что локальные переменные создаются только на время каждого выполнения функции, в которой они объявлены, и уничтожаются каждый раз по окончании ее выполнения. Но, если нужна переменная, которая должна быть видна только в конкретной функции, и при этом должна сохранять свое значение между вызовами этой функции, то объявлять такую локальную переменную нужно с префиксом static перед  её типом данных.
На примере функция myfunc1 будет при каждом вызове возвращать число 1, а myfunc2 при каждом вызове возвратит число, на единицу большее чем при предыдущем вызове.

int myfunc1() {
  int myvar1;
  myvar1 = myvar1 + 1;
  return myvar1;
}
int myfunc2() {
  static int myvar2;
  myvar2 = myvar2 + 1;
  return myvar2;
}

А теперь  подведем итоги по пройденному материалу. Переменные необходимо объявлять в тексте программы не ниже выражений, в которых они участвуют, - только выше. Локальные переменные используются только внутри функций и внутри циклов FOR и подобных, а глобальные могут быть прочитаны и изменены в любой функции программы. Локальные переменные имеют краткосрочную память – только на время одиночного выполнения функции. Но локальные переменные с префиксом static сохраняют свое значение вплоть до очистки всей оперативной памяти контроллера, как и глобальные переменные.

int RELAY_PIN = 11;//глобальная
void setup()
{
  pinMode(RELAY_PIN, OUTPUT);
  pinMode(MOTOR_PIN, OUTPUT);//ошибка
  Serial.begin(SER_SPEED);//ошибка
  int SER_SPEED = 9600;//локальная
}
int MOTOR_PIN = 3;//глобальная
unsigned long last = millis();//глобальная
void loop()
{
 if (millis() - last>SER_SPEED){ //ошибка
   digitalWrite(RELAY_PIN,HIGH);
   digitalWrite(MOTOR_PIN,HIGH);//нет ошибки
   last = millis();
 }
}

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Муфта на двигун з віссю 3мм

Муфта на двигун з віссю 3мм

Муфта для кріплення на вісь 3ммДля кріплення до вісі використовуються два притискаючих гвинтиНа флан..

37.00грн.

Оконцеватель для перетинок 2,54мм папа мама

Оконцеватель для перетинок 2,54мм папа мама

Оконцеватель 2,54 мм для самостійного виготовлення з'єднувальних кабелівВ ідеалі їх потрібно об..

0.69грн.

Електромагнітне реле 5 В

Електромагнітне реле 5 В

Має одну групу перемикаючих контактівСтрум комутації за змінної напруги 250 В - 10 А,за постійної на..

16.17грн.

Модуль датчика відстані TCRT5000

Модуль датчика відстані TCRT5000

Модуль для вимірювання відстані за інтенсивністю відбиття інфрачервоного променя від об'єкту.Має дис..

21.93грн.

Потенціометр Robotale

Потенціометр Robotale

Двохканальний змінний резистор прямолінійної конструкціїОпір 10 кОмРозміри 90 х 20 мм..

65.50грн.