Étape 5: Code
const int analogInPin = A0 ; Broche d’entrée analogique si le potentiomètre est fixé au const int analogOutPin = 9 ; Sorties analogiques broches que le LED est attaché à 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 ; degré d’int = 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 (sortie 12); / / cela fournit les courtes impulsions d’énergie du capteur de broche 12. pinMode (sortie 13); pinMode (2, INPUT_PULLUP); digitalWrite (13, faible) ; Serial.Begin(9600) ; tandis que (degré < 362) / / Set 362 toutes les valeurs à zéro. {addingDirection [degrés] = 0; degré ++;} maxSensorValue = 984.9999 ; } void loop() {resetValues(); z = 0; n ++; sensorValue2 = 0; while (z < 10) / / Get 10 lectures rapides. {z ++; digitalWrite (12, HIGH); delay(5); / / lecture de l’analogique en valeur : sensorValue = analogRead(analogInPin) ; sensorValue2 = sensorValue2 + sensorValue ; digitalWrite (12, LOW); delay(45);} Delay(500) ; Attribuez à ce retard donc total 500 = 1 seconde. sensorValue = (sensorValue2/z) ; Supposons que Deadband commence à 356,5 et se termine à 0 / / et de zéro correspondent à 360 ou 0 degrés: / / l’analogue maximale lecture je me fais sur l’essuie-glace est 981 / / un dépassement possible de 1024 (10 bits) si (sensorValue == 0) {outputValue = 0;} outputValue = ((sensorValue-minSensorValue)*356.5/maxSensorValue)+1.75 ; selfCalibrate() ; Vérifie la portée maximale des lectures analoue quand capteur sort de zone morte. / / Non calculs de linéarité: / / maintenant supposer que max non linéarité est à 240 degrés et +0.53 / / Supposons également que la non linéarité elle-même est linéaire, non pas une courbe : 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 ("capteur =") ; Serial.Print(sensorValue) ; Serial.Print ("\t sortie =") ; Serial.Print(outputValue,2) ; Serial.Print ("\t ajusté sortie =") ; Serial.Print(rawDirection,2) ; Serial.Print ("\t valeur capteur Max =") ; Serial.Print(maxSensorValue,2) ; Serial.Print ("\t valeur capteur Min =") ; Serial.Print(minSensorValue,2) ; Serial.Print ("\t n =") ; Serial.println(n) ; digitalWrite (12, faible) ; degré = (int) rawDirection ; / / Special affaire pour rawDirection = 360 : si (rawDirection == 360) {degré = 359 + c, c ++;} si (c > 2) {c = 0;} si (degré == 361) {degré = 1;} / / / / / calculer le mode en cours d’exécution (certaines de ces variables devront être réinitialisée par un appel retour de processeur principal)
. addingDirection [degrés] = addingDirection [degrés] + 1 ; Si (addingDirection [degrés] > modeSize) {modeSize = modeSize + 1; finalDirection = degré;} / / / si (finalDirection == 359 || finalDirection == 360 || finalDirection == 1) {finalDirection = 360;} Serial.Print ("taille Mode =") ; Serial.Print(modeSize) ; Serial.Print ("\t degré =") ; Serial.Print(degree) ; Serial.Print ("\t Mode Final Direction =") ; Serial.Print(finalDirection) ; Serial.Print ("\t ajout direction [degrés] =") ; Serial.println(addingDirection[degree]) ; Serial.println("");} 30 jours = 2592000 secondes / / chaque boucle de n x 10 est dix secondes / / chaque valeur de capteur max dix secondes est réduite de 0,0001 / / les valeurs de chaque 30 jours max capteur réduit par 2592000 / 10 * 0,00001 = 25,92 degrés / / dans les 3 jours de vents du Nord valeur max capteur ajustera par autant que 2,592 degrés. Pendant les vents du Nord, le capteur sera soi calibrer : 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))) Ne modifiez min et lectures de capteurs max dans un vent du Nord. {maxSensorValue = maxSensorValue - 0,01; / / lentement tire retour max capteur valeur. minSensorValue = minSensorValue + 0,01; / / lentement pousse vers l’avant du capteur valeur. n min = 0;} } void resetValues() / / nécessite une impulsion de retrait appel de 5 secondes pour réinitialiser les valeurs de clés. {Rappel int = digitalRead(2) ; if (rappel == faible) {digitalWrite (13, HIGH); modeSize = 0; tone(11,2500,500) ; tandis que (degré < 362) {addingDirection [degrés] = 0; degré ++;}} else {digitalWrite (13, LOW);}}