Доброго времени суток. Кто нибудь сможет объяснить простым языком, как в этом скетче работает антидребезг? Я уже весь мозг себе сломал. Раньше пользовался этой схемой антидребезга: http://wiki.amperka.ru/конспект-arduino:кнопочный-переключатель Там мне все понятно. Опрашиваем пин с кнопкой и если условие истина то ставим delay(), контакты успокаиваются и снова считываем. А вот другое решение антидребезга: if (butt == 1 && butt_flag == 0 && millis() - last_press > 50) //обработка нажатия если, к примеру, первые два условия истина, значение millis равно или больше 51, last_press равно 0 тогда 51 - 0 > 50, выражение - истина, выполняется код ниже. А где же пауза для успокоения контактов и повторное считывание кнопки? скетч взят здесь Код (C++): boolean butt_flag = 0; boolean butt; boolean led_flag = 0; unsigned long last_press; void setup() { pinMode(3, INPUT_PULLUP); Serial.begin(9600); pinMode(13, OUTPUT); } void loop() { butt = !digitalRead(3); if (butt == 1 && butt_flag == 0 && millis() - last_press > 50) //обработка нажатия { butt_flag = 1; Serial.println("Button was pressed"); led_flag = !led_flag; digitalWrite(13, led_flag); last_press = millis(); } if (butt == 0 && butt_flag == 1 && millis() - last_press > 50) //обработка отпускания { butt_flag = 0; Serial.println("Button was released"); last_press = millis(); } }
Как же Как же это происходит? при нажатии кнопки (значение милис больше 50) срузу же выполняется код ниже...
обратите внимание, что значение с пина кнопки инвертировано. Поэтому при первом нажатии условие не выполнится. Но по моему. код ошибочный. Первый раз он выполняется вообще без нажатия при старте ардуины...
Кнопка подключена с подтяжкой при нажатии дает 0, поэтому сигнал переворачиваем, просто для удобства-нажал-1, отпустил-0
Спойлер: код Код (C++): /**/ const byte btnPin = 3; const byte ledPin = 13; boolean btn = false; boolean led = 0; unsigned long past; //---------------------------------- void setup() { Serial.begin(9600); pinMode(btnPin, INPUT_PULLUP); pinMode(ledPin, OUTPUT); } void loop() { boolean tmp = digitalRead(btnPin); switch (btn) { case false: if (!tmp && millis() - past >= 50) { past = millis(); btn = true; Serial.println("Button ON"); led = !led; digitalWrite(ledPin, led); } break; case true: if (tmp && millis() - past >= 50) { past = millis(); btn = false; Serial.println("Button OFF"); } break; } }
Напишите, пожалуйста, ка эта строчка читается if(butt ==1&& butt_flag ==0&& millis()- last_press >50)
Может, лучше с учебника начать? Сейчас даже на смартфонах приложения есть, где в форме заданий обучение идёт.
Как я это понимаю: если butt - истина и если butt_flag - истина и если millis()- last_press >50 (если в момент нажатия кнопки милис имела значение, к примеру, 1000) т.е. 1000 - 0 > 50 это тоже истина, значит выполняем код ниже.
Нет. Если ((butt РВАВНО единице) И (butt_flag РАВНО 0) И (текущее значение миллис МИНУС последнее значение миллис после нажатия БОЛЬШЕ 50))
Буквы читать научились, а слова из букв нет. Если кнопка в этом лупе нажата, а в прошлом лупе нет и когда время таймера истекло, то сделать следующую последовательность. Ну нельзя же быть блондинкой и помнить только последнее предложение. Скетч вы сами же привели.
т.е. если перефразировать концовку Вашего сообщения, вот эту вот часть last_press >50 можно назвать (грубо говоря) 50 миллисекунд с момента нажатия? Прошу прощения, я знаю, что я тугодум, но очень хочеться разобраться...=)