уменьшить нелинейное аналоговое значение для цифровых выходов - PullRequest
0 голосов
/ 04 января 2019

Я сделал клавиатуру, которая дает мне аналоговое значение.Теперь я хочу определить, какая клавиша нажата, основываясь на сопротивлении.Однако значения являются нелинейными.

Я сделал это с большим количеством "if / else-es".Есть ли лучший способ сделать это?

if(analogValue < 159){
  keyPress(KEY_A_ACUTE);
}else if(analogValue < 400){
  keyPress(KEY_I_ACUTE);
}else if(analogValue < 537){
  keyPress(KEY_O_ACUTE);
}else if(analogValue < 624){
  keyPress(KEY_U_ACUTE);
}else if(analogValue < 685){
  keyPress(KEY_N_TILDE);
}else if(analogValue < 800){
  keyPress(KEY_E_ACUTE);
}

1 Ответ

0 голосов
/ 04 января 2019

Вы можете создать массив типа структуры и использовать цикл:

struct KeyValue
{
    int    key_name;
    int    max_value;  // Strictly less than threshold
};

static const struct KeyValue keys[] =
{
    { KEY_A_ACUTE, 159 },
    { KEY_I_ACUTE, 400 },
    { KEY_O_ACUTE, 537 },
    { KEY_U_ACUTE, 624 },
    { KEY_N_TILDE, 685 },
    { KEY_E_ACUTE, 800 },
};
enum { NUM_KEYS = sizeof(keys) / sizeof(key[0]) };

int analague_to_key_name(int analogue_value)
{
    for (int i = 0; i < NUM_KEYS; i++)
    {
         if (analogue_value < keys[i].max_value)
             return keys[i].key_name;
    }
    return KEY_UNKNOWN;
}

Единственная ошибка, связанная с значениями вне диапазона - я решил вернуть специальное значение KEY_UNKNOWN, но вы можете использовать любоесоответствующая альтернативная стратегия.Конечно, данные должны быть отсортированы в порядке возрастания max_value.

. Одним из преимуществ этого метода является то, что на него не влияют добавления в таблицу, и он может обрабатывать любые произвольные различия между пороговыми значениями.Если таблица становится достаточно большой (возможно, несколько десятков записей), вы можете переключиться на специализированный бинарный поиск по значению, которое сделает меньше сравнений.Бинарный поиск специализирован, потому что вам нужно принять диапазон;вам может понадобиться создать структуру с min_value, а также max_value.

...