Измерение скорости ветра с помощью анемометра с эффектом Холла
Мне нужна ваша помощь в решении проблемы, с которой я столкнулся при измерении скорости ветра. В моем скетче я получаю показания каждые 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++;
}
@Janith Chamalka, 👍0
Обсуждение1 ответ
Лучший ответ:
Вы можете использовать функцию millis()
для измерения временных интервалов и делать что - то регулярно в этих интервалах. Обратитесь к примеру BlinkWithoutDelay, который поставляется с Arduino IDE, или к одному из многочисленных руководств по функции
millis()
в Интернете.
В основном вам нужно будет сделать следующее:
Объявите переменную метки времени для хранения времени, когда данные отображались в последний раз (в глобальной области видимости):
unsigned long timestamp = 0;
Объявите интервал, в котором вы хотите, чтобы отображение происходило:
#define DISPLAY_INTERVAL 20000
В операторе if проверьте, больше ли разница во времени между текущим моментом и меткой времени, чем интервал
if(millis() - timestamp > DISPLAY_INTERVAL){
Обратите внимание, что вы должны делать
сравнения millis()
всегда таким образом (вычисляя разницу), чтобы опрокидываниеmillis()
не повлияло на результат.
- Измерение скорости ветра с помощью датчика Холла
- Сколько датчиков может поддерживать ARDUINO UNO?
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
к вашему сведению, самое близкое значение "км / ч" - " килограмм в час` ... в этом нет никакого смысла ... "км/ч" - это ясно, @jsotola