При нажатии
кнопки наступает устойчивое состояние
только после нескольких миллисекунд .
Об этом рассказывал в уроке:
Урок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 милисек.
}