Нужна помощь с тактовой кнопкой
- Войдите на сайт для отправки комментариев
Чт, 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 и проч.
Вот чуть-чуть переписал скеч, я не стал считать кол-во нажатий, просто сделал по истечению действия по времени.
Правильно или чего не так?
но про счетчик нажатий надо будет подумать....)
#define TIME_1 6000 // Время работы 1 режим в секундах #define DELAY_1 500 // Задержка в 1 секунду #define DELAY_2 1000 // Задержка в 2.5 секунду #define DELAY_3 15000 // Задержка в 15 секунд int btnPin = 2; int ledPin = 11; boolean lastButton = LOW; boolean currentButton = LOW; boolean pwrOn = false; int ledPin = LOW; int timebtn = 0; void setup() { pinMode(btnPin, INPUT); pinMode(ledPin, OUT); Serial.begin(9600); } void loop() { currentButton = stabilizebtnPin(lastButton); if (lastButton == LOW && currentButton == HIGH){ pwrOn = !pwrOn; } lastButton = currentButton; int time = 0; time = millis(); while (pwrOn == 1 && time< TIME_1){ // Пока кнопка нажата и время с начала нажатия меньше 6 сек, мигаем светодиодом один раз в секунду. digitalWrite(ledPin, HIGH); delay(DELAY_1); digitalWrite(ledPin, LOW); delay(DELAY_1); if (pwrOn == 0){ // если кнопка не нажата, то мигаем светодиодом 1 раз в 2 секунды digitalWrite(ledPin, HIGH); delay(DELAY_2); digitalWrite(ledPin, LOW); delay(DELAY_2); } } timebtn = 1; // если действие наступило, то вкл. светодиод digitalWrite(ledPin, HIGH); delay(DELAY_3); } boolean stabilizebtnPin(boolean last) { boolean current = digitalRead(btnPin); if (last != current) { delay(5); current = digitalRead(btnPin); } return current; }>Правильно или чего не так?
Ну вам наверное легче ответить на этот вопрос. Залейти в дуину и проверте. А мне нужно его "выполнить в голове".
Да и в конце концов, вам нужно мое одобрение или работающий скетч? Я же не учитель который вам оценку будет ставить. Оценку ставите вы сами.
Первое что бросилось в глаза (дальше не смотрел)- строчка 31. В комментах вы написали "и время с начала нажатия" а в коде сравнили с текущем временем (временя прошедшим от старта скетча). Где вы запомнили время когда кнопка перешла из состояния 0 в состояние 1?
И еще. Попробуйте, все-таки выводить "что сейчас происходит" не миганием, а в Serial. Так как без delay() вы, пока, мигать не умеете, а куча delay() может "сбивать хронометрах". Так как в этот момент ничего не происходит и никакие события не фиксируются, скетч останавливается. Лучше их избегать.
И еще строчки 36-41 мигнут только один раз. Дальше срабоатет pwrOn==1 в строчке 31 и произойдет выход из цикла while, до следующего нажатия кнопки.
Дальше timebtn - лишняя переменная. Устанавливается - но нигде не гасится.
строка 44 - включили диод, подождали 15 сек. А дальше? Может его выключить нужно было?
Вообщем еще раз. Упростите все насколько возможно.
Выкинте вообще все. Просто засеакайте время нажатий-отжатий кнопок и отсылайте их в сериал. Когда добъетесь этого, и увидете в serial монитор что-то типа
(означает: на пятой секунду нажали кнопку, на 6-той отпустили, на 9-той нажали, на 15-той отпустили).
Тогда начнете усложнять свой скетч маленькими шагами.