Входы и опрос
В предыдущих главах мы в основном использовали выводы GPIO как выходы: включали и выключали светодиоды. Однако выводы GPIO можно настроить и как входы: тогда программа сможет считывать сигналы из внешнего мира, например нажатия кнопок или переключение тумблеров. В этой главе мы научимся считывать такие входные сигналы и делать с ними что-нибудь полезное.
Чтение состояния кнопок
На micro:bit v2 есть две физические кнопки, Button A и Button B, подключённые к выводам GPIO, настроенным как входы. Точнее, Button A подключена к выводу P0.14, а Button B — к выводу P0.23. (Это можно проверить по официальной таблице выводов.)
Чтение состояния входа GPIO сводится к проверке того, высокий ли уровень напряжения на выводе (3,3 В, логическая единица) или низкий (0 В, логический ноль). Каждая кнопка micro:bit подключена к выводу. Когда кнопка не нажата, вывод удерживается в высоком уровне; когда кнопка нажата, вывод удерживается в низком.
Теперь применим эти знания, чтобы считать состояние Button A: проверим, находится ли она в «низком» уровне (то есть нажата).
#![no_main]
#![no_std]
use cortex_m_rt::entry;
use embedded_hal::digital::InputPin;
use microbit::Board;
use panic_rtt_target as _;
use rtt_target::{rprintln, rtt_init_print};
#[entry]
fn main() -> ! {
rtt_init_print!();
let board = Board::take().unwrap();
let mut button_a = board.buttons.button_a;
let mut button_state = false;
loop {
if button_a.is_low().unwrap() {
if !button_state {
button_state = true;
rprintln!("Button A pressed");
}
} else if button_state {
button_state = false;
rprintln!("Button A not pressed");
}
}
}
Мы в цикле смотрим на состояние кнопки и сообщаем каждый раз, когда оно меняется.