Stap 10: Stap 9: waarbij de resultaten
Ik plaatste de resultaten in een tabel en een grafiek van deze resultaten uitgezet. Ik omvatte ook een exponentiële trendlijn. Als u de grafiek toonde ik in een laatste stap, u kunt zien het is vrij gelijkaardig, excel staat niet toe dat het plotten van 1 / x grafieken!
Nu, door te kijken naar de wiskundige functies dat de Arduino kan doen beperkt ons een beetje aan hoe we deze resultaten kunt linearize. Door te spelen rond met de functies in excel zal ons helpen vinden van de geschikte een, maar aangezien de exponentiële trendlijn past, vond ik dat het alleen wenselijk is om te doen de inverse van een exponent (exponent is gelijk aan e ^ x), de inverse is gelijk aan de natuurlijke logaritme (bekend als ln) van x. Door te doen het omgekeerde exponent, de resultaten zullen veel meer lineaire en de Arduino laat deze functie. Als u deze grafiek uitzetten, u zal zitten kundig voor toepassing van een lineaire trendlijn en hebben een heel acceptabel R ^ 2 waarde.
Nu dat u de resultaten hebben linearized, moet u het verloop omkeren. Momenteel, als afstand daalt, stijgt spanning. Dit is niet een levensvatbare vorm van meting zoals men van een waarde verwachten zou te verlagen als de spanning verhoogd!
De eenvoudigste manier om dit te doen zou zijn om de resultaten van het logboek omkeren door te vermenigvuldigen met min 1. Dit zal dan het omkeren van het verloop en de resulterende waarde zal toenemen naarmate de afstand toeneemt!
Het volgende deel is het toepassen van een relatie tussen deze waarden en de afstand. Ten eerste, wilt u de waarde op 0 afstand nul te zijn. U dit doen door het logboek van uw grootste experimenteel gevonden spanning en dit toe te voegen aan alle waarden.
Vervolgens krijgt u een resultaat dat het kleinste spanning de grootste waarde geeft en de grootste spanning dan een waarde van 0 geeft.
Nu heb je een lineaire functie die de niet lineaire spanning converteert. Alles wat u nu hoeft te doen is dit toewijzen aan de gelijkwaardige afstand, bijvoorbeeld de grootste waarde die je berekend moet gelijk zijn aan de afstand die je gemeten (voor die waarde, zijn verwarrend ik weet!). Voor deze laatste stap, alles wat je hoeft te doen is vermenigvuldigen door de grootste afstand gemeten verdeeld door de genormaliseerde resultaat en zul je een functie die je een succesvolle afstand lezing geeft! Merk op dat als u een van de parameters van het circuit wijzigen of aanpassen van de temperatuur, dit zal veranderen! Dus waarom zijn slechts eenvoudig.
Dit zal maken veel meer zin zodra u de code leest, eerlijk!
De nieuwe code is:
int Readvalue; De aanvankelijk lees waarde
int Printvalue; De waarde afgedrukt op het scherm
float Mathvalue; De variabele die wordt gebruikt voor elke vorm van wiskunde
zweven Normalize_constant = 0,47; De variabelen die ik berekend op basis van mijn resultaten
zweven Scale_constant = 3,34; Hetzelfde als hierboven!
VOID Setup {}
Serial.begin(9600); Seriële communicatie met computer 9600 bps beginnen
}
void loop {}
Readvalue = analogRead (A0) + 1; Lees de infrarood Bereikindicatie input, voeg 1 om ervoor te zorgen dat de lezing nooit gelijk is aan nul of u vreemde wiskunde resultaten krijgt!
Mathvalue = log(Readvalue) //Apply het logboek van de lees waarde
Mathvalue = Mathvalue *-1 //Invert de log-waarden
Mathvalue = Mathvalue + Normalize_constant //Normalize de resultaten, mijn constante normaliseren was gelijk is aan LN(1.6) zoals berekend van mijn resultaten. Jou zal variëren!
Mathvalue = Mathvalue * Scale_constant //Multiply door de constante schaal om ervoor te zorgen dat de afstand gemeten hetzelfde als de waarden is.
Serial.println(Mathvalue); De waarde van de laatste wiskunde naar de seriële monitor afdrukken
delay(50); Vertraging voor 50 MS dat niet vullen de seriële buffer
}