При нажатии кнопки наступает устойчивое состояние только после нескольких миллисекунд . Об этом рассказывал в уроке: Урок2. Нажатие кнопки без ложных срабатываний.Устраняем дребезг кнопки
Вот так выглядит дребезг кнопки.

Мы знаем, что дребезг проявляется в течение нескольких миллисекунд после замыкания контактов. Чтобы исправить ситуацию, после нажатия кнопки, подождите 5 мсек до считывания. Это время для человека является практически мгновенным, а Arduino прекрасно работает с такими короткими промежутками времени, и эти 5 мсек. позволят отсечь дребезг контактов кнопки.
const int buttonPin = 2; // номер входа, подключенный к кнопке
const int ledPin = 3; // номер выхода светодиода
/* переменные */
boolean lastButten = LOW; // предыдущее состояние кнопки
boolean currentButten = LOW; // текущее состояние кнопки
boolean ledOn = false; // текущее состояние свтодиода
void setup() // Функция setup()
{
// инициализируем пин, подключенный к светодиоду, как выход
pinMode(ledPin, OUTPUT);
// инициализируем пин, подключенный к кнопке, как вход
pinMode(buttonPin, INPUT);
}
boolean debvance (boolean last) //убираем дребизг
{
boolean current = digitalRead (buttonPin); // считываем данные с кнопки
if (last != current) // Если текущее состояние отличететься от предыдущего
{
delay (5); // Ждем 5 милисек.
current = digitalRead (buttonPin); // Присваеваем текущее состояние кнопки
return current;
}
}
void loop() // Функция loop
{
currentButten = debvance (lastButten); // Передаем функции дребезга значение по умолчанию LOW
if (lastButten == LOW && currentButten == HIGH) // Проверяем отпускали мы кнопку или нет
{
ledOn = !ledOn; // инвертируем значение
}
lastButten = currentButten; // Переприсваеваем прошлое состояние кнопки
digitalWrite(ledPin, ledOn); // Включаем или выключаем светодиот (смотря что пришло после инверсии)
delay (2); // Ждем 2 милисек.
}
Работа с кнопками. Дата публикации 10 декабря , 2019