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

Привет! Мне нужна ваша помощь в решении проблемы, с которой я столкнулся. Я пытаюсь измерить скорость ветра с помощью датчика Холла, неодимового магнита и приведенного ниже кода. Но я получаю только значение “0” для обоих значений RPM и KPH. Можете ли вы помочь мне решить эту проблему?

volatile byte revolutions;

unsigned int 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 >= 1) {
         //Обновляйте обороты каждые 20 отсчетов, увеличивайте их для лучшего разрешения оборотов,
//уменьшайте для более быстрого обновления
         //  вычислить обороты в милли(секунду)
         rpmilli = revolutions/(millis()-timeold);

         timeold = millis();
         revolutions = 0;
         // WHEELCIRC = 2 * PI * радиус (в метрах)
         // скорость = rpmilli * WHEELCIRC * “миллисекунды в час” / “метры на километр”

         // упростите уравнение, чтобы уменьшить количество операций с плавающей запятой
         // speed = rpmilli * WHEELCIRC * 3600000 / 1000
         // speed = rpmilli * WHEELCIRC * 3600

         speed = rpmilli 1.288053600;

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

void rpm_fun()
{
    revolutions++;
}

, 👍1


1 ответ


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

3
rpmilli = revolutions/(millis()-timeold);

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

rpmilli = ((float)revolutions)/(millis()-timeold);

и измените rpmilli на float.

,

Большое вам спасибо за помощь, @Janith Chamalka