大規模な算術を正しく処理する方法

単純な答えが必要な質問です。 arduinoで多数の算術ステップを効率的かつ正確に処理するにはどうすればよいですか?

たとえば、私はこのコード機能のセットアップを持っています:

void calc() {
  batterymoment = input*batterymass;
  totalmoment = 149650+batterymoment;
  buoyancymoment = buoyancymass*centrebuoyancy;
  wheelmoment = totalmoment - buoyancymoment;
  wheelweight = totalmass - buoyancymass;
  cgwheels = wheelmoment/wheelweight;
  maindistance = mainarm - wheelweight;
  nosedistance = wheelweight - nosearm;
  mainmass = (((wheelweight)*(1-((maindistance)/(maindistance+nosedistance))))/2);
  nosemass = (((wheelweight)*(1-((nosedistance)/(nosedistance+maindistance))))/2);
  mainmoment = mainmass*mainarm;
  nosemoment = nosemass*nosearm;
  netmoment = buoyancymoment+mainmoment+nosemoment;
  netcg = netmoment/totalmass;
  staticmargin = adc - netcg;
  answer = staticmargin/meanadc;

}

今私は、これらの変数すべてのデータ型を適切にセットアップしました。これらはfloat、int、およびlongの組み合わせです。私はそれがデータ型の問題だとは思わない。私がシリアルで最終回答を印刷するときに得られるのは、ユーザーが入力した入力に関係なく同じ数字です。

私は、各行をステップごとに実行し、次の算術ラインに進む前に答えを検証するような方法でコードをフォーマットする必要があると推測しています。もしそうなら、各算術ステップに関数が必要ですか?または、これを処理するための簡単な方法があります。

どんな指導も高く評価されます。ありがとう。

コード全体は次のとおりです。

unsigned long batterymoment,num1,num2,input,totalmoment;
double buoyancymoment,wheelmoment,cgwheels,mainmass,nosemass,maindistance,nosedistance;
double mainmoment,nosemoment,netmoment,netcg,staticmargin,answer;
double centrebuoyancy = 14.164;
double mainarm = 14.3;
double adc = 11.4;
double meanadc = 22.65;
double nosearm = 1.8;
int totalmass = 12404;
int batterymass = 720;
int buoyancymass = 4401;
int batteryposition,wheelweight;
boolean mySwitch = false;

void calc() {
  batterymoment = input*batterymass;
  totalmoment = 149650+batterymoment;
  buoyancymoment = buoyancymass*centrebuoyancy;
  wheelmoment = totalmoment - buoyancymoment;
  wheelweight = totalmass - buoyancymass;
  cgwheels = wheelmoment/wheelweight;
  maindistance = mainarm - wheelweight;
  nosedistance = wheelweight - nosearm;
  mainmass = (((wheelweight)*(1-((maindistance)/(maindistance+nosedistance))))/2);
  nosemass = (((wheelweight)*(1-((nosedistance)/(nosedistance+maindistance))))/2);
  mainmoment = mainmass*mainarm;
  nosemoment = nosemass*nosearm;
  netmoment = buoyancymoment+mainmoment+nosemoment;
  netcg = netmoment/totalmass;
  staticmargin = adc - netcg;
  answer = staticmargin/meanadc;  
 }

void setup() {
  Serial.begin(9600);
  num1=0;
  num2=0;
  Serial.println("Enter battery position");
 }

void loop() {
  while (Serial.available()){
    batteryposition = Serial.read();
    if(batteryposition>47 && batteryposition<58){  
      if(!mySwitch){
         num1=(num1*10)+(batteryposition-48);
      }else{
         num2=(num2*10)+(batteryposition-48);
        }
       }

if(batteryposition==61){
  input=num1+num2;
  calc();
  Serial.print("Static margin is: ");
  Serial.println(answer);
  num1=0;
  num1=0;
  mySwitch=false;
  }
 }
}

したがって、ユーザーの入力に応じて、計算によって最終出力の回答が変更されます。たとえば、5を入力する必要がある場合、出力はExcelでの計算に基づいて-4.22になります。

0
宣言、実際の結果、期待される結果を表示してください。いくつか余分なSerial.print( "答え:"); Serial.println(答え);問題を特定するのに役立つコードをデバッグしてください。
追加された 著者 Dave X,
そしてそれは何を印刷しますか?私は "入力= 5;" calc()の前のコードで、そして予期しないことがあるまでcalc()でdifftデバッグ印刷を試してください。
追加された 著者 Dave X,
繰り返しますが、num1を2回クリアするか、処理後にnum2をクリアするつもりですか?
追加された 著者 Dave X,
私が有用だと分かっているのは、スプレッドシートや小さなコンソールアプリケーション(それほど複雑ではない)で複雑なアルゴリズムをテストすることです。私はそれらを働かせて、私はArduinoコードに変換しますが、これはかなり簡単です。これはバグのないコードの保証ではありませんが、かなり近いです。
追加された 著者 Nayt Grochowski,
@DaveXの入力に関係なく-113.70を出力します
追加された 著者 TestOChangeO,

2 答え

それは計算されている値なので、毎回同じ値を得ています。

私はあなたがあなたの数式をどのように実装したかに何か間違っていると思います。あなたが "answer ="から始まり、それらの変数を構成する数式または値で変数を繰り返し代入すると、次のようになります:

(14.3 - (12404 - 4401))+(11.4 - ((4401 * 14.164)+(((12404-4401) (12404 - 4401 - 1.8)/((12404 - 4401 - 1.8)+(14.3 - (12404~4401))))))/ 2)* 1.8))/ 12404))/ 22.65

それについて何も変わりはありません。

あなたの入力値は batterymoment の計算に使用されています。 totalmoment の計算には batterymoment を使用します。 wheelmoment の計算に totalmoment が使用されています。 wheelmomentcgwheels の計算に使用されています。 cgwheels は一切使用されません

3
追加された

あなたのコメントによると、calc()関数は期待どおりに動作していません。

calc()を次のように変更します。

void calc() {
  Serial.print("input:");Serial.println(input);
  batterymoment = input*batterymass;
  totalmoment = 149650+batterymoment;
  buoyancymoment = buoyancymass*centrebuoyancy;
  wheelmoment = totalmoment - buoyancymoment;
  wheelweight = totalmass - buoyancymass;
  cgwheels = wheelmoment/wheelweight;
  maindistance = mainarm - wheelweight;
  nosedistance = wheelweight - nosearm;
  mainmass = (((wheelweight)*(1-((maindistance)/(maindistance+nosedistance))))/2);
  nosemass = (((wheelweight)*(1-((nosedistance)/(nosedistance+maindistance))))/2);
  mainmoment = mainmass*mainarm;
  nosemoment = nosemass*nosearm;
  netmoment = buoyancymoment+mainmoment+nosemoment;
  netcg = netmoment/totalmass;
  staticmargin = adc - netcg;
  answer = staticmargin/meanadc;
  Serial.print("answer:");Serial.println(answer);  
 }

期待どおりの入力が得られ、期待通りに動作するかどうかを確認します。次に、不一致を発見するまで、デバッグ・ステートメントをインプロセスで追加します。

私はより多くの関数、あるいは一連のよりよく定義された関数に戻って個別にテストしたいと思います。

コードには、グローバル変数、シリアル解析、および計算の間の相互作用があります。それを別個の部分に分割すると、問題のある箇所を特定できます。

0
追加された