减少非线性模拟值到数字输出
reduce nonlinear analog value to digital outputs
我做了一个键盘,可以给我一个模拟值。现在我想根据电阻检测按下哪个键。然而,这些值是非线性的。
我用了很多 "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);
}
您可以创建结构类型的数组并使用循环:
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;
}
唯一的问题是处理超出范围的值 — 我选择 return 一个特殊的 KEY_UNKNOWN 值,但您可以使用任何合适的替代策略。当然,数据必须按 max_value
.
的升序排列
此技术的一个优点是它不受 table 添加的影响,并且可以处理阈值之间的任意差异。如果 table 变得足够大(可能有几十个条目),您可以切换到对值进行专门的二进制搜索,这样可以减少比较。二进制搜索是专门的,因为您需要接受一个范围;您可能需要使用 min_value
和 max_value
.
创建结构
我做了一个键盘,可以给我一个模拟值。现在我想根据电阻检测按下哪个键。然而,这些值是非线性的。
我用了很多 "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);
}
您可以创建结构类型的数组并使用循环:
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;
}
唯一的问题是处理超出范围的值 — 我选择 return 一个特殊的 KEY_UNKNOWN 值,但您可以使用任何合适的替代策略。当然,数据必须按 max_value
.
此技术的一个优点是它不受 table 添加的影响,并且可以处理阈值之间的任意差异。如果 table 变得足够大(可能有几十个条目),您可以切换到对值进行专门的二进制搜索,这样可以减少比较。二进制搜索是专门的,因为您需要接受一个范围;您可能需要使用 min_value
和 max_value
.