The WindNerd Core library provides wind speed and direction measurements from the WindNerd Core sensor board or alternative board based on same design.
Internally it:
- counts rotor pulses to compute wind speed
- reads the TMAG5273 magnetic sensor for wind direction
- samples data periodically
- stores samples in a rolling buffer
- computes averaged/min/max wind reports
- controls the diagnostic LEDs: speed LED blinks at each rotation, north LED turns ON when the vane is indicating north
Applications can obtain data using either:
- Pull-based access (poll samples or reports when needed)
- Push-based access (receive updates via callbacks)
The minimal setup runs the anemometer and lets you retrieve wind data from the internal buffer.
The user must:
- Instantiate WN_Core
- Call begin()
- Call loop() frequently
- Pull samples when needed
Example
#include <Windnerd_Core.h>
WN_Core Anemometer;
void setup() {
Anemometer.begin();
}
void loop() {
Anemometer.loop();
// read the latest sample
wn_instant_wind_sample_t sample = Anemometer.getSampleIndexedFromLast(0);
Serial.print("Speed: ");
Serial.print(sample.speed);
Serial.print(" Direction: ");
Serial.println(sample.dir);
}
What happens internally:
- Rotor pulses are counted using interrupts
- Direction is sampled periodically and averaged over 3 seconds
- Every 3 seconds a new wind sample (instant speed + wind direction) is generated
- Samples are stored in a rolling buffer
If Arduino loop() is blocked too long (>50ms), samples may be dropped.
In the pull model, your application retrieves wind data whenever it wants.
This is useful when:
- your firmware already has its own scheduler
- you want full control over when data is processed
wn_instant_wind_sample_t sample = Anemometer.getSampleIndexedFromLast(0);
Structure:
wn_instant_wind_sample_t
{
float speed;
uint16_t dir;
}
Fields:
| Field | Description |
|---|---|
| speed | wind speed in selected unit (default m/s) |
| dir | direction in degrees (0-359) |
The rolling buffer stores samples for the last 20 minutes (400 samples)
index 0 → newest sample
index 1 → previous sample
index N → older samples
Example:
wn_instant_wind_sample_t sample = Anemometer.getSampleIndexedFromLast(5);
Compute statistics over the most recent period for a duration given in seconds.
Example for the last minute:
wn_wind_report_t report = Anemometer.computeReportForRecentPeriodInSec(60);
Structure:
wn_wind_report_t
{
float avg_speed;
float min_speed;
float max_speed;
uint16_t avg_dir;
}
Fields:
| Field | Description |
|---|---|
| avg_speed | average wind speed |
| min_speed | minimum wind speed |
| max_speed | maximum wind speed |
| avg_dir | vector-averaged wind direction |
Alternatively, computeReportForPeriodInSecIndexedFromLast allows to compute a report for an anterior period of time
For example:
wn_wind_report_t report = Anemometer.computeReportForPeriodInSecIndexedFromLast(60, 1);
This creates a report for the period between 2 minutes ago and 1 minute ago.
In the push model, the library calls your code whenever new wind data is available.
This is useful when:
- you want event-driven firmware
- you want to minimize polling
- you want immediate processing of new measurements
Called every sampling window (~3 seconds).
void onInstantWind(wn_instant_wind_sample_t sample)
{
Serial.print("Speed: ");
Serial.println(sample.speed);
}
void setup()
{
Anemometer.onInstantWindUpdate(onInstantWind);
}
Called at the configured reporting interval.
void onWindReport(wn_wind_report_t report)
{
Serial.print("Avg speed: ");
Serial.println(report.avg_speed);
}
void setup()
{
Anemometer.onNewWindReport(onWindReport);
}
The library exposes configuration functions to adapt behavior to different installations.
Anemometer.setSpeedUnit(UNIT_MS);
Available units:
| Unit | Description |
|---|---|
| UNIT_MS | meters per second |
| UNIT_KN | knots |
| UNIT_KPH | kilometers per hour |
| UNIT_MPH | miles per hour |
Anemometer.setFrequencyToWindSpeedRatio(1.31);
Default value 1.31 corresponds to the standard WindNerd rotor.
Controls how long wind data is averaged when using push mode.
Anemometer.setAveragingPeriodInSec(60);
Constraints:
period >= 3 seconds
period <= 1200 seconds
Controls how often a wind report is produced when using push mode.
Anemometer.setReportingIntervalInSec(60);
Example:
| Averaging | Reporting |
|---|---|
| 600s | 60s |
This produces a rolling 600-second average updated every 60 seconds.
Depending on how the vane magnet was mounted, you may need to invert the polarity if you notice south and north are inverted.
Anemometer.invertVanePolarity(true);
Low power mode reduces vane measurement frequency.
Anemometer.enableLowPowerMode();
Behavior changes:
| Feature | Normal | Low Power |
|---|---|---|
| vane sampling | every 100 ms | every 500 ms |
| LED activity | enabled | disabled |
Disable with:
Anemometer.disableLowPowerMode();