Fråga:
Returvärdet 0 om värdet är mindre än noll
TheAutomator
2016-03-02 09:46:37 UTC
view on stackexchange narkive permalink

Bakgrund: Jag använder en analog trycksensor med ett intervall från 0-100PSI returspänningsvärden .44v till 4.44v. Det är utomhus (eller 0 PSI) spänning på signalstiftet är 0,47 volt. Jag har en funktion som subtraherar den .47v (för att göra noll) och sedan multiplicerar den med 25 (25 PSI per volt). På grund av signalbrus eller andra faktorer returnerar min funktion ibland ett negativt tal, vilket gör kaos på min matematik. Jag skulle vilja returnera värdet 0 när min förskjutna matematik returnerar ett negativt tal, men jag har problem med det.

Koden som jag skrev som inte fungerar:

  dubbel EngineOilPressure () {// infoga oljetryckkod här intavläsning = analogRead (sensorPin3); flottörspänning = avläsning * 5,0; spänning /=1024.0; Serial.print (spänning); Serial.println ("volt"); if (spänning-.47 < 0) {float voltadj = 0; } annat {float voltadj = (voltage-.47); } flyttryckP = voltadj * 25; returnera PSIToPascal (pressureP);}  

Felet som jag får är

  dynamic_engine.pde: I funktion 'double EngineOilPressure ()': dynamic_engine.pde : 41: 23: fel: 'voltadj' förklarades inte i detta omfång Felkompilering.  

Koden som fungerar men ibland returnerar ett mycket fel värde:

  dubbel EngineOilPressure () {int-läsning = analogRead (sensorPin3); flottörspänning = avläsning * 5,0; spänning /=1024.0; Serial.print (spänning); Serial.println ("volt"); flottörtryckP = (spänning - .47) * 25; returnera PSIToPascal (pressureP);}  
Tre svar:
James Waldby - jwpat7
2016-03-02 09:55:13 UTC
view on stackexchange narkive permalink

Omfattningen av var och en av de två olika och orelaterade voltadj -variablerna som din kod (som nedan) förklarar är begränsad till inom dess bifogade uppsättning hängslen.

  if (voltage-.47 < 0) {float voltadj = 0;} else {float voltadj = (voltage-.47);}  

I stället kanske säg

  float voltadj = voltage-.47; if (voltadj < 0) voltadj = 0;  

eller kanske

  float voltadj = voltage <. 47? 0: spänning-.47;  

eller

  float voltadj = constrain (spänning-0,47, 0,0, 5,0);  

eller

  float voltadj = max (0,0, voltage-0,47);  

Se även max () och begränsa () referenssidor på arduino.cc.

Majenko
2016-03-02 16:57:03 UTC
view on stackexchange narkive permalink

En annan metod, även om den är ganska kryptisk att förstå, skulle vara:

  flyttryckP = spänning > 0,47? (spänning - 0.47) * 25: 0;  

Det är känt (åtminstone av mig) som en inline villkorad . ? fungerar som en if -operatör och : som en annan. I grund och botten står det:

  Spänningen är större än 0,47 Är det sant? subtrahera sedan 0,47 och multiplicera med 25 och tilldela det på annat sätt: tilldela 0  

Formatet är helt enkelt:

  värde = {villkor}? {sant värde eller uttryck}: {falskt värde eller uttryck};  

Om kan vara ganska användbart när du vill beräkna eller tilldela något villkorligt. @ jwpat7 nämner en funktion max () ovan. Att max () -funktionen själv kan skrivas med det här inline villkorliga formatet:

  maxval = a > b? a: b;  

Eller: Om a är större än b , tilldela a annars tilldela b .

Det här är det jag slutade använda, tack! Jag älskar enkelheten.
jantje
2016-03-02 19:19:26 UTC
view on stackexchange narkive permalink

Arduino-sättet är att använda begränsning

  flyttryckP = begränsning ((spänning - 0,47) * 25, 0 [Det maximala som din kod klarar]) ;  

Detta returnerar värdet ((spänning - 0,47) * 25) men aldrig mindre än 0 och aldrig mer än Det maximala du anger.



Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...