The Wind Has to Mean It
My cup anemometer has a problem that isn’t a problem. When a gust hits, the vane swings northwest, then north, then back to northwest, then settles on north-northwest. If I were logging this digitally—and I am, because of course I am—the raw data would show six direction changes in four seconds.
But the old-timers who built weather stations in the 1890s didn’t record every twitch. They waited. They let the vane settle. They understood, without formalizing it, that a measurement system needs commitment.
In computing, we call this hysteresis: the requirement that a signal must cross a higher threshold to change state, then a lower threshold to change back. A Schmitt trigger does this in hardware. Software can do it with two lines of logic and a bit of stubbornness.
The vane must mean it. A 10° wobble shouldn’t count. But once the wind commits to northwest and stays there? That’s data.
fun hysteresisDirection(current: Int, newReading: Int, threshold: Int = 15): Int {
val delta = (newReading - current + 540) % 360 - 180 // shortest arc
return if (kotlin.math.abs(delta) >= threshold) newReading else current
}
// Usage: only updates when wind shifts at least 15°
var heading = 0
listOf(5, 8, 12, 47, 52, 49, 180).forEach {
heading = hysteresisDirection(heading, it)
println("Reading $it° → Reported $heading°")
}
Output:
Reading 5° → Reported 0°
Reading 8° → Reported 0°
Reading 12° → Reported 0°
Reading 47° → Reported 47°
Reading 52° → Reported 47°
Reading 49° → Reported 47°
Reading 180° → Reported 180°
Those first three readings? Noise. The vane’s wobbling, not turning. But 47° commits. The system remembers until the wind moves far enough to matter again.
Forth, being the language of embedded systems and people who enjoy suffering, handles this with characteristic brevity:
variable heading
: delta ( new -- delta ) heading @ - 540 + 360 mod 180 - ;
: abs dup 0< if negate then ;
: hyst ( new threshold -- ) swap dup delta abs rot >= if heading ! else drop then ;
0 heading !
270 15 hyst heading @ . \ prints 270
275 15 hyst heading @ . \ prints 270
300 15 hyst heading @ . \ prints 300
The 1970s gave us this pattern because that’s when microcontrollers started reading analog sensors and discovering that the real world is noisy. The solution was the same insight a Victorian meteorologist would have had: don’t trust twitches. Trust commitment.
My weather station now logs a direction change only when the vane swings at least 15° from its last recorded heading and holds. The log file is quieter. The data is truer. The wind has to mean it.