Sida 1 av 2

Hur/vart skriver jag in en formel i Arduino sketch

Postat: 19 februari 2017, 22:43:52
av Dioden
Hej!

Jag håller på och lär mig Arduino UNO och tänkte prova att använda mig av en tryckgivare och sedan få värdet visat på en LCD skärm.

Nu har jag kommit så långt att jag har kopplat in tryckgivaren till Arduinot analog ingång och kan se givarens output i volt, men sedan ska det värdet "gå igenom" en formel för att visa trycket i kPa som är enligt följande
fomel: Uout= (c1*pabs+c0)*US .

Uout= signal output voltage in V (Visas i Arduino)
US = supply voltage in V (5?)
pabs= absolute pressure in kPa (X)
c0 = 15/550 (0,0272727272727273)
c1 = 0.8/550 kPa-1 (0,0014545454545455)

Denna formel tar ju hänsyn till givarens matningsspänning och behöver man "övervaka" den eller är Arduino exakt på att leverera 5V?
så man kan sätta den som en konstant på 5?

Jag har använt mig av Read Analog Voltage från Arduinos hemsida som jag förhoppningsvis lyckats bifoga en bild på :)
Analog_voltage.jpg
Så min fråga är hur och vart kan jag väva in formeln i sketchen?
Och även -1 som står efter kPa vet jag inte riktigt vad den betyder

Jag hoppas någon begrep vad jag ville ha sagt :D

Tack på förhand //Kristoffer

Re: Hur/vart skriver jag in en formel i Arduino sketch

Postat: 20 februari 2017, 07:05:41
av Klas-Kenny

Kod: Markera allt

//någonstans innan setup()
#define C0 0.8/550.0
#define C1 15.0/550.0
#define US 5.0

//Efter raden float voltage =...
float pressure = ((voltage/US)-C0)/C1;
Serial.println(pressure);
Med reservation för slarvfel, från telefonen vid frukostbordet. :)

Att övervaka 5V matningen är inte helt självklart, då måste du ha en annan spänningsreferens för Arduinon och sådär. Du kan nog förutsätta att du har 5V i det här fallet.

Re: Hur/vart skriver jag in en formel i Arduino sketch

Postat: 20 februari 2017, 07:37:07
av Micke_s
Finns ett trick att mäta matspänningen indirekt, man mäter den interna 1.1v ref där adc använder vcc som referens.

https://code.google.com/archive/p/tinke ... meter.wiki

Re: Hur/vart skriver jag in en formel i Arduino sketch

Postat: 20 februari 2017, 07:49:31
av hcb
"kPa-1" är enheten för konstanten: kPa^-1 eller 1/kPa.

Re: Hur/vart skriver jag in en formel i Arduino sketch

Postat: 20 februari 2017, 08:43:53
av ffredrik
Skriv alltid #define-värde inom () :

Kod: Markera allt

#define C0 (0.8/550.0)
#define C1 (15.0/550.0)
annars blir det fel senare i beräkningen.

Re: Hur/vart skriver jag in en formel i Arduino sketch

Postat: 20 februari 2017, 08:58:49
av TomasL
Ja, annars försöker väl preprocessorn utföra divisionen, och mig veterligen kan preprocessorn bara utföra heltalsaritmetik.

Personligen gillar jag inte sådana makron, bättre att skriva in det hela direkt i koden.
Sedan kanske man skulle beräkna konstanterna innan, då det blir rätt tidsödande för en enkel 8-bitare att fixa till divisionerna.
Jag skulle nog dessutom försöka räkna om det så det blev heltalsaritmetik i stället.

Re: Hur/vart skriver jag in en formel i Arduino sketch

Postat: 20 februari 2017, 11:27:06
av Dioden
Tack för alla snabba svar!

Jag skrev sketchen så här:
Analog_voltage2.jpg
Men det som händer är att i seriell monitor visar den -14,72 hela tiden och det värdet ändras inte när trycket ökar.

Som jag får till det så blir det ett minus värde när man räknar formeln utan parenteser, jag försökte även att parentesa voltage/US alltså "(((voltage/US)-C0)/C1);"
utan att det blev någon skillnad.

Och även denna lösning utan någon skillnad
Analog_voltage3.jpg

Så vad kan vara bekymmret här?

Re: Hur/vart skriver jag in en formel i Arduino sketch

Postat: 20 februari 2017, 11:32:03
av ffredrik
I värdena för C0 och C1 har du decimalkomma i st f decimalpunkt!

Re: Hur/vart skriver jag in en formel i Arduino sketch

Postat: 20 februari 2017, 11:46:35
av Mr Andersson
TomasL skrev:Ja, annars försöker väl preprocessorn utföra divisionen, och mig veterligen kan preprocessorn bara utföra heltalsaritmetik.

Personligen gillar jag inte sådana makron, bättre att skriva in det hela direkt i koden.
Sedan kanske man skulle beräkna konstanterna innan, då det blir rätt tidsödande för en enkel 8-bitare att fixa till divisionerna.
Jag skulle nog dessutom försöka räkna om det så det blev heltalsaritmetik i stället.
Nä #define utför bara textsubstitution. Problemet är att division inte är associativ.
(x/15.0)/550.0 ger inte samma resultat som x/(15.0/550.0)

Men jag håller definitivt med om att förberäkna konstanter.
Dessutom kan man förenkla formeln till 137.5 * Vin - 18.75 om man antar att givaren och arduinon matas med samma spänning. Dvs. det spelar ingen roll vad den faktiska spänningen är, man får alltid samma resultat så länge givarens US och arduinons Vref är lika.
Det skulle säkert också gå att ändra formeln till att använda heltal och adc-värdet (0-1023) direkt men det orkar jag inte försöka. :)

Re: Hur/vart skriver jag in en formel i Arduino sketch

Postat: 20 februari 2017, 11:51:07
av TomasL
Jodå, preprocessorn utför viss heltalsaretmetik, det går faktisk att skriva hela program med enbart preprocessorn.

Re: Hur/vart skriver jag in en formel i Arduino sketch

Postat: 20 februari 2017, 12:12:39
av Mr Andersson
Jo jag vet att den kan beräkna heltal, men inte specifikt med #define. Men t.ex. #if gör det.
Ta t.ex.

Kod: Markera allt

#define ONEPLUSONE 1+1
int main()
{
#if ONEPLUSONE == 2
	return ONEPLUSONE;
#else
	return 0;
#endif
}
så blir resultatet return 1+1; efter preprocessorn. Sen kommer förmodligen kompilatorn att optimera det till return 2.
Blir det något annat så är det icke-standard.

Re: Hur/vart skriver jag in en formel i Arduino sketch

Postat: 20 februari 2017, 14:47:09
av Jan Almqvist
Dioden skrev: Så vad kan vara bekymmret här?
Jag kan tänka mej att denna konstruktion gör att du tappar all (?) noggrannet eftersom variabeln sensorValue är ett heltal.

Kod: Markera allt

int sensorValue = analogRead(A0);
.
.
.
float voltage = sensorValue * (5.0 / 1023.0);
Resultatet kan bli ett annat om du stoppar in sensorValue i ett flyttal innan du multiplicerar och dividerar.

Re: Hur/vart skriver jag in en formel i Arduino sketch

Postat: 20 februari 2017, 17:39:26
av Mr Andersson
analogRead() ger ett heltal mellan 0 och 1023. Att multiplicera ett heltal med ett flyttal ger automatisk cast till flyttal. Problem är som tidigare nämnts komma istället för punkt i konstanterna.

Re: Hur/vart skriver jag in en formel i Arduino sketch

Postat: 20 februari 2017, 20:48:35
av TomasL
Vill du ha en troligen snabbare rutin som inte använder flyttal, så:


P=(5500xCNT+153450) högerskifta sedan 13 gånger.
Där CNT är värdet från AD-Omvandlaren (förutsätter att det är en 10 bitars med 1023 som maxvärde)
Använder max 32 bitar.

Och jo, du matar givaren med samma spänning som AD-omvandlaren.

Re: Hur/vart skriver jag in en formel i Arduino sketch

Postat: 20 februari 2017, 23:02:48
av Dioden
Helt klart så var det mina ,, som skulle bort och bytas ut mot decimalpunkt, och då fungerade allt som det skulle :D

Jag skrev också ut givarens output värde samtidigt i monitorn och då kan samma spänningsvärde resultera i olika tryck (om än mycket små skillnader), är det för att den läser mer än två decimaler men visar endast två, så att spänningen varierar men den skriver inte ut det?