Нужна помощь с тактовой кнопкой
- Войдите на сайт для отправки комментариев
Чт, 10/05/2012 - 18:56
делаю прогу, че то вголову не как не могут мысли прийти.
Смысл:
Есть тактовая кнопка, мне надо сделать так, чтобы при нажатии на неё можно ввести было пин код, а при нажатии и удержании более 10 секунд, запись в память пин-кода, методом нажатия на нее.
пин-код - кол-во раз, нажатых на кнопку.
Подскажите как это осуществить...
int btnPin =2; boolean lastButton = LOW; boolean currentButton = LOW; boolean pwrOn = false; void setup() { pinMode(btnPin, INPUT); lcd.begin(16, 2); lcd.noCursor(); lcd.noBlink(); analogReference(DEFAULT); Serial.begin(9600); } void loop() { currentButton = stabilizebtnPin(lastButton); if (lastButton == LOW && currentButton == HIGH) { pwrOn = !pwrOn; } lastButton = currentButton; } boolean stabilizebtnPin(boolean last) { boolean current = digitalRead(btnPin); if (last != current) { delay(5); current = digitalRead(btnPin); } return current; }
Кто знает, помогите..
Еште слона по кусочкам. Выкинте из скетча lcd и аналог referece.
Заведетие "переменную счетчик" где будете отсчитвать количество нажатий.
С момощью функции millis() научитесь засекать время когда произошло "нажати/отжатие" кнопки. По их разнице - вычисляем время удержание кнопки.
Дальше у нас есть три варианта:
Когда это зарабоатет - можно озаботится "сохранением в память" (не совсем ясно что вы под этим имеете ввиду), вывод на LCD и проч.
Вот чуть-чуть переписал скеч, я не стал считать кол-во нажатий, просто сделал по истечению действия по времени.
Правильно или чего не так?
но про счетчик нажатий надо будет подумать....)
>Правильно или чего не так?
Ну вам наверное легче ответить на этот вопрос. Залейти в дуину и проверте. А мне нужно его "выполнить в голове".
Да и в конце концов, вам нужно мое одобрение или работающий скетч? Я же не учитель который вам оценку будет ставить. Оценку ставите вы сами.
Первое что бросилось в глаза (дальше не смотрел)- строчка 31. В комментах вы написали "и время с начала нажатия" а в коде сравнили с текущем временем (временя прошедшим от старта скетча). Где вы запомнили время когда кнопка перешла из состояния 0 в состояние 1?
И еще. Попробуйте, все-таки выводить "что сейчас происходит" не миганием, а в Serial. Так как без delay() вы, пока, мигать не умеете, а куча delay() может "сбивать хронометрах". Так как в этот момент ничего не происходит и никакие события не фиксируются, скетч останавливается. Лучше их избегать.
И еще строчки 36-41 мигнут только один раз. Дальше срабоатет pwrOn==1 в строчке 31 и произойдет выход из цикла while, до следующего нажатия кнопки.
Дальше timebtn - лишняя переменная. Устанавливается - но нигде не гасится.
строка 44 - включили диод, подождали 15 сек. А дальше? Может его выключить нужно было?
Вообщем еще раз. Упростите все насколько возможно.
Выкинте вообще все. Просто засеакайте время нажатий-отжатий кнопок и отсылайте их в сериал. Когда добъетесь этого, и увидете в serial монитор что-то типа
(означает: на пятой секунду нажали кнопку, на 6-той отпустили, на 9-той нажали, на 15-той отпустили).
Тогда начнете усложнять свой скетч маленькими шагами.