Уроки / Урок 4

Кнопки и подтяжка

Кнопка 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 можно спокойно использовать в своих программах. Только не держите её нажатой при включении или сбросе — плата войдёт в режим прошивки.