Paso 5: código
const int analogInPin = A0; Clavija de entrada analógica que el potenciómetro se une a const int analogOutPin = 9; Pin que está conectado el LED de salida analógica a const int tonePin = 11; int sensorValue = 1; Float outputValue = 0; Float rawDirection = 0; Float maxSensorValue = 980.9999; Float 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 grados = 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, salida); / / Esto proporciona pulsos cortos de energía para el sensor del perno 12. pinMode (13, salida); pinMode (2, INPUT_PULLUP); digitalWrite (13, bajo); Serial.Begin(9600); mientras que (grado < 362) / ajustar todos los valores de 362 a cero. {addingDirection [grado] = 0; grados ++;} maxSensorValue = 984.9999; } void loop() {resetValues(); z = 0; n ++; sensorValue2 = 0; mientras que (z < 10) / / obtener 10 lecturas rápidas. {z ++; digitalWrite (12, HIGH); delay(5); / leer el análogo valor: sensorValue = analogRead(analogInPin); sensorValue2 = sensorValue2 + sensorValue; digitalWrite (12, bajo); delay(45);} Delay(500); poner este retraso tan total 500 = 1 segundo. sensorValue = (sensorValue2/z); asumir que la banda de muertos comienza a 356.5 y termina en 0 / / y valores de cero corresponden a 360 o 0 grados: / la máxima analógica leyendo me estoy poniendo en el limpiaparabrisas es 981 / y fuera de un rango posible de 1024 (10 bits) si (sensorValue == 0) {outputValue = 0;} outputValue = ((sensorValue-minSensorValue)*356.5/maxSensorValue)+1.75; selfCalibrate(); Comprueba el alcance de las lecturas de analoue cuando el sensor sale de banda muerta. / Y no cálculos de linealidad: / / asumen ahora que max no linealidad es a 240 grados y +0.53 / / además, asumen la no linealidad sí mismo es lineal, no una curva: Si (outputValue < 240 || outputValue == 240) {rawDirection = outputValue * 0,53 / 240 + outputValue;} si (outputValue > 240) {rawDirection = 0.53*(358-outputValue)/118 + outputValue;} si (sensorValue == minSensorValue) {rawDirection = 360;} / / Serial.print ("sensor ="); Serial.Print(sensorValue); Serial.Print ("\t salida ="); Serial.Print(outputValue,2); Serial.Print ("\t ajustar salida ="); Serial.Print(rawDirection,2); Serial.Print ("\t valor del sensor Max ="); Serial.Print(maxSensorValue,2); Serial.Print ("\t valor del sensor Min ="); Serial.Print(minSensorValue,2); Serial.Print ("\t n ="); Serial.println(n); digitalWrite (12, bajo); grado = (int) rawDirection; / Especial para rawDirection = 360: Si (rawDirection == 360) {título = 359 + c, c ++;} si (c > 2) {c = 0;} si (grado == 361) {grado = 1;} / / / / / calcular el modo de funcionamiento (algunas de estas variables necesita reajustarse mediante una llamada de procesador principal). addingDirection [grado] = addingDirection [grado] + 1; Si (addingDirection [grado] > modeSize) {modeSize = modeSize + 1; finalDirection = grado;} / / si (finalDirection == 359 || finalDirection == 360 || finalDirection == 1) {finalDirection = 360;} Serial.Print ("tamaño de modo ="); Serial.Print(modeSize); Serial.Print ("\t grado ="); Serial.Print(degree); Serial.Print ("\t modo Final dirección ="); Serial.Print(finalDirection); Serial.Print ("\t agregar dirección [grado] ="); Serial.println(addingDirection[degree]); Serial.println("");} 30 días = 2592000 segundos / cada bucle de n x 10 es diez segundos / / cada valor del sensor máximo diez segundos se reduce por 0.0001 / / cada valores del sensor máximo 30 días redujeron por 2592000 / 10 * 0.00001 = 25,92 grados / / en 3 días de vientos del norte valor sensor máximo se ajustará por tanto como 2,592 grados. Durante los vientos del norte el sensor será auto calibrar: void selfCalibrate() {si (sensorValue > maxSensorValue) {maxSensorValue = sensorValue; tone(11,1000,500);} si (sensorValue < minSensorValue) {minSensorValue = sensorValue; tone(11,2000,500);} si (((n>10) & &(sensorValue>900)) || ((n>10) & &(sensorValue<100))) Sólo ajuste el sensor max y min en un viento norte. {maxSensorValue = maxSensorValue - 0.01; / / lentamente tira hacia atrás máxima sensor valor. minSensorValue = minSensorValue + 0. 01; / / empuja lentamente hacia delante min sensor valor. n = 0;} } void resetValues() / / requiere un impulso de retroceso de llamada de 5 segundos para restablecer los valores de clave. {int callBack = digitalRead(2); if (callBack == baja) {digitalWrite (13, HIGH); modeSize = 0; tone(11,2500,500); mientras que (grado < 362) {addingDirection [grado] = 0; grados ++;}} else {digitalWrite (13, LOW);}}