Пример как подключить кнопку, считывать ее нажатие и управлять светодиодом, распаянным на плате.
Понадобятся: плата Arduino, тактовая кнопка, резистор 10 кОм, макетная плата.
Схема подключения
Принцип работы
Когда тактовая кнопка не нажата контакты на ножках кнопки не замкнуты. Выход 2 через подтягивающий резистор подключен к земле. На выходе мы считываем LOW.
Когда кнопка нажата, то она соединяет выход 2 с выходом 5 Вольт на плате. Мы считываем с выхода 2 HIGH.
Можно также соединить наоборот - выход 2 через подтягивающий резистор к 5 вольтовому выходу и через кнопку к земле. В этом случае при не нажатой кнопке мы будем считывать HIGH и при нажатой LOW.
Если выход 2 не подключить через подтягивающий резистор ни к земле, ни к 5 вольтовому выходу, то на выходе будет считываться HIGH или LOW случайным образом.
// объявляем константы с номерами выходов
const int buttonPin = 2; // выход подключенный к кнопке
const int ledPin = 13; // выход к которому подключен распаянный на плате светодиод
// переменные
int buttonState = 0; // здесь мы храним значение нажата или не нажата кнопка
void setup() {
// инициализируем выход со светодиодом как OUTPUT
pinMode(ledPin, OUTPUT);
// инициализиуем выход подключенный к кнопке как INPUT
pinMode(buttonPin, INPUT);
}
void loop() {
// считываем положение кнопки
buttonState = digitalRead(buttonPin);
// если кнопка нажата, то
if (buttonState == HIGH) {
// включаем светодиод
digitalWrite(ledPin, HIGH);
} else {
// выключаем:
digitalWrite(ledPin, LOW);
}
}
Пример с антидребезгом
// объявляем константы с номерами выходов
const int buttonPin = 2; // выход подключенный к кнопке
const int ledPin = 13; // выход к которому подключен распаянный на плате светодиод
// переменные
int ledState = HIGH; // текущее значение выхода светодиода
int buttonState = 0; // текущее значение выхода, подключенного к кнопке
int lastButtonState = LOW; // предыдущее значение выхода, подключенного к кнопке
// эти переменные будут иметь тип unsigned long,
// т.к. время измеряется в миллисекундахи int переполняется
unsigned long lastDebounceTime = 0; // время последней смены значения на выходе светодиода
unsigned long debounceDelay = 50; // порог игнорирования дребезга. увеличить если есть "дребезг"
void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
//устанавливаем начальное значение на выходе светодиода
digitalWrite(ledPin, ledState);
}
void loop() {
// считываем значание с выхода подлюченного к кнопке
int reading = digitalRead(buttonPin);
// проверяем если была нажата кнопка
// (если значение сменилось с LOW на HIGH), и подождали ли мы достаточно
// чтобы отсечь дребезг:
// Если значение изменилось либо от нажатия, либо от "дребезга"
if (reading != lastButtonState) {
// сбрасываем антидребезг таймер
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// если значение не менялось больше порогового, считаем его текущим
// если значение на выходе кнопки изменилось
if (reading != buttonState) {
buttonState = reading;
// переключаем светодиод, если на выходе кнопки HIGH
if (buttonState == HIGH) {
ledState = !ledState;
}
}
}
// устанавливаем значение на выходе светодиода
digitalWrite(ledPin, ledState);
//сохраняем считанное значение как последниее, для следующего цикла
lastButtonState = reading;
}
Более продвинутый пример с антидребезгом можно найти на старом форуме
Cм. также Библиотека для работы с кнопкой shButton