Страница 26 из 26

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

Добавлено: Пт май 02, 2025 17:45:48
Уош
ну дык!. оптика, магниты... но цена.
жалею, что не собирал раньше старые мышки шариковые. Ща бы в поделки была бы кучка оптических энкодеров, а не китайское механическое унылое г...

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

Добавлено: Пт май 02, 2025 18:08:47
Gudd-Head
Магниторезитор заменить цифровым датчиком Холла, они вроде есть в обычных кулерах (переключают обмотки).

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

Добавлено: Сб май 03, 2025 09:19:41
Just_Fluffy
Уош, там слесарить еще надо, что б нормально энкодер сделать

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

Добавлено: Сб май 03, 2025 10:22:45
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;
}

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

Добавлено: Сб май 03, 2025 14:04:16
Уош
[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4711135#p4711135"]Уош, там слесарить еще надо, что б нормально энкодер сделать[/uquote]
у нас всё продумано: чпу-станочек :wink:

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

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

И даже за 80р https://www.chipdip.ru/product0/8010797720

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

Добавлено: Сб май 03, 2025 15:43:55
Just_Fluffy
BorMot, так в основном механика - самое геморойное в таких штуках.

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

Добавлено: Сб май 03, 2025 16:00:04
Уош
BorMot, мыши были бесплатно )
а так-то всё можно купить. Есть и неубиваемые оптические энкодеры в продаже, промышленные, неардуинные и нечипдипные

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

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