Кнопки и подтяжка
Кнопка BOOT, внешняя кнопка и выводы, которые работают только на вход.
На плате уже есть кнопка: BOOT подключена к GPIO0. При нажатии она соединяет вывод с землёй. Чтобы без нажатия на выводе был чёткий HIGH, включаем внутреннюю подтяжку к питанию — режим INPUT_PULLUP.
const int BTN = 0; // кнопка BOOT
const int LED = 2;
void setup() {
pinMode(BTN, INPUT_PULLUP);
pinMode(LED, OUTPUT);
}
void loop() {
bool pressed = digitalRead(BTN) == LOW; // нажата = LOW
digitalWrite(LED, pressed ? HIGH : LOW);
}Переключатель с защитой от дребезга
Контакты кнопки при нажатии несколько миллисекунд «дребезжат», и плата видит десяток нажатий вместо одного. Простая защита — после смены состояния подождать 30 мс.
const int BTN = 0;
const int LED = 2;
bool ledOn = false;
bool lastState = HIGH;
void setup() {
pinMode(BTN, INPUT_PULLUP);
pinMode(LED, OUTPUT);
}
void loop() {
bool state = digitalRead(BTN);
if (state != lastState) {
delay(30); // ждём, пока закончится дребезг
state = digitalRead(BTN);
if (state == LOW && lastState == HIGH) { // момент нажатия
ledOn = !ledOn;
digitalWrite(LED, ledOn);
}
lastState = state;
}
}Внешняя кнопка на GPIO34
Выводы GPIO34, 35, 36 (VP) и 39 (VN) работают только на вход, и внутренней подтяжки у них нет. Поэтому резистор ставим сами: 10 кОм от вывода к земле, а кнопку — от вывода к 3V3. Теперь без нажатия на выводе LOW, с нажатием — HIGH.
const int BTN = 34; // только вход, подтяжки нет
const int LED = 2;
void setup() {
pinMode(BTN, INPUT); // INPUT_PULLUP здесь не сработает
pinMode(LED, OUTPUT);
}
void loop() {
digitalWrite(LED, digitalRead(BTN)); // нажата = HIGH
}Если забыть внешний резистор, вывод «висит в воздухе» и светодиод будет мигать сам по себе — от наводок, от прикосновения пальцем к проводу.
Кнопку BOOT можно спокойно использовать в своих программах. Только не держите её нажатой при включении или сбросе — плата войдёт в режим прошивки.