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

Міні вимикач 250 В 3 А

Прикольний маленький вимикач живлення, для врізання в монтажну панель або в корпус електронного прис..

12.36грн.

Кнопка без фіксації R16-503 зі світлодіодом

Кнопка без фіксації R16-503 зі світлодіодом

Кнопка з підсвіткою без фіксаціїПростий монтаж. В передній панелі пристрою просто потрібно просвердл..

30.17грн.

Підключення кнопки до Arduino

Підключення кнопки до Arduino

Спочатку я збирався написати статтю про фільтрацію брязкоту кнопки, що підключена до контролера Ardu..

Світлодіод ультраяскравий 5мм

Світлодіод ультраяскравий 5мм

Над-яскравий світлодіод діаметром 5 мм Корпус прозорий в світлодіодів різного кольору світіння. Тоб..

2.29грн.

Збільшуючий перетворювач напруги 0,9...5В у 5В

Збільшуючий перетворювач напруги 0,9...5В у 5В

Мініатюрний перетворювач напруги до 5ВВхідна напруга постійного струму 0,9 ... 5 ВНа виході USB-порт..

27.73грн.