Hur/vart skriver jag in en formel i Arduino sketch

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Dioden
Inlägg: 18
Blev medlem: 6 september 2011, 13:13:02
Ort: Östersund

Hur/vart skriver jag in en formel i Arduino sketch

Inlägg 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
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

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

Inlägg 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.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

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

Inlägg 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
Användarvisningsbild
hcb
Moderator
Inlägg: 5739
Blev medlem: 23 februari 2007, 21:44:50
Skype: hcbecker
Ort: Lystrup / Uppsala
Kontakt:

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

Inlägg av hcb »

"kPa-1" är enheten för konstanten: kPa^-1 eller 1/kPa.
Användarvisningsbild
ffredrik
Inlägg: 340
Blev medlem: 20 oktober 2009, 17:52:18
Ort: Göinge

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

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg 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.
Dioden
Inlägg: 18
Blev medlem: 6 september 2011, 13:13:02
Ort: Östersund

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

Inlägg 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?
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
ffredrik
Inlägg: 340
Blev medlem: 20 oktober 2009, 17:52:18
Ort: Göinge

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

Inlägg av ffredrik »

I värdena för C0 och C1 har du decimalkomma i st f decimalpunkt!
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

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

Inlägg 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. :)
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg av TomasL »

Jodå, preprocessorn utför viss heltalsaretmetik, det går faktisk att skriva hela program med enbart preprocessorn.
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

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

Inlägg 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.
Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

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

Inlägg 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.
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

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

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

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

Inlägg 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.
Dioden
Inlägg: 18
Blev medlem: 6 september 2011, 13:13:02
Ort: Östersund

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

Inlägg 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?
Skriv svar