Кнопка и светодиод

Один вход и один выход: кнопка на D2 с подтяжкой 10 кОм к +5 В, светодиод на D13 через резистор 220 Ом. Отсюда видно, почему нажатая кнопка читается как LOW.

Программа

// Кнопка и светодиод — вход, выход и одна проверка между ними.
//
// Кнопка подключена «на землю» с подтяжкой 10 кОм к +5 В:
//   отпущена — на D2 висит +5 В через резистор  → digitalRead даёт HIGH;
//   нажата   — вывод замкнут на землю           → LOW.
// Поэтому условие «нажата» пишется как == LOW, и это нормально.
const int BTN = 2;
const int LED = 13;

void setup() {
  pinMode(BTN, INPUT);
  pinMode(LED, OUTPUT);
  Serial.begin(9600);

  // Небольшая пауза перед первым чтением: пока питание и подтяжка не
  // установились, на входе может оказаться что угодно.
  delay(50);
  Serial.println(digitalRead(BTN) == LOW ? "кнопка нажата" : "кнопка отпущена");
}

void loop() {
  int now = digitalRead(BTN);
  digitalWrite(LED, now == LOW ? HIGH : LOW);

  // Печатаем только смену состояния, иначе монитор порта заливает одним и тем же.
  // static — переменная объявляется ОДИН раз и живёт между вызовами loop();
  // обычная локальная обнулялась бы каждый проход, и прошлое состояние помнить
  // было бы негде. Строка с «=» тоже выполняется один раз, на первом проходе,
  // поэтому was сразу получает настоящее состояние кнопки, а не выдумку.
  static int was = digitalRead(BTN);
  if (now != was) {
    was = now;
    Serial.println(now == LOW ? "нажата" : "отпущена");
  }
  delay(20);   // заодно гасит дребезг контактов
}

Схема примера появится, когда загрузится страница: её собирает и считает движок цепей.

← Ко всем примерам