2016-12-12 2 views
0

Я работаю над программой Arduino, которая считывает данные с анемометра, и если ветер превышает определенный порог, он активирует реле. Порог может быть установлен двумя способами:Решение логической проблемы с использованием пользовательского ввода Arduino

1) пользователь может использовать две кнопки, чтобы увеличить или уменьшить порог

2) Если определенная кнопка удерживается в течение 2 секунд, порог будет синхронизировать с током скорость ветра.

Моя проблема заключается в том, что кнопки увеличения и уменьшения изменяют пороговое значение на +/- 0,5 км/ч. Но скорость ветра считывается с точностью 0,1 км/ч. Так что иногда может случиться, что если текущая скорость ветра, скажем, 12,2 км/ч, а кнопка синхронизации удерживается, порог теперь составляет 12,2 км/ч. Проблем еще нет ...

Но если пользователь нажимает одну из кнопок увеличения/уменьшения, порог все равно изменяется на +/- 0,5 км/ч, что означает, что значения будут увеличиваться как 12,2, 12,7, 13,2, 13,7 и т. д.

Что бы я хотел, чтобы кнопки увеличения/уменьшения добавляли пороговое значение до ближайшего 0,5 кратного. Поэтому, если была использована кнопка синхронизации, а порог был установлен на 12.2, нажатие кнопки увеличения изменилось бы на 12,5, а затем продолжилось с шагом 0,5 оттуда.

Я могу придумать несколько способов исправить эту проблему, но ни одна из них не очень элегантна. Я хочу использовать самое простое решение.

Примечание: я не включаю ни один из моих кодов, потому что это скорее вопрос логики/псевдокода. Кроме того, это мой первый форум, поэтому дайте мне знать, если мне нужно что-то изменить в моем посте!

EDIT: Pseudo, по запросу.

if increase button pressed 

    threshold+=0.5 

if decrease button pressed 

    threshold-=0.5 

if sync button held 

    threshold = current wind speed 
+0

Похоже, у вас есть 3 кнопки: "две кнопки для увеличения или уменьшения" и "кнопки синхронизации". Это верно? – chux

+0

Даже псевдокод публикации может помочь объяснить проблему и использовать текущий подход. Пример: когда нажата кнопка «Синхронизация» и вызывает _пороговый == current_, затем последующие, но минутные изменения открывают и закрывают реле, возможно, много раз. Похоже на хорошее место для небольшого гистерезиса. – chux

+0

Я добавил псевдо на свой пост. И да, есть 3 кнопки. – user7287356

ответ

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 
} 
0

Сложные C++ решение для Arduino (ухмыляясь)

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