Віримо в перемогу ЗСУ!
Працюємо з 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 размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
WIFI ESP8266 добовий графік температури та вологості

WIFI ESP8266 добовий графік температури та вологості

Постановка задачі Пропонуємо вашій увазі новий цікаво-корисний проект з використанням WiFi-к..

Стабілізатор напруги 3,3 В 800 мА LM1117T-3.3

Стабілізатор напруги 3,3 В 800 мА LM1117T-3.3

Стабілізатор напруги у вигляді мікросхеми з трьома ногамиВикористовується для стабілізації нестабілі..

18.76грн.

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

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

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

21.78грн.

Джойстик двохосьовий

Джойстик двохосьовий

Джойстик двохосьовий з кнопкою. Має два аналогових виходи для передачі даних про положення джой..

42.92грн.

Цифровий вольтметр + амперметр 100В 10А

Цифровий вольтметр + амперметр 100В 10А

Цифровий вольтметр та амперметр постійного струмуДіапазон вимірювання напруги 0 ...100 ВДіапазон вим..

122.27грн.