Измерение скорости ветра с помощью анемометра с эффектом Холла

Мне нужна ваша помощь в решении проблемы, с которой я столкнулся при измерении скорости ветра. В моем скетче я получаю показания каждые 20 отсчетов, когда магнит проходит мимо датчика. Мне нужно изменить его, чтобы получать показания каждые 20 секунд. Как я могу сделать это с минимальными изменениями в скетче?

volatile byte revolutions;

float rpmilli;
float speed;


unsigned long timeold=0;

void setup()
{
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(2), rpm_fun, RISING);

  revolutions = 0;
  rpmilli = 0;
  timeold = 0;
}

void loop()
{
  if (revolutions >= 20) { 
    //Update RPM every 20 counts, increase this for better RPM resolution,
    //decrease for faster update

    // calculate the revolutions per milli(second)
    rpmilli = ((float)revolutions)/(millis()-timeold);

    timeold = millis();
    revolutions = 0;

    // WHEELCIRC = 2 * PI * radius (in meters)
    // speed = rpmilli * WHEELCIRC * "milliseconds per hour" / "meters per kilometer"

    // simplify the equation to reduce the number of floating point operations
    // speed = rpmilli * WHEELCIRC * 3600000 / 1000
    // speed = rpmilli * WHEELCIRC * 3600

    speed = rpmilli * 0.6597 * 3600;

    Serial.print("RPM:");
    Serial.print(rpmilli * 60000);
    Serial.print(" Speed:");
    Serial.print(speed);
    Serial.println(" kph");
  }
}

void rpm_fun()
{
  revolutions++;
}

, 👍0

Обсуждение

к вашему сведению, самое близкое значение "км / ч" - " килограмм в час` ... в этом нет никакого смысла ... "км/ч" - это ясно, @jsotola


1 ответ


Лучший ответ:

2

Вы можете использовать функцию millis() для измерения временных интервалов и делать что - то регулярно в этих интервалах. Обратитесь к примеру BlinkWithoutDelay, который поставляется с Arduino IDE, или к одному из многочисленных руководств по функции millis() в Интернете.

В основном вам нужно будет сделать следующее:

  1. Объявите переменную метки времени для хранения времени, когда данные отображались в последний раз (в глобальной области видимости):

     unsigned long timestamp = 0;
    
  2. Объявите интервал, в котором вы хотите, чтобы отображение происходило:

     #define DISPLAY_INTERVAL  20000
    
  3. В операторе if проверьте, больше ли разница во времени между текущим моментом и меткой времени, чем интервал

     if(millis() - timestamp > DISPLAY_INTERVAL){
    

    Обратите внимание, что вы должны делать сравнения millis() всегда таким образом (вычисляя разницу), чтобы опрокидывание millis() не повлияло на результат.

,