Итак следующий кодинг: Код (C++): int switchPin = 2; int ledPin = 9; boolean lastButton = LOW; int SWITCH_TIME = 0; boolean currentButton = LOW; void setup() { pinMode(switchPin, INPUT); pinMode(ledPin, OUTPUT); } boolean debounce(boolean last) { boolean current = digitalRead(switchPin); if (last != current) { delay(5); current = digitalRead(switchPin); } return current; } void loop() { currentButton = debounce(lastButton); if (lastButton == LOW && currentButton == HIGH) { SWITCH_TIME = SWITCH_TIME + 3000; } lastButton = currentButton; if (SWITCH_TIME > 9000) SWITCH_TIME = 0; delay(SWITCH_TIME); digitalWrite(ledPin, HIGH); delay(1000); } Где-то имеется ошибка не нашел. Прощу помощи!!! (А сама затея по нажатию кнопки должно время прибавляться. Для эксперимента 3 сек. А патом загорается светодиод) больше 9 сек обнуляется
ради повышения собственной грамотности хочу поинтересоваться: что такое last и что такое current? и почему boolean переменные принимают значения не true/false, а low/high?
понятно. тогда по коду: Код (C++): void setup() { pinMode(switchPin, INPUT); pinMode(ledPin, OUTPUT); } boolean debounce(boolean last) { boolean current = digitalRead(switchPin); if (last != current) { delay(5); current = digitalRead(switchPin); } return current; } что собственно считывается в current? там разве что-то есть на switchPin?
Потому, что это кнопка. Ардуина должна принимать изменения уровня на switchPin при нажатии кнопки (input). Отслеживается наличие соответствующего уровня (read).
это понятно, но вот МК выполняет программу: кнопка не нажата значит там что , LOW? void loop вызывает функцию debounce(LOW), поскольку так задано в начальных условиях, видит что объявлена логическая current, но значение ее распознать не может (инициализации конкретным значением не было, а обращение к переменной идет после условия, которое никогда не выполнится, потому что current = something) или тупо считает current = false, то есть LOW и возвращает LOW, то есть currentButton = LOW, дальше if тоже false и SWITCH_TIME остается в 0, lastButton получает LOW и все по кругу.... ЕСЛИ не прав , то поправьте.
нашел. http://forum.amperka.ru/threads/Помощь-новичкам.8745/ там функция debounce() из примера взята и отличие существенное: return внутри if {..} Код (C++): /* * Функция сглаживания дребезга * принимает в качестве аргумента предыдущее состояние кнопки * и выдает фактическое. */ boolean debounce(boolean last) { boolean current = digitalRead(BUTTON); // Считать состояние кнопки if (last != current) // Если изменилось... { delay(5); // Ждем 5 мс current = digitalRead(BUTTON); // Считываем состояние кнопки return current; // Возвращаем состояние кнопки } }