Опрос кнопок микроконтроллером

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Уош
Опытный кот
Сообщения: 700
Зарегистрирован: Вс мар 23, 2025 14:56:55

Re: Опрос кнопок микроконтроллером

Сообщение Уош »

ну дык!. оптика, магниты... но цена.
жалею, что не собирал раньше старые мышки шариковые. Ща бы в поделки была бы кучка оптических энкодеров, а не китайское механическое унылое г...
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Опрос кнопок микроконтроллером

Сообщение Gudd-Head »

Магниторезитор заменить цифровым датчиком Холла, они вроде есть в обычных кулерах (переключают обмотки).
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: Опрос кнопок микроконтроллером

Сообщение Just_Fluffy »

Уош, там слесарить еще надо, что б нормально энкодер сделать
Белая и Пушистая
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: Опрос кнопок микроконтроллером

Сообщение OKF »

Опять кнопки.) Давеча китайские часы модифицировал. А там аж 5 аналоговых. Пришлось выборочно с некоторыми работать.
Спойлер

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

// analogue key
#include "adc.h"


#define KEY               C,7,H         //A7

//key: ALARM MODE LIGHT UP DOWN         //adc min level
#define KEY_ALARM_LEVEL    80           //4
#define KEY_MODE_LEVEL    230           //98
#define KEY_UP_LEVEL      330           //241
#define KEY_DOWN_LEVEL    410           //347
#define KEY_LIGHT_LEVEL   500           //427

#define KEY_ALARM         (1<<0)        //code
#define KEY_MODE          (1<<1)
#define KEY_UP            (1<<2)
#define KEY_DOWN          (1<<3)
#define KEY_LIGHT         (1<<4)
#define LONG_BIT          (1<<5)
#define REPEAT_BIT        (1<<6)
#define KEY_ALARM_LONG    (KEY_ALARM | LONG_BIT)
#define KEY_MODE_LONG     (KEY_MODE  | LONG_BIT)
#define KEY_LIGHT_LONG    (KEY_LIGHT | LONG_BIT)
#define KEY_UP_LONG       (KEY_UP    | LONG_BIT)
#define KEY_DOWN_LONG     (KEY_DOWN  | LONG_BIT)
#define KEY_UP_REPEAT     (KEY_UP    | LONG_BIT | REPEAT_BIT)
#define KEY_DOWN_REPEAT   (KEY_DOWN  | LONG_BIT | REPEAT_BIT)

#define DEBOUNCE_TIME     50            //short
#define REPEAT_DELAY      800           //long - задержка перед LONG
#define REPEAT_TIME       100           //repeat long - автоповтор при LONG


#define key_init()        //adcInit();

// однократный опрос, на выходе: код кнопки
inline uint8_t get_key() {
  uint16_t adc = getAdc(_bn(KEY));
  // if (adc < 1000) { con_int(adc); con_write(' '); } //DEBUG
  if (adc < KEY_ALARM_LEVEL) return KEY_ALARM;
  if (adc < KEY_MODE_LEVEL)  return KEY_MODE;
  if (adc < KEY_UP_LEVEL)    return KEY_UP;
  if (adc < KEY_DOWN_LEVEL)  return KEY_DOWN;
  if (adc < KEY_LIGHT_LEVEL) return KEY_LIGHT;
  return 0;
}

uint8_t key();
Не аккуратненько. Но для сельской местности сойдёт.)
Спойлер

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

#include "main.h"
#include "akey.h"


// SHORT - при отжатии, LONG - при нажатии, LONG REPEAT (UP/DOWN) - при удержании
uint8_t key() {
  typedef enum {SHORT, LONG, LONG_LONG} state_t;
  static state_t state;
  static uint8_t short_key;
  static uint16_t timer;

  uint8_t k = get_key();
  for_change(k)                         //change
    timer = ms2sys(DEBOUNCE_TIME);
  if (timer)
    --timer;
  else if (k) {
    if (state == SHORT) {               //начало нажатия
      state = LONG;
      short_key = k;                    //запомним для отжатия
      timer = ms2sys(REPEAT_DELAY - DEBOUNCE_TIME) - 1;
    }
    else if (state == LONG) {           //длинное нажатие
      state = LONG_LONG;
      timer = ms2sys(REPEAT_TIME) - 1;
      short_key = 0;                    //wo press
      return k | LONG_BIT;
    }
    else if (k & (KEY_UP | KEY_DOWN)) { //повтор только для UP/DOWN!
      timer = ms2sys(REPEAT_TIME) - 1;
      return k;
    }
  }
  else if (state != SHORT) {            //released
    state = SHORT;
    return short_key;                   //0 after a long
  }
  return 0;
}
Уош
Опытный кот
Сообщения: 700
Зарегистрирован: Вс мар 23, 2025 14:56:55

Re: Опрос кнопок микроконтроллером

Сообщение Уош »

[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4711135#p4711135"]Уош, там слесарить еще надо, что б нормально энкодер сделать[/uquote]
у нас всё продумано: чпу-станочек :wink:
Аватара пользователя
BorMot
Нашел транзистор. Понюхал.
Сообщения: 169
Зарегистрирован: Пн сен 23, 2024 07:37:53

Re: Опрос кнопок микроконтроллером

Сообщение BorMot »

Тогда об чем плач Ярославны по мышам шариковым, невинно убиенным?
Вот за 150 рублей электронно-оптическая часть, без механики и даже приардуиненая: https://www.chipdip.ru/product0/8753510820

И даже за 80р https://www.chipdip.ru/product0/8010797720
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

Re: Опрос кнопок микроконтроллером

Сообщение Just_Fluffy »

BorMot, так в основном механика - самое геморойное в таких штуках.
Белая и Пушистая
Уош
Опытный кот
Сообщения: 700
Зарегистрирован: Вс мар 23, 2025 14:56:55

Re: Опрос кнопок микроконтроллером

Сообщение Уош »

BorMot, мыши были бесплатно )
а так-то всё можно купить. Есть и неубиваемые оптические энкодеры в продаже, промышленные, неардуинные и нечипдипные
Аватара пользователя
BorMot
Нашел транзистор. Понюхал.
Сообщения: 169
Зарегистрирован: Пн сен 23, 2024 07:37:53

Re: Опрос кнопок микроконтроллером

Сообщение BorMot »

Что до механики в тех мышах, так это просто слёзы. Диск дырчатый пластиковый, одно целое с валом, и это всё вставлялось в пластиковые же "подшипники" путём вдавливания за счёт упругости материала. Диск в любом случае пришлось бы переделывать по числу дырок или собачить редуктор, а это уже действительно механика. При наличии же станка ЧПУ не стоит об этом и говорить.
А что до бесплатности, я свои мыши покупал а не расхищал на рабочем месте. Расхищал я шаговые двигатели :))) , вернее спасал от вторчермета. Итого, имеем 2 оптодатчика на одну мышь, эквивалент 160 рублей. Стоит ли оно сожаления?
Ответить

Вернуться в «Периферия»