Ніжки тактовою кнопки, розташовані з одного боку, розімкнуті, коли кнопка не було натиснуто. Ніжки, розташовані одна навпроти одної на протилежних сторонах макетки і знаходяться на одній «рейці». Скориставшись цим, ми можемо розташувати резистор з одного боку макетки, а провід, що підключається до порту Arduino, з іншого боку.
В даному експерименті ми підключаємо кнопки по схемі з підтягуючим резистором.
Для того, щоб даний варіант програми працював, важливо, щоб кнопки були підключені до портів, що знаходяться поруч один з одним, тобто мають сусідні номери.
Тлумачення коду скетчу#define BUZZER_PIN 13 // пін з пищалки (англ. «buzzer»)
#define FIRST_KEY_PIN 7 // перший пін з клавішею (англ. «key»)
#define KEY_COUNT 3 // загальна кількість клавіш
недійсні установки ( )
{
pinMode ( BUZZER_PIN, OUTPUT ) ;
}
void loop ( )
{
// в циклі біжимо по всіх номерах кнопок від 0-го по 2-й
for ( int i = 0 ; i < KEY_COUNT ; ++ i ) {
// на основі номера кнопки обчислюємо номер її Піна
int keyPin = i + FIRST_KEY_PIN ;
// зчитуємо значення з кнопки. Можливі всього 2 варіанти:
// * високий сигнал, 5 вольт, істина - кнопка відпущена
// * низький сигнал, земля, брехня - кнопка затиснута
boolean keyUp = digitalRead ( keyPin ) ;
// перевіряємо умова «якщо не кнопка відпущена». Знак «!»
// перед булевої змінної означає заперечення, тобто «Не».
if ( ! keyUp ) {
// розраховуємо висоту ноти в герцах в залежності від
// клавіші, яку розглядаємо на даному етапі циклу.
// Ми отримаємо значення 3500, 4000 або 4500
int frequency = 3500 + i * 500 ;
// Змушуємо пискавку пищати з потрібною частотою протягом
// 20 мілісекунд. Якщо клавіша залишиться затиснутою, пищалка
// знову зазвучить при наступному проході loop, а ми почуємо
// безперервний звук
tone ( BUZZER_PIN, frequency, 20 ) ;
}
}
}
- Завдяки тому, що на початку програми ми визначили FIRST_KEY_PINі KEY_COUNT, ми можемо підключати будь-яку кількість кнопок до будь-яких йде один за одним цифровим пінам, і для коригування програми нам не доведеться міняти параметри циклу for. Змінити знадобиться лише ці константи:
- цикл в будь-якому випадку пробігає від 0 до KEY_COUNT;
- перед зчитуванням порту ми задаємо зсув на номер першого використовуваного порту - FIRST_KEY_PIN
- Функція digitalRead(pin) повертає стан порту, номер якого переданий їй параметром pin. Це може бути стан HIGH або LOW. Або, висловлюючись інакше: висока напруга або низька, 1 або 0, true або false
- Оскільки ми отримуємо з порту одне з двох станів, ми зберігаємо його в змінну вже знайомого нам типу boolean, і можемо працювати з нею як з логічним значенням.
- Ми використовуємо логічний оператор заперечення «не» !. Якщо keyUp має значення 0, вираз !keyUp буде мати значення 1 і навпаки.
Оскільки ми зібрали схему з підтягуючим резистором, при натисканні кнопки ми будемо отримувати на відповідному порте 0.
- Дії, описані в умовному вираженні if, виконуються, коли його умова має значення «істина» (одиниця). Тому для виконання дії після натискання, ми інвертуємо сигнал з кнопки.