find mean average of binary numbers
![AGCB](https://forums.parallax.com/uploads/userpics/812/nARNDBSDTILJS.jpg)
in Propeller 1
I have a wind direction indicator that uses 16 8 bit binary numbers to represent directions. Each of the 16 has 1 or 2 bits set and all others at zero. To make this easier to read, I'd like to take multiple samples and display the average. I know numerical averaging does not work. What is another way to do this?
Aaron
Comments
I've had a long week and I'm wiped out, but here's an idea: after N accumulations, do a simple linear interpolation between the highest and next highest direction accumulators.
You're talking about Cardinal directions, and since you didn't mention any wind speed measurements, they'll need to be treated as unit vectors.
There will be a total of 16 meaningful possibilities for the angles, between 0 and 360 degrees, spaced 22.5º appart.
Any mean value of such kind of dataset would only be possible to compute if you associate individual time stamps with each measurement, otherwise it'll be not possible to proceed any calculations meaningful reports, at all.
webmet.com/met_monitoring/6.html
Hope it helps
Henrique
P.S. Be sure to have a reference direction, such as North, checked with a good compass...
When and how do those bits get set?
-Phil
I’m curious to what are using as a sensor, like a wind vane mounted on a 360 continuous pot. Or several switches on multiple compass headings
The DIY sensor is a stationary ring of 8 magnetic switches. These are closed if a rotating magnet is over them or 2 are closed if magnet is between them.
I think I've found a way to average by converting (with a case table) each binary to its equivalent number of degrees on a compass. Then normal numerical averaging works. I will use 'limit minimum/maximum' to covert back to cardinal directions to display on screen.
This is just for fun with my home-made weather monitor and need not be exact (as if weather can ever be exact regardless of equipment).
Thanks for your input which piqued my brain.
Aaron
Oscillations about North (337.5° to 0°, for example) will be an exceptional case that you'll have to deal with, since simple numerical averaging won't work.
-Phil
This is really quite simple, I'm guessing your doing this in spin. Set up 16 ea. pins for input, "Dira[0]:=0" for pin 0, as example. name 16 ea. long variable such as DI0,DI1, etc. In a loop assign each varible a bit weight, such as DI0:=1, DI1:=2, DI2:=4, DI3:=8, DI4:=16, etc. So the loop would say "IF ina[0]==1 DI0:=1" have variable named "Direction", then in the" If " loop write"Direction:=DI0+DI1+DI2 etc.". Now when ever the switch closes it will give you a total bit
Thanks Phil. I've realized that but not thought about it too much yet
Yes, SPIN and I didn't mention that I'm using a 74HC165 in the antenna top unit to generate the 8 bit numbers. My wife (not a programmer had suggested a similar thing.
I actually have 2 of the antenna top units. The one up there now uses a MCP 23017 port expander (I2C), but the result is the same.
Thanks to all.
Aaron
You kind of lost me, what is an antenna top unit? Best thing to would be to post your spin code so everyone can have a look. And any pictures you want to share.
You could try something like this
The wind vane mounted on antenna tower
I've lost my cheat sheet on how to post code in a forum message. Was it something like this?
[code] program [code/]
Aaron
Used to be. Now precede and follow by three backticks (```).
-Phil
Another way you could do this would be to associate a 2D vector with each of the direction switches, take the average of all of the vectors, and compute the angle of the resulting vector. This would take care of oscillations around north and such. The magnitude of the vector would be smaller when the uncertainty/noise is higher.
That must be a C++ thing. I only do SPIN![:) :)](https://forums.parallax.com/resources/emoji/smile.png)
Anything you can do in C++, you can do in Spin.
-Phil
One accepted way to compute average wind direction is to average the sine and cosine of angle separately, then take the arctangent of the two averages.
https://en.wikipedia.org/wiki/Yamartino_method
The tough cases arise when the wind blows from everywhere, or, say, half from the south and half from the north.
The more I think about it, the less the mean direction means without the velocities associated with each reading. For example, it the wind blows at 10 mph from the East, then quells to 2 MPH from the North, what is the mean direction of those two readings? It's certainly not Northeast, since the East intensity was so much higher than that from the North. So extending Tracy's formula, average (actually just sum -- no need to average) the sine and cosine of each angle multiplied by the velocity, then take the arctangent of the result.
This is equivalent to the cumulative direction of the wind track over a period of time.
-Phil
I didn’t see any mention of a wind speed indicator. Looks like direction only switches, when the wind vane points south, the south switch closes. So hook that switch to your 180 degree pin on your prop etc. I don’t see a need for the port expander or serial to parallel. Did I miss something. For speed you could use a propeller (not a P1 or P2 , wood or plastic one) with a magnet on the shaft that triggers a reed switch. Then in spin write a rate counter for knots.
You could write direction values to the eeprom or flash card
This is a hobby weather monitor. One of three that I've built.
It does have wind speed along with recent gusts. Also, inside (4) and outside temperatures (5, including 2 ground temps @ 8 and 30") with hi's and lo's , and barometer all displayed on a VGA monitor.
As I said, it's just for fun and learning how to use Propeller 1.
It's now working to my satisfaction with the way I mentioned in post# 6 with a few tweaks.
Thanks.
Aaron
If the display permits it, a wind rose is most informative.
https://en.m.wikipedia.org/wiki/Wind_rose
That works whether it’s direction only or full vector velocity.
When I lived in Battle Creek MI, we could tell the wind direction by looking at whether or not the old guy across the street was sitting on his porch. One way was Kelloggs corn flakes, the other way was Purina dog chow. Similar concerns affect public health, like, are we currently upwind or downwind of the volcano, or the refinery.
Thanks Tracy![;) ;)](https://forums.parallax.com/resources/emoji/wink.png)
No room for something like that. On a previous program I did have a visual compass display. I sometime take these things apart just to start over and learn new things.
Aaron