Кнопка! От сложного к простому.

Здесь обсуждаем Arduino
Аватара пользователя
GhostX
Сообщения: 1115
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Кнопка! От сложного к простому.

Сообщение GhostX » 04 янв 2016, 08:26

Коротенький вопрос.
Как написать кнопку, чтоб она была максимально простой в коде?
Имеем:
Кнопка простая, нажал есть контакт, отпустил пропал контакт.
Условия работы:
У нее есть защита от дребезга во всех режимах, нажата и отжата.
У нее есть ключ, нажал key = 1, отпустил key = 0.
У нее есть ключ, нажал и держи 2 сек longkey = 1, отпустил, еще раз нажал и держи 2 сек longkey = 0.
Эпилог:
Вот такая простая кнопка у меня получается в ~ 50 строк :shock: , использую только if.

PS
Deley не использывать в коде!
Последний раз редактировалось GhostX 05 янв 2016, 09:18, всего редактировалось 1 раз.

Аватара пользователя
gurvinok
Сообщения: 1484
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Кнопка! От сложного к простому.

Сообщение gurvinok » 04 янв 2016, 09:59

Тут уже необходимы счетчики, а этого в ардуине нет.
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1115
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Кнопка! От сложного к простому.

Сообщение GhostX » 04 янв 2016, 14:44

или Как нет? Аж целых 3 (жертвуя шим и другими плюшками) и внешние часы цепляй, если хочешь...
или Что такое счетчики?
:? :? :?

Аватара пользователя
gurvinok
Сообщения: 1484
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Кнопка! От сложного к простому.

Сообщение gurvinok » 04 янв 2016, 14:59

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

Аватара пользователя
GhostX
Сообщения: 1115
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Кнопка! От сложного к простому.

Сообщение GhostX » 04 янв 2016, 15:08

Зачем? Я вообще не совсем понимаю для чего в регистры лесть?! :shock:

Аватара пользователя
gurvinok
Сообщения: 1484
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Кнопка! От сложного к простому.

Сообщение gurvinok » 04 янв 2016, 18:41

Таймер настроить.
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1115
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Кнопка! От сложного к простому.

Сообщение GhostX » 04 янв 2016, 19:05

Говорить, вокруг да около, сильно поможет решению задачи?

Аватара пользователя
gurvinok
Сообщения: 1484
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Кнопка! От сложного к простому.

Сообщение gurvinok » 04 янв 2016, 21:10

Почему вокруг да около. Нужно настроить таймер и считать импульсы. Таймер настраивается через его регистры.
Если долго мучиться, может быть получится.

Аватара пользователя
GhostX
Сообщения: 1115
Зарегистрирован: 07 дек 2015, 14:40
Откуда: Рязань

Re: Кнопка! От сложного к простому.

Сообщение GhostX » 04 янв 2016, 22:27

Я же красным и жирным выделил, попроще надо.
millis() этим я считаю. И считать умею, дней аж 50. мож чуток поменьше.
еще можно микросекунды считать, тогда минут около 70...

Аватара пользователя
gurvinok
Сообщения: 1484
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: Кнопка! От сложного к простому.

Сообщение gurvinok » 05 янв 2016, 00:06

Как вариант.

Код: Выделить всё


volatile int counter;
volatile bool longkey;
volatile bool key;
volatile char test;

void setup() {

  pinMode(13, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(2,INPUT);   
  
  TCCR2B = 0x07; // Прескаллер 1024
  TIMSK2 |= (1 << TOIE2); // прерывание по переполнению
  OCR2B = 0xFF; // Считаем до 255
}

ISR(TIMER2_OVF_vect) {
  counter++;
  TCNT2 = 0x00;
}

void loop(){

  test = digitalRead(2);
  delay(100); // Защита от дребезга
  
  if(test) key = true;
  else key = false;
  
  counter = 0; // Сброс счетчика
  
  while(test) // Контроль удержания 2 секунд
  {
    test = digitalRead(2);
    if(counter == 10000) // Если удержали больше 2 секунд
    {
      longkey = !longkey;
      test = 0;
    }
  }
//----------------------------- Контроль ------------------------------------
  if(key)
  {
    digitalWrite(3, HIGH);
  }
  else
  {
    digitalWrite(3, LOW);
  }
  
  if(longkey)
  {
    digitalWrite(13, HIGH);
  }
  else
  {
    digitalWrite(13, LOW);
  }
  //--------------------------------------------------------------------------
}
Если долго мучиться, может быть получится.

Ответить