Выбрать главу

Пример 4-2. Включение светодиода при нажатии кнопки

#define LED 13   // the pin for the LED

#define BUTTON 7 // the input pin where the

                 // pushbutton is connected

int val = 0; // val will be used to store the state

                 // of the input pin

void setup() {

  pinMode(LED, OUTPUT); // tell Arduino LED is an output

  pinMode(BUTTON, INPUT); // and BUTTON is an input

}

void loop(){

  val = digitalRead(BUTTON); // read input value and store it

  // check whether the input is HIGH (button pressed)

  if (val == HIGH) {

    digitalWrite(LED, HIGH); // turn LED ON

  } else {

    digitalWrite(LED, LOW);

  }

}

В среде Arduino выберите "File" > "New" (если у вас уже был открыт какой-то скетч, сохраните его). Когда Arduino спросит у вас имя папки для нового скетча, введите PushButtonControl. Напечатайте код Примера 4-2 в Arduino (или скачайте его сwww.makezine.com/getstartedarduino). Если всё сделано правильно, светодиод будет загораться когда вы нажмёте кнопку.

4.11 Как это работает?

В этом примере программы я показал две новых концепции: функция, которая возвращает результат своей работы, и выражение "if".

Выражение "if" - возможно, самая важная инструкция в языке программирования, так как она позволяет компьютеру (а мы помним что Arduino - это маленький компьютер) делать выбор. После ключевого слова "if" вы должны написать "вопрос" в круглых скобках, и если "ответ", или результат, верен, будет выполнен первый блок кода; и напротив, если ответ неверен, будет выполнен блок кода после "else". Обратите внимание, что я использовал символ "==" вместо "=". Первый используется при сравнении двух значений и возвращает "TRUE" (ИСТИНА) или "FALSE" (ЛОЖЬ); второй присваивает значение переменной. Удостоверьтесь что вы пользуетесь ими правильно, так как очень легко совершить подобную ошибку и использовать простое равно. В этом случае программа никогда не будет работать. Я знаю это по опыту 25 лет программирования и всё ещё могу ошибиться.

Держать палец на кнопке пока вам надо свет - не очень практично. Хотя это заставило-бы вас задуматься о том, сколько энергии тратися впустую когда вы оставляете лампу включённой, нам надо подумать о том, как-бы сделать чтобы кнопка "залипала".

4.12 Одна схема, тысяча применений

Огромное преимущество цифровой программируемой электроники над классической стало теперь очевидным: я покажу вас как реализовать множество различных "поведений" с использованием той-же электрической схемы из предыдущего раздела, просто изменяя программу.

Как мы поняли раньше, непрактично держать палец на кнопке чтобы свет оставался включённым. Поэтому мы должны осуществить что-то похожее на "память" в виде механизма программы, который будет запоминать что мы нажали кнопку и продолжать светить даже елси мы отпустим её.

Чтобы сделать это, нам придётся использовать нечто, называемое переменной (мы уже использовали её, но я не пояснял ничего о ней). Переменная - это место в памяти Arduino, в котором мы можем хранить данные. Думайте о ней как о липкой бумаге для заметок, которую вы иногда используете для записи чего-нибудь: например, телефонного номера - вы берёте листик, пишете на ней "Аня, 02 555 1212" и приклеиваете на компьютер. В языке Arduino это так-же легко: вы просто определяете тип данных, которые будут храниться (например, число или какой-то текст), даёте ей имя, и теперь при надобности вы можете сохранить в переменной данные, или получить их. Например:

int val = 0;

"int" означает, что в переменной будет храниться целое число, "val" - это имя переменной, а "= 0" - назначение переменной нулевого начального значения.

Переменная, как следует из названия, может быть изменена в любом месте вашего кода, так-что позднее в своей программе вы можете написать:

val = 112;

что изменит значение переменной с нуля на 112.

Примечание: Вы заметили, что Arduino каждая инструкция, кроме #define, заканчивается точкой с запятой? Это делается для того чтобы компилятор (часть Arduino, которая превращает ваш скетч в программу, которую может выполнить микроконтроллер) знал где заканчивается одно ваше выражение и начинается другое. Не забудьте использовать точку с запятой (кроме тех строк, которые начинаются с #define).

#define заменяются компилятором перед трансляцией кода в исполняемую программу.

В следующей программе val используется для хранения результата функции digitalRead(); что-бы ни получала Arduino со входа попадает в переменную и остаётся там до тех пор, пока другая строка кода не изменит её. Отметьте, что эти переменные хранятся в оперативной памяти, называемой (RAM). Она очень быстрая, но когда вы выключите свою плату, все данные в оперативной памяти будут потеряны (что означает что все переменные будут сброшены в начальные значения при включании платы). Ваша программа хранится во флеш-памяти (такой-же тип памяти используется в сотовых телефонах для хранения записной книжки) которая не изменяется при отключении платы от питания.

Давайте используем другую переменную для запоминания должен-ли светодиод оставаться включённым когда мы отпускаем кнопку. Пример 4-3 - это наша первая попытка:

Пример 4-3. Включить светодиод при нажатии кнопки и оставить его включённым при отпускании кнопки

#define LED  13  // the pin for the LED

#define BUTTON 7 // the input pin where the

                 // pushbutton is connected

int val = 0; // val will be used to store the state

                 // of the input pin

int state = 0; // 0 = LED off while 1 = LED on

void setup() {

  pinMode(LED, OUTPUT); // tell Arduino LED is an output

  pinMode(BUTTON, INPUT); // and BUTTON is an input

}

void loop() {

  val = digitalRead(BUTTON); // read input value and store it

  // check if the input is HIGH (button pressed)

  // and change the state

  if (val == HIGH) {

    state = 1 - state;

  }

  if (state == 1) {

    digitalWrite(LED, HIGH); // turn LED ON

  } else {

    digitalWrite(LED, LOW);

  }

}

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

Посмотри на интересную часть кода: state - это переменная, которая хранит значение 0 или 1 для запоминания включён светодиод или нет. После отпускания кнопки мы устанавливаем её в 0 (светодиод выключен).

Далее мы считываем текущее состояние кнопки, и если она нажата (val == HIGH), мы изменяем state с 0 на 1, или наоборот. Поскольку state может быть равна только 1 или 0, используем небольшой трюк. Он заключается в маленьком математическом выражении, идея которого состоит в том, что 1 - 0 = 1, а 1 - 1 = 0: