← Бегущий огонёк | Оглавление | Миксер →
В этом эксперименте мы создаем маленькую клавиатуру, на которой можно сыграть несколько нот.
#define BUZZER_PIN 13 // пин с пищалкой (англ. «buzzer») #define FIRST_KEY_PIN 7 // первый пин с клавишей (англ. «key») #define KEY_COUNT 3 // общее количество клавиш void setup() { 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
. Изменить понадобится лишь эти константы:KEY_COUNT
;FIRST_KEY_PIN
.digitalRead(pin)
возвращает состояние порта, номер которого передан ей параметром pin
. Это может быть состояние HIGH
или LOW
. Или, выражаясь иначе: высокое напряжение или низкое, 1 или 0, true
или false
boolean
, и можем работать с ней как с логическим значением.!
. Если keyUp
имеет значение 0, выражение !keyUp
будет иметь значение 1 и наоборот.if
, выполняются, когда его условие имеет значение «истина» (единица). Поэтому для выполнения действия по нажатию, мы инвертируем сигнал с кнопки.INPUT
, но устройство работает?!
?