我正在开发一个从风速计读取数据的Arduino程序,如果风超过某个阈值,它会激活一个继电器。阈值可以通过两种方式设置:
1)用户可以使用两个按钮来增加或减少阈值
2)如果某个按钮保持2秒,则阈值将与当前风速同步。
我的问题是:增加和减少按钮将阈值改变+/- 0.5 km / h。但风速以0.1 km / h的精度读取。因此有时可能发生的情况是,如果当前风速为12.2 km / h,并且同步按钮被保持,则现在阈值变为12.2 km / h。没问题......
但是如果用户按下其中一个增加/减少按钮,阈值仍然会以+/- 0.5 km / h的速度变化,这意味着值会增加,如12.2,12.7,13.2,13.7等。
我希望发生的是增加/减少按钮将阈值设置为最接近的0.5倍。因此,如果使用同步按钮,并且阈值设置为12.2,则按增加按钮将更改为12.5,然后从那里继续步长为0.5。
我可以想办法解决这个问题,但是没有一种方法可以解决这个问题。我想尽可能使用最简单的解决方案。
注意:我没有包含任何代码,因为这更像是一个逻辑/伪代码问题。此外,这是我的第一篇论坛帖子,如果我需要在帖子中更改任何内容,请告诉我们!
编辑:伪,请求。
if increase button pressed
threshold+=0.5
if decrease button pressed
threshold-=0.5
if sync button held
threshold = current wind speed
答案 0 :(得分:0)
Handle_key_press_down(key, &threshold) {
min_step = 0.5
Hysteresis = min_step*0.6 // Avoid threshold that is exactly same as the current speed
New_threshold = round_to_nearest(threshold, min_step)
If (key == up) {
New_thresh = Threshold + min_step
Else if (key == down) {
New_thresh = Threshold - min_step
Else if (key == sync) {
Wait_for_release
If release_time >= 2.0s
New_thresh = round_to_nearest(Get_current() + Hysteresis, min_step)
Else
ignore
Endif
// Insure, no matter what, threshold is within design limits.
If (New_thresh > threshold_max) New_thresh = threshold_max
If (New_thresh < threshold_min) New_thresh = threshold_min
return New_thresh
}
答案 1 :(得分:0)
Arduino(grin)的复杂C ++解决方案
#include <math.h>
// button == 1 increase, button == 0 decrease
void adjust(float& level, char button) {
float floorVal2=floor(level*2); // level*2 is equiv to level/0.5
if(fabs(floorVal2-2*level)<1e-5 ) {
// they aren't close enough to consider them equal
level=
button
? (floorVal2+1)/2 // this is equiv to ceil(level/0.5)*0.5
: floorVal2/2 // this is floor(level/0.5)*0.5
;
}
else {
level += (button ? 0.5 -0.5)
}
}
void read(float& level) {
level=MySensor::getCurrentValue();
}