#26 2016-04-18 23:30:10

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: помогите новичку - счет количества нажатий кнопки

Я Вас понял сразу и правильно ( писал в AVRstudio smile ) поэтому и задал вопрос. Зачем в основном теле программы while. Я сторонник тело это скелет, и всякие while и прочее "скелету" не нужны. В теле должно быть только  проверка надо ли выполнять ту или иную процедуру (функцию) исходя из результатов других процедур. Поэтому while у меня нет, за исключением в setup жду готовности Serial. Убеждался не один раз, это источник сплошного тормоза, плюс работа с "собакой", ну вообщем этот цикл почти почти всегда можно обойти, при этом скорость выполнения программы только выигрывает.

Неактивний

#27 2016-04-19 12:00:19

ya_serega
Учасник
Зареєстрований: 2016-04-17
Повідомлень: 18

Re: помогите новичку - счет количества нажатий кнопки

NoName пише:

vvr, всем стоять, работает программист ) ya_serega, осваивает Си  после асма
ну и начал соответственно с jnc и иных goto ) пусть развлекается, вам жалко? он просто обязан пройти все велосипеды big_smile


угу , не пинайте меня слишком wink я же говорил что пока просто пробую различные варианты решения в данном случае конкретной задачи ( придуманной мной просто так - для ознакомления с языком ) . пока использую разные функции и операторы для решения одной и той же задачи , плавно переходя к построению алгоритмов программы . пока не сильно понимаю как можно организовывать циклы без условных и безусловных переходов (( наподобие

call метка
..
..
..

метка
..
..
цикл с условным переходом ( btfss бит
                                           return  )
..
..
  goto метка

  и чем while отличается от вышеописанной конструкции - ведь внутри можно написать кучу вариантов выхода из этого цикла а после узнать почему именно прошел break и дальше по if ... else организовать реакцию ? .. хотя наверное есть более простое решение ))))

Неактивний

#28 2016-04-19 12:55:43

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: помогите новичку - счет количества нажатий кнопки

я кнопку всегда делаю так -
в прерывании , по нажатию,  запускаю таймер на время дребезга,
по завершению времени проверяю нажата или нет
т.е. пока идет дребезг контакта у меня сдвигается время принятия решения
если кнопка нажата - выставлю в переменной статуса указанную кнопку

а в рабочем цикле проверю свой статус прерываний кнопок,
когда кнопку обработал удаляю из статуса
просто как топор
но есть момент, рабочий цикл не более 100 мс
что б не было заметна задержка  на нажатие ), да и нет у меня таких 
алгоритмов что б на долго удерживали  систему в паузе

в принципе возьмите за основу -
всегда работать со статусами, что бы в ПО никогда не было больших задержек  в функциях

пример - настройка модема
практически все примеры
отправляют запрос и тут же ожидают ответ
т.е. если время ожидания 10 сек  то ПО будет висеть до 10 секунд ожидая ответ
и есть есть кнопки и индикатор они уже обрабатываться не будут

Неактивний

#29 2016-04-20 13:11:09

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: помогите новичку - счет количества нажатий кнопки

Не жирно ли, прерывание?

loop()
{
  delay(1);
  if (KeyExe())
    counter++;
}

bool KeyExe()
{
  static bool key_pressed;
  static uint8_t debounce_timer;
  
  if (key_pressed != !digitalRead(KEY)) {
    key_pressed = !key_pressed;
    debounce_timer = DEBOUNCE_TIME;
  }
  else if (debounce_timer && !--debounce_timer && key_pressed)
    return true;
  return false;
}

Неактивний

#30 2016-04-20 14:22:08

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: помогите новичку - счет количества нажатий кнопки

ах , да  big_smile
забыл сказать что что я могу на любую ногу настроить прерывание ))
как говорится - обзавидуйтесь
каюсь за 15 лет забыл   что такое бывает ))))
Большинство плат Arduino/Freeduino имеют два внешних прерывания с номерами 0 (на digital pin 2) и 1 (на digital pin 3). Arduino Mega имеет дополнительно ещё четыре:
с номерами 2 (pin 21), 3 (pin 20), 4 (pin 19) и 5 (pin 18).
http://robocraft.ru/blog/arduino/45.html

да, в ардуино использовать прерывания - жирновато ), но для обучения "самэ то" )

add
Green, пример хорош )

Остання редакція NoName (2016-04-20 14:28:12)

Неактивний

#31 2016-04-20 14:29:58

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: помогите новичку - счет количества нажатий кнопки

NoName пише:

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

Естественный отбор, однако.((
Кроме того что не всегда можно, но и не всегда удобно. А 2-е, а 4-е, а комбинацИя, а автоповтор, а...?

Неактивний

#32 2016-04-20 15:55:08

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: помогите новичку - счет количества нажатий кнопки

Green пише:

Не жирно ли, прерывание?

loop()
{
  delay(1);
  if (KeyExe())
    counter++;
}

bool KeyExe()
{
  static bool key_pressed;
  static uint8_t debounce_timer;
  
  if (key_pressed != !digitalRead(KEY)) {
    key_pressed = !key_pressed;
    debounce_timer = DEBOUNCE_TIME;
  }
  else if (debounce_timer && !--debounce_timer && key_pressed)

    return true;
  return false;
}

А чего те прерывания жалеть? Кнопка по любому это пин, если это не аналоговая клава (типа шильда).  NoName написал прерывания можно настроить на любую ногу ( правда если точно то не на все, и они имеют ограничения), и под ARDUINO я видел по крайней мере две библиотеки.

Неактивний

#33 2016-04-20 16:07:13

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: помогите новичку - счет количества нажатий кнопки

Nefreemen, неправильно, я имел в виду что я использую не атмел
а в ардуино их действительно мало, и жестко привязаны к ногам (

Неактивний

#34 2016-04-20 16:13:28

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: помогите новичку - счет количества нажатий кнопки

NoName пише:

Nefreemen, неправильно, я имел в виду что я использую не атмел
а в ардуино их действительно мало, и жестко привязаны к ногам (

Да нет, смотрим даташит ATMEL и понимаем что прерываний значительно больше нежели те о которых идет речь big_smile . И есть библиотеки которые позволяют их юзать.

Неактивний

#35 2016-04-20 17:02:02

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: помогите новичку - счет количества нажатий кнопки

okay  ) не смотрел , буду знать )

Неактивний

#36 2016-04-20 17:40:22

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: помогите новичку - счет количества нажатий кнопки

Начинающему расскажите. А лучше покажите. На пальцах.))

Неактивний

#37 2016-04-20 23:41:38

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: помогите новичку - счет количества нажатий кнопки

Green пише:

Начинающему расскажите. А лучше покажите. На пальцах.))

Я например не знаю какая ардуино у Вас. Поэтому посмотрите даташит ( это самое лучше ) или установите например из под ардуино иде библиотеку по прерываниям , посмотрите примеры, прочтите рид. Одним словом практически в каждом порту есть регистры которые отвечают за прерывание на определенных пинах. Если Вы посмотрите картинки пинов ардуино то увидите например PCINT, это значит что на этот пин в библиотеке можно включить прерывание.

Неактивний

#38 2016-04-21 08:07:16

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: помогите новичку - счет количества нажатий кнопки

Не мне, ТС. И без разницы какая у него ардуина. На то она и ардуина.))

Неактивний

#39 2016-04-21 13:00:50

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: помогите новичку - счет количества нажатий кнопки

Green пише:

Не мне, ТС. И без разницы какая у него ардуина. На то она и ардуина.))

Извиняюсь. Я не правильно Вас понял.

Неактивний

#40 2017-07-08 06:03:29

Layman
Гість

Re: помогите новичку - счет количества нажатий кнопки

надеюсь эта переписка познавательный спор, а не блевота жабы корабкующеюся на корчь и при этом готова наступить на кого угодно

#41 2019-04-10 23:39:17

Дмитрий_UA1ZKI
Гість

Re: помогите новичку - счет количества нажатий кнопки

Доброго времени суток!
Просьба помочь с программкой. В наличие Ардуино Уно, шилд LCD с кнопками (LEFT, RIGHT, UP, DOWN, RESET, SELECT). 4-х релейный шилд. Это надо для коммутации элементов антенны. Там на А0 кнопки завязаны через резисторы. Управление мне удалось победить. На экране отображается (NORD V) при нажатии UP, (SOUTH /\) при нажатии DOWN и т. д., показывая направление антенны и включая соответствующие реле, подключённые на пин D13, D12, D11 и D3. Загвоздка в том, что я хочу кнопкой SELECT вызывать другой алгоритм работы релюшек. Это получилось. А вот двойное нажатие этой кнопки - другой алгоритм. Тут-то и затык. Не знаю, как красиво и недорого оформить скетч с обработкой одиночного и двойного нажатия на кнопку. Хоть ещё одну вешай, но уже к цифровым пинам.((( Если можно, помогите, детали и гонорар обсудим.

#42 2019-04-10 23:55:36

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 878

Re: помогите новичку - счет количества нажатий кнопки

возьмите готовую библиотеку для обработки кнопок (я часто использую OneButton).
раз уже что то делали, то и с библиотекой разберётесь.

Неактивний

#43 2019-04-11 08:45:54

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: помогите новичку - счет количества нажатий кнопки

#include "ky.h"


static uint8_t key;


void keyExe()
{
  static bool key_pressed;
  static uint8_t debounce_timer;
  typedef enum {SHORT, LONG } state_t;
  static state_t state;
  static uint8_t click_counter;

  if (key_pressed != get_key()) {       //change
    key_pressed = !key_pressed;
    debounce_timer = ms2sys(DEBOUNCE_TIME);
    state = SHORT;
  }
  else if (debounce_timer)              
    debounce_timer--;
  else if (key_pressed) {
    if (state == SHORT) {               //short pressed
      if (++click_counter >= MAX_SHORT_CLICK)
        click_counter = MAX_SHORT_CLICK;
      debounce_timer = ms2sys(LONG_CLICK_TIME - DEBOUNCE_TIME);
      state = LONG;
    }
    else if (state == LONG) {           //long pressed
      #ifdef REPEAT_BIT
      key = 1<<KEY_BIT | 1<<REPEAT_BIT;
      #else
      key = 1<<KEY_BIT;
      #endif
      debounce_timer = ms2sys(AUTOREPEAT_PERIOD);
      click_counter = 0;
    }
  }
  else if (state == SHORT) {            //release after short click
    debounce_timer = ms2sys(DELIMITER_TIME);
    state = LONG;
  }
  else {                                //release after DELIMITER_TIME
    key = click_counter;                //get key code
    click_counter = 0;
  }
}

Неактивний

#44 2019-04-11 10:03:02

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: помогите новичку - счет количества нажатий кнопки

И я, и я, и я  того же мнения ...

/* button reading with debounce filtering */

#define BUTTON_PIN		0
#define RELEASE_TIME	69
#define BUTTON_PRESSED	LOW

bool buttonPressed(void)
{
	static unsigned long timeout	= 0;
	static unsigned long old_time	= 0; 
	bool result;
	
	unsigned long new_time = millis();
	if (digitalRead(BUTTON_PIN) == BUTTON_PRESSED)
	{
		timeout = RELEASE_TIME;
		return true;
	}
	else 
		if (timeout = 0) result = false;
		else
			if (new_time - old_time > timeout)
			{
				timeout -= new_time - old_time;
				result = true;
			}
			else 
				{
					timeout = 0;
					result = false;
				}
	old_time = new_time;
	return result;
}

Неактивний

#45 2019-04-11 13:01:32

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 878

Re: помогите новичку - счет количества нажатий кнопки

я тоже писал для себя обработчики нажатия кнопок, пользовался чужими обработчиками и разными библиотеками - в результате
в 80% случаев применяю OneButton, в ней реализованы наверное все варианты нажатий и меня она полностью устраивает.
но это дело вкуса.
с проф. программистами спорить не буду)))))

Неактивний

#46 2019-04-11 13:46:22

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: помогите новичку - счет количества нажатий кнопки

vvr пише:

... в 80% случаев применяю OneButton, в ней реализованы наверное все варианты нажатий и меня она полностью устраивает. но это дело вкуса. с проф. программистами спорить не буду)))))

Это дело не вкуса но науки, хотя приятно когда и гайки красивые. Наверно, все возможные варианты не всегда нужны. Вот еще один любительский Button, из любви к искусству. https://github.com/slavaza/SuperButton Это сейчас любители такие пошли, Линуксы пишут, от нечего делать.

Неактивний

#47 2019-04-11 14:46:34

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 878

Re: помогите новичку - счет количества нажатий кнопки

ну он всё свёл в библиотеку, у других просто код используется))))
а OneButton ещё отслеживает удержание и фронты длительных нажатий)))

Неактивний

#48 2019-04-11 18:04:25

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: помогите новичку - счет количества нажатий кнопки

Вячеслав, библиотека это красиво, конечно. Особенно для одной кнопки.) А если их несколько? И ещё нужны их сочетания? И не везде Ардуино нужна... И даже вообще не AVR... Да и компилятор может плюсы не поддерживать... Да и места мало зачастую... ) Да и Линус плюсы терпеть не может (я ни на кого не намекаю).)))

Остання редакція Green (2019-04-11 18:13:07)

Неактивний

#49 2019-04-11 18:57:38

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: помогите новичку - счет количества нажатий кнопки

Просто нужно знать где эти плюсы вставлять. А хороший встраиваемый драйвер кнопочной клавиатуры нигде просто так не валяется. Если вам нужна клавиатура для быстрого ввода, с возможностью нажатия двух переходных клавиш, а не только клавиш модификаторов, то лучше просто купить стандартную, профессиональную.

Неактивний

#50 2019-04-11 19:28:46

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: помогите новичку - счет количества нажатий кнопки

Вячеслав, вы прикалываетесь? Какая ещё профессиональная клавиатура! Я ж вроде популярно объяснил.) У меня Си без плюсов, без зависимостей от окружения и железа. И мне не надо думать где эти плюсы брать и куда их вставлять!

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму