So this is the data that I am getting now. (code is posted below)
Count: 0
Speed: 0
DirectionCount: 0
Speed Time: 0
Direction Time: 0
Time Difference: 0
DirectionTimePeriod: 0
Speed: 4294967295
Direction: 4294967295
Time: 2861Count: 3
Speed: 820
DirectionCount: 3
Speed2: 11790
Speed Time: 11632
Direction Time: 11790
Time Difference: 158
DirectionTimePeriod: 820
Speed: 1312478
Direction: 69
Time: 12382Count: 2
Speed: 821
DirectionCount: 3
Speed2: 14252
Speed Time: 14094
Direction Time: 14252
Time Difference: 158
DirectionTimePeriod: 821
Speed: 1310880
Direction: 69
Time: 14843
For some reason my direction is always 69 +/- 1 no matter the direction the wind vein points.
I'm calculating speed and direction value using
Speedvalue = (14923600000/SpeedDuration);
---where 1492 is some arbitrary distance and 3600000 is to convert to hours from miliseconds
Directionvalue = 360TimeDifference/DirectionTimePeriod;
---I decided to divide by the period of my direction signal rather than multiply by the frequency, because I would end up getting zero because of the scaling.
I'm checking the math using the tables and they match up to be 69-ish. I guess this leads to the idea that I'm not reading the rising pulses correctly. Any thoughts?
Here is my code for now:
//////////////////////////////////////////////////////////
// Declaration of Variables //
//////////////////////////////////////////////////////////int analogSpeed = 0; //Speed bus connected to analog pin 0
int analogDirection = 1; //Direction bus connected to analog pin 1
unsigned long Speedvalue = 0;
unsigned long Directionvalue = 0;// Variables for time
unsigned long SpeedDuration;
unsigned long DirectionDuration;
unsigned long SpeedTimePrevious;
unsigned long DirectionTimePrevious;
unsigned long DirectionTimePrevious1;
unsigned long DirectionTimePeriod;
unsigned long TimeDifference;
unsigned long Frequency;// Variables for counting
volatile byte count;
volatile byte directioncount;void setup()
{
//pinMode (analogSpeed, INPUT);
//pinMode (analogDirection, INPUT);
Serial.begin(2400); // Setup serial with baud rate
attachInterrupt(0, arduino_anemometer, RISING);
attachInterrupt(1, arduino_direction, RISING);count = 0;
directioncount=0;
SpeedDuration = 0;
DirectionDuration = 0;
SpeedTimePrevious = 0;
DirectionTimePrevious = 0;
DirectionTimePrevious1 = 0;TimeDifference = 0;
}void loop()
{
///////////////////////////////////////////////////////////////////////////////////////////
// It takes about 100 microseconds to read an analog input //
// Max reading rate is 10,000 times a second //
/////////////////////////////////////////////e//////////////////////////////////////////////DO I WANT DIGITAL OR ANALOG READ?!
Speedvalue = digitalRead(analogSpeed); // Read the input pin at 0
Directionvalue = digitalRead(analogDirection); // Read the input pin at 1Serial.print("Count: ");
Serial.println(count, DEC);if (count >= 1)
{
//Calculating Speed Duration
SpeedDuration = (millis() - SpeedTimePrevious);
SpeedTimePrevious = millis();
count = 0;}
Serial.print("Speed: ");
Serial.println(SpeedDuration, DEC);
Serial.println(SpeedTimePrevious, DEC);Serial.print("DirectionCount: ");
Serial.println(directioncount, DEC);if ((SpeedTimePrevious > DirectionTimePrevious) && (directioncount >= 1))
{
DirectionDuration = (millis() - DirectionTimePrevious);
DirectionTimePrevious = millis();
DirectionTimePeriod = (DirectionTimePrevious - DirectionTimePrevious1);
directioncount = 0;Serial.print("Speed2: ");
Serial.println(DirectionTimePrevious, DEC);// Calculates Frequency between DIRECTION signals
DirectionTimePrevious1 = DirectionTimePrevious;
Frequency = 1/DirectionTimePeriod;
}// Calculates time difference between SPEED and DIRECTION signals
if (DirectionTimePrevious != 0 ) // Ensures that Direction must occur second
{
TimeDifference = (DirectionTimePrevious - SpeedTimePrevious);
}
Serial.print("Speed Time: ");
Serial.println(SpeedTimePrevious, DEC);
Serial.print("Direction Time: ");
Serial.println(DirectionTimePrevious, DEC);
Serial.print("Time Difference: ");
Serial.println(TimeDifference, DEC);
Serial.print("DirectionTimePeriod: ");
Serial.println(DirectionTimePeriod, DEC);//////////////////////////////////
// VALUES //
/////////////////////////////////
Speedvalue = (14923600000/SpeedDuration); // Finds speed of cup rotation in
Directionvalue = 360TimeDifference/DirectionTimePeriod; //Finds Angle of Wind Vein/////////////////////////////////////////////////////////////////////////////
// Printing SPEED, DIRECTION, TIME //
/////////////////////////////////////////////////////////////////////////////
Serial.print("Speed: ");
Serial.println(Speedvalue, DEC);
Serial.print("Direction: ");
Serial.println(Directionvalue, DEC);
Serial.print("Time: ");
Serial.println(millis());}
void arduino_anemometer()
{
count++;
}void arduino_direction()
{
directioncount++;
}