Analoga vindbommen med Auto ställa in (5 / 8 steg)
Steg 5: kod
CONST int analogInPin = A0; Analog ingång pin som potentiometern är kopplad till
CONST int analogOutPin = 9; Analog utgång pin som LED är kopplad till
CONST int tonePin = 11;
int sensorValue = 1;
flyta outputValue = 0;
flyta rawDirection = 0;
flyta maxSensorValue = 980.9999;
flyta minSensorValue = 5.0001;
int finalDirection = 0;
int biggestAddingDirection = 0;
int z = 0;
int sensorValue2 = 0;
int n = 0;
int modeSize = 0;
int c = 0;
int grad = 0;
int addingDirection [] =
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,
40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,
120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,
200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,
280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,
320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362}.
void setup()
{
pinMode (12, OUTPUT); Detta ger korta pulser av makt till sensorn från stift 12.
pinMode (13, OUTPUT);
pinMode (2, INPUT_PULLUP).
digitalWrite 13, låg.
Serial.BEGIN(9600);
medan (grad < 362) / / Set alla 362 värden till noll.
{
addingDirection [grader] = 0;
grad ++;
}
maxSensorValue = 984.9999;
}
void loop()
{
resetValues();
z = 0;
n ++;
sensorValue2 = 0;
medan (z < 10) / / få 10 snabba avläsningar.
{
z ++;
digitalWrite 12, hög.
Delay(5);
Läs analogt värde:
sensorValue = analogRead(analogInPin);
sensorValue2 = sensorValue2 + sensorValue;
digitalWrite 12, låg.
Delay(45);
}
Delay(500); ange detta till 500 så totalt dröjsmål = 1 sekund.
sensorValue = (sensorValue2/z);
anta att döda bandet börjar vid 356.5 och slutar på 0
och värden noll motsvarar 360 eller 0 grader:
Det högsta analoga läser jag får på torkar är 981
ur en möjliga utbud av 1024 (10 bitar)
om (sensorValue == 0)
{
outputValue = 0;
}
outputValue = ((sensorValue-minSensorValue)*356.5/maxSensorValue)+1.75;
selfCalibrate(); Kontrollerar den maximala räckvidden av de analoue avläsningarna när sensorn kommer från döda band.
////////////////////////////////////////////////////////////////////////////////////////////////////////
Icke-linearitet beräkningar:
Nu anta att max icke-linearitet är på 240 grader och är +0.53
Dessutom anta icke-linearitet själv är linjär, inte en kurva:
om (outputValue < 240 || outputValue == 240)
{
rawDirection = outputValue * 0,53 / 240 + outputValue;
}
om (outputValue > 240)
{
rawDirection = 0.53*(358-outputValue)/118 + outputValue;
}
om (sensorValue == minSensorValue)
{
rawDirection = 360;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
Serial.Print ("sensor =");
Serial.Print(sensorValue);
Serial.Print ("\t output =");
Serial.Print(outputValue,2);
Serial.Print ("\t justerat output =");
Serial.Print(rawDirection,2);
Serial.Print ("\t sensor maxvärde =");
Serial.Print(maxSensorValue,2);
Serial.Print ("\t Min sensor värde =");
Serial.Print(minSensorValue,2);
Serial.Print ("\t n =");
Serial.println(n);
digitalWrite 12, låg.
grad = (int) rawDirection;
///////////////////////////////////////////////////////////////////////////////////
Specialfall för rawDirection = 360:
om (rawDirection == 360)
{
grad = 359 + c.
c ++;
}
om (c > 2)
{
c = 0;
}
om (grad == 361)
{
grad = 1;
}
/////////////////////////////////////////////////////////////////////////////////////
Beräkna löpande funktionsläget (några av dessa variabler måste återställas genom ett samtal tillbaka från huvudprocessorn).
addingDirection [grader] = addingDirection [grader] + 1;
om (addingDirection [grader] > modeSize)
{
modeSize = modeSize + 1;
finalDirection = grad;
}
//////////////////////////////////////////////////////////////////////////////////////
om (finalDirection == 359 || finalDirection == 360 || finalDirection == 1)
{
finalDirection = 360;
}
Serial.Print ("läge storlek =");
Serial.Print(modeSize);
Serial.Print ("\t grad =");
Serial.Print(Degree);
Serial.Print ("\t slutliga läge riktning =");
Serial.Print(finalDirection);
Serial.Print ("\t lägga riktning [grader] =");
Serial.println(addingDirection[Degree]);
Serial.println("");
}
30 dagar = 2592000 sekunder
Varje slinga av n x 10 är tio sekunder
Varje tio sekunder max sensor värde minskas med 0,0001
Varje 30 dagar max sensor värden minskas 2592000 / 10 * 0.00001 = 25,92 grader
I 3 dagar av nordliga vindarna kommer att max sensor värde justera så mycket som 2.592 grader.
Under nordliga vindarna kommer sensorn själv kalibrera:
void selfCalibrate()
{
om (sensorValue > maxSensorValue)
{
maxSensorValue = sensorValue;
Tone(11,1000,500);
}
om (sensorValue < minSensorValue)
{
minSensorValue = sensorValue;
Tone(11,2000,500);
}
om (((n>10) & &(sensorValue>900)) || ((n>10) & &(sensorValue<100))) Bara justera min och max sensormätningar i en nordlig vind.
{
maxSensorValue = maxSensorValue - 0,01; Långsamt max drar tillbaka sensor värde.
minSensorValue = minSensorValue + 0,01; Sakta tränger framåt min sensor värde.
n = 0;
}
}
void resetValues() / / kräver en call back puls av 5 sekunder för att återställa viktiga värden.
{
int motringning = digitalRead(2);
om (callBack == låg)
{
digitalWrite 13, hög.
modeSize = 0;
Tone(11,2500,500);
medan (grad < 362)
{
addingDirection [grader] = 0;
grad ++;
}
}
annat
{
digitalWrite 13, låg.
}
}