Question:
Valeur de retour de 0 si la valeur est inférieure à zéro
TheAutomator
2016-03-02 09:46:37 UTC
view on stackexchange narkive permalink

Contexte: J'utilise un capteur de pression analogique avec une plage de 0-100PSI renvoyant des valeurs de tension de .44v à 4,44v. Sa tension à l'air libre (ou 0 PSI) sur la broche de signal est de 0,47 volts. J'ai une fonction qui soustrait ce .47v (pour faire zéro), puis le multiplie par 25 (25 PSI par volt). En raison du bruit du signal ou d'autres facteurs, ma fonction renvoie parfois un nombre négatif, ce qui nuit à mes calculs. Je voudrais renvoyer une valeur de 0 lorsque mon calcul de décalage renvoie un nombre négatif, mais j'ai un problème avec cela.

Le code que j'ai écrit qui ne fonctionne pas:

  double EngineOilPressure () {// insérer le code de pression d'huile ici int reading = analogRead (sensorPin3); tension flottante = lecture * 5,0; tension /=1024,0; Serial.print (tension); Serial.println ("volts"); if (tension-.47 < 0) {float voltadj = 0; } else {float voltadj = (tension-.47); } pression du flotteur P = voltadj * 25; return PSIToPascal (pressureP);}  

L'erreur que j'obtiens est

  dynamic_engine.pde: Dans la fonction 'double EngineOilPressure ()': dynamic_engine.pde : 41: 23: erreur: 'voltadj' n'a pas été déclaré dans cette portéeErreur de compilation.  

Le code qui fonctionne mais renvoie parfois une valeur très fausse:

  double EngineOilPressure () {int reading = analogRead (sensorPin3); tension flottante = lecture * 5,0; tension /=1024,0; Serial.print (tension); Serial.println ("volts"); pression de flotteur P = (tension - 0,47) * 25; return PSIToPascal (pressureP);}  
Trois réponses:
James Waldby - jwpat7
2016-03-02 09:55:13 UTC
view on stackexchange narkive permalink

La portée de chacune des deux variables voltadj différentes et non liées que votre code (comme ci-dessous) déclare est limitée à son ensemble d'accolades.

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

Au lieu de cela, dites peut-être

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

ou peut-être

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

ou

  float voltadj = constrain (voltage-0.47, 0.0, 5.0);  

ou

  float voltadj = max (0.0, voltage-0.47);  

Voir aussi max () et constrain () pages de référence sur arduino.cc.

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

Une autre méthode, même si elle est assez cryptique à comprendre, serait:

  float pressureP = voltage > 0.47? (tension - 0,47) * 25: 0;  

Cela est connu (au moins par moi) comme un conditionnel en ligne . Le ? agit comme un opérateur if , et le : comme un else. En gros, il dit:

  La tension est supérieure à 0,47 Est-ce vrai? puis soustrayez 0,47 et multipliez par 25 et attribuez-le autrement: attribuez 0  

Le format est simplement:

  value = {condition}? {valeur ou expression vraie}: {valeur ou expression fausse};  

If peut être très utile lorsque vous souhaitez calculer ou attribuer conditionnellement quelque chose. @ jwpat7 fait mention d'une fonction max () ci-dessus. Cette fonction max () peut elle-même être écrite avec ce format conditionnel en ligne:

  maxval = a > b? a: b;  

Ou: Si a est supérieur à b alors attribuez a sinon attribuez b .

C'est celui que j'ai fini par utiliser, merci! J'adore la simplicité.
jantje
2016-03-02 19:19:26 UTC
view on stackexchange narkive permalink

La méthode Arduino consiste à utiliser contrainte

  float pressureP = constrain ((voltage - 0.47) * 25, 0 [The Maximum your code can handle]) ;  

Cela renverra la valeur ((voltage - 0.47) * 25) mais jamais inférieure à 0 et jamais supérieure au maximum que vous fournissez.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...