Нужна помощь с тактовой кнопкой

stambylov
stambylov аватар
Offline
Зарегистрирован: 10.05.2012

 делаю прогу, че то вголову не как не могут мысли прийти.

Смысл:

Есть тактовая кнопка, мне надо сделать так, чтобы при нажатии на неё можно ввести было пин код, а при нажатии и удержании более 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;
}

 

stambylov
stambylov аватар
Offline
Зарегистрирован: 10.05.2012

 Кто знает, помогите..

leshak
Offline
Зарегистрирован: 29.09.2011

 Еште слона по кусочкам. Выкинте из скетча lcd и аналог referece.

Заведетие "переменную счетчик" где будете отсчитвать количество нажатий.

С момощью функции millis() научитесь засекать время когда произошло "нажати/отжатие" кнопки. По их разнице - вычисляем время удержание кнопки.

Дальше у нас есть три варианта:

  1. Если разница слишком мала (меньше 50, 100 миллисекунд, подбираем это значение) - игнорируем. это дребезг кнопки
  2. Если больше 10 сек - пишем в serial  "Save detected". Отправялем текущее значение счечика и обнуляем его.
  3. Если не первое, ни второе условие не сработали - увеличиваем на единицу значение счетчика.

Когда это зарабоатет - можно озаботится "сохранением в память" (не совсем ясно что вы под этим имеете ввиду), вывод на LCD и проч.

stambylov
stambylov аватар
Offline
Зарегистрирован: 10.05.2012

 Вот чуть-чуть переписал скеч, я не стал считать кол-во нажатий, просто сделал по истечению действия по времени.

Правильно или чего не так?

но про счетчик нажатий надо будет подумать....)

#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;
}

 

leshak
Offline
Зарегистрирован: 29.09.2011

 >Правильно или чего не так?

Ну вам наверное легче ответить на этот вопрос. Залейти в дуину и проверте. А мне нужно его "выполнить в голове".

Да и в конце концов, вам нужно мое одобрение или работающий скетч? Я же не учитель который вам оценку будет ставить. Оценку ставите вы сами.

Первое что бросилось в глаза (дальше не смотрел)- строчка 31. В комментах вы написали "и время с начала нажатия" а в коде сравнили с текущем временем (временя прошедшим от старта скетча). Где вы запомнили время когда кнопка перешла из состояния 0 в состояние 1?

И еще. Попробуйте, все-таки выводить "что сейчас происходит" не миганием, а в Serial. Так как без delay() вы, пока, мигать не умеете, а куча delay() может "сбивать хронометрах". Так как в этот момент ничего не происходит и никакие события не фиксируются, скетч останавливается. Лучше их избегать.

И еще строчки 36-41 мигнут только один раз. Дальше срабоатет pwrOn==1 в строчке 31 и произойдет выход из цикла while, до следующего нажатия кнопки.

Дальше timebtn - лишняя переменная. Устанавливается - но нигде не гасится.

строка 44 - включили диод, подождали 15 сек. А дальше? Может его выключить нужно было?

Вообщем еще раз. Упростите все насколько возможно.

Выкинте вообще все. Просто засеакайте время нажатий-отжатий кнопок и отсылайте их в сериал. Когда добъетесь этого, и увидете в serial монитор что-то типа

5000:1
6000:0
9000:1
15000:0

 

(означает: на пятой секунду нажали кнопку, на 6-той отпустили, на 9-той нажали, на 15-той отпустили).

Тогда начнете усложнять свой скетч маленькими шагами.