使用Arduino用户输入解决逻辑问题

时间:2016-12-12 21:33:40

标签: algorithm arduino logic pseudocode

我正在开发一个从风速计读取数据的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

2 个答案:

答案 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();
}