вычисление скорости ветра по значению частоты - PullRequest
0 голосов
/ 07 мая 2018

У меня есть датчик скорости ветра NRG # 40, выходная частота линейна со скоростью ветра диапазон выходного сигнала от 0 Гц до 125 Гц Среднее значение 0 Гц = 0,35 м / с и 125 Гц = 96 м / с, а передаточная функция равна м / с = (Гц х 0,765) + 0,35 Как я могу связать этот датчик с мега Arduino ранее я подключал Adafruit (ID продукта: 1733), который выходное напряжение не частота, линейная со скоростью ветра и этот код для Adafruit:

 //Setup Variables

const int sensorPin = A0; //Defines the pin that the anemometer output is connected to
int sensorValue = 0; //Variable stores the value direct from the analog pin
float sensorVoltage = 0; //Variable that stores the voltage (in Volts) from the anemometer being sent to the analog pin
float windSpeed = 0; // Wind speed in meters per second (m/s)

float voltageConversionConstant = .004882814; //This constant maps the value provided from the analog read function, which ranges from 0 to 1023, to actual voltage, which ranges from 0V to 5V
int sensorDelay = 1000; //Delay between sensor readings, measured in milliseconds (ms)

//Anemometer Technical Variables
//The following variables correspond to the anemometer sold by Adafruit, but could be modified to fit other anemometers.

float voltageMin = .4; // Mininum output voltage from anemometer in mV.
float windSpeedMin = 0; // Wind speed in meters/sec corresponding to minimum voltage

float voltageMax = 2.0; // Maximum output voltage from anemometer in mV.
float windSpeedMax = 32; // Wind speed in meters/sec corresponding to maximum voltage



void setup() 
{              
  Serial.begin(9600);  //Start the serial connection
}


void loop() 
{
sensorValue = analogRead(sensorPin); //Get a value between 0 and 1023 from the analog pin connected to the anemometer

sensorVoltage = sensorValue * voltageConversionConstant; //Convert sensor value to actual voltage

//Convert voltage value to wind speed using range of max and min voltages and wind speed for the anemometer
if (sensorVoltage <= voltageMin){
 windSpeed = 0; //Check if voltage is below minimum value. If so, set wind speed to zero.
}else {
  windSpeed = (sensorVoltage - voltageMin)*windSpeedMax/(voltageMax - voltageMin); //For voltages above minimum value, use the linear relationship to calculate wind speed.
}

 //Print voltage and windspeed to serial
  Serial.print("Voltage: ");
  Serial.print(sensorVoltage);
  Serial.print("\t"); 
  Serial.print("Wind speed: ");
  Serial.println(windSpeed); 

 delay(sensorDelay);
}

1 Ответ

0 голосов
/ 07 мая 2018

Если вы используете Arduino UNO или Nano, простой способ - подключить датчик к контакту D2 или D3, который можно использовать как контакты прерывания. Затем вы создаете функцию или ISR, которая вызывается каждый раз, когда датчик пульсирует. Затем вы присоединяете вновь созданную функцию к выводу прерывания. Так это будет выглядеть примерно так.

byte sensorPin = 2;
double pulses = 0;
double wSpeed = 0;
long updateTimer = 0;
int updateDuration = 3000;

void setup() {
  Serial.begin(115200);
  pinMode(sensorPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(sensorPin), sensorISR, FALLING);
}

void loop() {
  long now = millis();
  if(updateTimer < now) {
    updateTimer = now + updateDuration;
    wSpeed = ((pulses/(updateDuration/1000)) * 0.765) + 0.35;
    pulses = 0;
    Serial.println("Windspeed is:" + String(wSpeed));
  }
}

void sensorISR() {
  pulses++;
}

Работа только функций ISR заключается в увеличении переменной импульсов для каждого импульса. Затем каждую секунду вы можете рассчитать частоту и скорость. Если вместо этого вы подождете 3 секунды, как описано выше, у вас будет лучшее разрешение, но вам придется учитывать дополнительное время в уравнении.

Я не тестировал этот код.

...