Віримо в перемогу ЗСУ!
Працюємо з 09:00 до 18: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 разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Электронный термостат на нагрев или охлаждение

Электронный термостат на нагрев или охлаждение

ОписаниеПрограммируемый терморегулятор предназначен для контроля температуры в диапазоне от -50 °С д..

178.96грн.

Линейный шаговый двигатель - что это?

Линейный шаговый двигатель - что это?

Линейный шаговый двигатель Привет, друзья! Мне выпала удачная возможность познакомить вас с, разр..

Arduino 4-20 мА подключение датчика уровня

Arduino 4-20 мА подключение датчика уровня

Бывают такие времена в жизни ардуинщика, когда ему приходится из глубин любительских датчиков подыма..

Модуль термопары К-типа MAX6675 0...+1024°C

Модуль термопары К-типа MAX6675 0...+1024°C

Модуль для измерения температуры термопары на основе специализированной микросхемы MAX6675Диапа..

161.59грн.

Терминальный модуль реле для Wemos D1 mini

Терминальный модуль реле для Wemos D1 mini

Модуль для установки Wemos D1 mini с винтовыми клеммниками и одним реле. Имеет выход шины I2C норма..

197.62грн.

Теги arduino, arduino pro, arduino uno, arduino tutorial, ардуино, скетч, arduino projects, arduino уроки, arduino уроки программирования, arduino урок 1, arduino ide уроки, arduino первые уроки, arduino уроки для начинающих, alex gyver arduino уроки, arduino nano, arduino структура программы, микроконтроллер, arduino ide, ардуино уроки, ардуино уроки для начинающих, ардуино урок 1, arduino setup, arduino loop, программировать контроллер, arduino начало, arduino для начинающих